• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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