1 /*
2  * Copyright (c) 2024 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 RENDER_RENDER__NODE_DATA__RENDER_DATA_STORE_DEFAULT_STAGING_H
17 #define RENDER_RENDER__NODE_DATA__RENDER_DATA_STORE_DEFAULT_STAGING_H
18 
19 #include <cstdint>
20 #include <mutex>
21 
22 #include <base/containers/vector.h>
23 #include <base/util/uid.h>
24 #include <render/datastore/intf_render_data_store_default_staging.h>
25 #include <render/namespace.h>
26 #include <render/resource_handle.h>
27 
28 #include "device/gpu_resource_manager.h"
29 
30 RENDER_BEGIN_NAMESPACE()
31 class IRenderContext;
32 
33 struct DirectDataCopyOnCpu {
34     RenderHandleReference dstHandle;
35     BufferCopy bufferCopy;
36     BASE_NS::vector<uint8_t> data;
37 };
38 struct StagingDirectDataCopyConsumeStruct {
39     BASE_NS::vector<DirectDataCopyOnCpu> dataCopies;
40 };
41 
42 struct ImageClearCommand {
43     RenderHandleReference handle;
44     ClearColorValue color;
45 };
46 struct StagingImageClearConsumeStruct {
47     BASE_NS::vector<ImageClearCommand> clears;
48 };
49 
50 /**
51 RenderDataStoreDefaultStaging implementation.
52 */
53 class RenderDataStoreDefaultStaging final : public IRenderDataStoreDefaultStaging {
54 public:
55     RenderDataStoreDefaultStaging(IRenderContext& renderContext, const BASE_NS::string_view name);
56     ~RenderDataStoreDefaultStaging() override;
57 
CommitFrameData()58     void CommitFrameData() override {};
59     void PreRender() override;
60     void PostRender() override;
PreRenderBackend()61     void PreRenderBackend() override {};
PostRenderBackend()62     void PostRenderBackend() override {};
63     void Clear() override;
GetFlags()64     uint32_t GetFlags() const override
65     {
66         return 0;
67     };
68 
69     void CopyDataToBuffer(const BASE_NS::array_view<const uint8_t>& data, const RenderHandleReference& dstHandle,
70         const BufferCopy& bufferCopy) override;
71     void CopyDataToBufferOnCpu(const BASE_NS::array_view<const uint8_t>& data, const RenderHandleReference& dstHandle,
72         const BufferCopy& bufferCopy) override;
73 
74     void CopyDataToImage(const BASE_NS::array_view<const uint8_t>& data, const RenderHandleReference& dstHandle,
75         const BufferImageCopy& bufferImageCopy) override;
76 
77     void CopyBufferToBuffer(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
78         const BufferCopy& bufferCopy) override;
79 
80     void CopyBufferToImage(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
81         const BufferImageCopy& bufferImageCopy) override;
82 
83     void CopyImageToBuffer(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
84         const BufferImageCopy& bufferImageCopy) override;
85 
86     void CopyBufferToImage(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
87         BASE_NS::array_view<const BufferImageCopy> bufferImageCopies) override;
88 
89     void CopyImageToImage(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
90         const ImageCopy& imageCopy) override;
91 
92     void ClearColorImage(const RenderHandleReference& handle, const ClearColorValue color) override;
93 
94     void CopyImageToBuffer(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
95         const BufferImageCopy& bufferImageCopy, const ResourceCopyInfo copyInfo) override;
96     void CopyImageToImage(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
97         const ImageCopy& imageCopy, const ResourceCopyInfo copyInfo) override;
98     void CopyBufferToBuffer(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
99         const BufferCopy& bufferCopy, const ResourceCopyInfo copyInfo) override;
100     void CopyBufferToImage(const RenderHandleReference& srcHandle, const RenderHandleReference& dstHandle,
101         const BufferImageCopy& bufferImageCopy, const ResourceCopyInfo copyInfo) override;
102 
103     bool HasBeginStagingData() const;
104     bool HasEndStagingData() const;
105     StagingConsumeStruct ConsumeBeginStagingData();
106     StagingDirectDataCopyConsumeStruct ConsumeBeginStagingDirectDataCopy();
107     StagingImageClearConsumeStruct ConsumeBeginStagingImageClears();
108     StagingConsumeStruct ConsumeEndStagingData();
109 
110     uint32_t GetImageClearByteSize() const;
111 
112     // for plugin / factory interface
113     static constexpr const char* const TYPE_NAME = "RenderDataStoreDefaultStaging";
114 
115     static IRenderDataStore* Create(IRenderContext& renderContext, char const* name);
116     static void Destroy(IRenderDataStore* instance);
117 
GetTypeName()118     BASE_NS::string_view GetTypeName() const override
119     {
120         return TYPE_NAME;
121     }
122 
GetName()123     BASE_NS::string_view GetName() const override
124     {
125         return name_;
126     }
127 
GetUid()128     const BASE_NS::Uid& GetUid() const override
129     {
130         return UID;
131     }
132 
133 private:
134     IGpuResourceManager& gpuResourceMgr_;
135     const BASE_NS::string name_;
136 
137     mutable std::mutex mutex_;
138 
139     struct StagingConsumeData {
140         StagingConsumeStruct beginFrame;
141         StagingConsumeStruct endFrame;
142 
143         StagingDirectDataCopyConsumeStruct beginFrameDirect;
144 
145         StagingImageClearConsumeStruct beginFrameClear;
146     };
147     StagingConsumeData stagingConsumeData_;
148     // in pre render data moved here
149     StagingConsumeData frameStagingConsumeData_;
150 
151     BASE_NS::vector<RenderHandleReference> stagingGpuBuffers_;
152     BASE_NS::vector<RenderHandleReference> frameStagingConsumeGpuBuffers_;
153 };
154 RENDER_END_NAMESPACE()
155 
156 #endif // CORE__RENDER__NODE_DATA__RENDER_DATA_STORE_DEFAULT_STAGING_H
157