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