1 /* 2 * Copyright (c) 2022-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef RS_VK_IMAGE_MANAGER_H 17 #define RS_VK_IMAGE_MANAGER_H 18 19 #include <memory> 20 #include <mutex> 21 #include <queue> 22 #include <unordered_map> 23 24 #include "rs_image_manager.h" 25 26 #include "common/rs_common_def.h" 27 #include "draw/surface.h" 28 #include "native_window.h" 29 #include "pipeline/render_thread/rs_base_render_util.h" 30 #include "platform/ohos/backend/native_buffer_utils.h" 31 #include "platform/ohos/backend/rs_vulkan_context.h" 32 #include "surface.h" 33 #include "sync_fence.h" 34 #include "vulkan/vulkan_core.h" 35 36 namespace OHOS { 37 namespace Rosen { 38 39 class VkImageResource { 40 public: 41 static std::shared_ptr<VkImageResource> Create(sptr<OHOS::SurfaceBuffer> buffer); 42 VkImageResource(NativeWindowBuffer * nativeWindowBuffer,Drawing::BackendTexture backendTexture,NativeBufferUtils::VulkanCleanupHelper * vulkanCleanupHelper)43 VkImageResource(NativeWindowBuffer* nativeWindowBuffer, Drawing::BackendTexture backendTexture, 44 NativeBufferUtils::VulkanCleanupHelper* vulkanCleanupHelper) 45 : mNativeWindowBuffer(nativeWindowBuffer), mBackendTexture_(backendTexture), 46 mVulkanCleanupHelper(vulkanCleanupHelper) {} 47 ~VkImageResource(); 48 GetBackendTexture()49 const Drawing::BackendTexture& GetBackendTexture() const 50 { 51 return mBackendTexture_; 52 } 53 RefCleanupHelper()54 NativeBufferUtils::VulkanCleanupHelper* RefCleanupHelper() 55 { 56 return mVulkanCleanupHelper->Ref(); 57 } 58 GetThreadIndex()59 pid_t GetThreadIndex() const 60 { 61 return threadIndex_; 62 } 63 64 void SetThreadIndex(const pid_t threadIndex = UNI_RENDER_THREAD_INDEX) 65 { 66 threadIndex_ = threadIndex; 67 } 68 SetBufferDeleteFromCacheFlag(const bool & flag)69 void SetBufferDeleteFromCacheFlag(const bool& flag) 70 { 71 isBufferDeleteFromCache = flag; 72 } 73 GetBufferDeleteFromCacheFlag()74 bool GetBufferDeleteFromCacheFlag() const 75 { 76 return isBufferDeleteFromCache; 77 } 78 79 private: 80 NativeWindowBuffer* mNativeWindowBuffer; 81 Drawing::BackendTexture mBackendTexture_; 82 NativeBufferUtils::VulkanCleanupHelper* mVulkanCleanupHelper; 83 pid_t threadIndex_ = UNI_RENDER_THREAD_INDEX; 84 bool isBufferDeleteFromCache = false; 85 }; 86 87 class RSVkImageManager : public RSImageManager { 88 public: 89 RSVkImageManager() = default; 90 ~RSVkImageManager() noexcept override = default; 91 92 void UnMapImageFromSurfaceBuffer(int32_t seqNum) override; 93 std::shared_ptr<Drawing::Image> CreateImageFromBuffer( 94 RSPaintFilterCanvas& canvas, const BufferDrawParam& params, 95 const std::shared_ptr<Drawing::ColorSpace>& drawingColorSpace) override; 96 std::shared_ptr<Drawing::Image> GetIntersectImage(Drawing::RectI& imgCutRect, 97 const std::shared_ptr<Drawing::GPUContext>& context, const sptr<OHOS::SurfaceBuffer>& buffer, 98 const sptr<SyncFence>& acquireFence, pid_t threadIndex = 0) override; 99 100 void DumpVkImageInfo(std::string &dumpString) override; 101 private: 102 std::shared_ptr<VkImageResource> MapVkImageFromSurfaceBuffer( 103 const sptr<OHOS::SurfaceBuffer>& buffer, const sptr<SyncFence>& acquireFence, 104 pid_t threadIndex, Drawing::Surface *drawingSurface = nullptr); 105 std::shared_ptr<VkImageResource> CreateImageCacheFromBuffer(const sptr<OHOS::SurfaceBuffer> buffer, 106 const sptr<SyncFence>& acquireFence) ; 107 std::shared_ptr<VkImageResource> NewImageCacheFromBuffer( 108 const sptr<OHOS::SurfaceBuffer>& buffer, pid_t threadIndex, bool isProtectedCondition); 109 bool WaitVKSemaphore(Drawing::Surface *drawingSurface, const sptr<SyncFence>& acquireFence); 110 111 std::unordered_map<int32_t, std::shared_ptr<VkImageResource>> imageCacheSeqs_; // guarded by opMutex_ 112 }; 113 114 } // namespace Rosen 115 } // namespace OHOS 116 #endif // RS_VK_IMAGE_MANAGER_H