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_ACCELERATION_STRUCTURE_STAGING_H 17 #define RENDER_RENDER__NODE_DATA__RENDER_DATA_STORE_DEFAULT_ACCELERATION_STRUCTURE_STAGING_H 18 19 #include <cstdint> 20 #include <mutex> 21 22 #include <base/containers/string.h> 23 #include <base/containers/vector.h> 24 #include <base/util/uid.h> 25 #include <render/datastore/intf_render_data_store_default_acceleration_structure_staging.h> 26 #include <render/device/pipeline_state_desc.h> 27 #include <render/namespace.h> 28 #include <render/resource_handle.h> 29 30 RENDER_BEGIN_NAMESPACE() 31 class IGpuResourceManager; 32 class IRenderContext; 33 34 struct AccelerationStructureBuildConsumeStruct { 35 struct Geom { 36 StagingAccelerationStructureBuildGeometryData data; 37 GeometryType geometryType { CORE_GEOMETRY_TYPE_TRIANGLES }; 38 uint32_t startIndex { 0u }; 39 uint32_t count { 0u }; 40 }; 41 BASE_NS::vector<Geom> geometry; 42 BASE_NS::vector<StagingAccelerationStructureGeometryTrianglesData> triangles; 43 BASE_NS::vector<StagingAccelerationStructureGeometryAabbsData> aabbs; 44 BASE_NS::vector<StagingAccelerationStructureGeometryInstancesData> instances; 45 }; 46 47 struct AccelerationStructureInstanceConsumeStruct { 48 struct Target { 49 StagingAccelerationStructureBufferOffset bufferOffset; 50 uint32_t startIndex { 0u }; 51 uint32_t count { 0u }; 52 }; 53 BASE_NS::vector<Target> copyInfo; 54 BASE_NS::vector<StagingAccelerationStructureInstance> instances; 55 }; 56 57 /** 58 RenderDataStoreDefaultAccelerationStructureStaging implementation. 59 */ 60 class RenderDataStoreDefaultAccelerationStructureStaging final 61 : public IRenderDataStoreDefaultAccelerationStructureStaging { 62 public: 63 RenderDataStoreDefaultAccelerationStructureStaging(IRenderContext& renderContext, const BASE_NS::string_view name); 64 ~RenderDataStoreDefaultAccelerationStructureStaging() override; 65 CommitFrameData()66 void CommitFrameData() override {}; 67 void PreRender() override; 68 void PostRender() override; PreRenderBackend()69 void PreRenderBackend() override {}; PostRenderBackend()70 void PostRenderBackend() override {}; 71 void Clear() override; GetFlags()72 uint32_t GetFlags() const override 73 { 74 return 0; 75 }; 76 77 void BuildAccelerationStructure(const StagingAccelerationStructureBuildGeometryData& buildData, 78 const BASE_NS::array_view<const StagingAccelerationStructureGeometryTrianglesData> geometries) override; 79 void BuildAccelerationStructure(const StagingAccelerationStructureBuildGeometryData& buildData, 80 const BASE_NS::array_view<const StagingAccelerationStructureGeometryInstancesData> geometries) override; 81 void BuildAccelerationStructure(const StagingAccelerationStructureBuildGeometryData& buildData, 82 const BASE_NS::array_view<const StagingAccelerationStructureGeometryAabbsData> geometries) override; 83 84 void CopyAccelerationStructureInstanceData(const RenderHandleReference& buffer, const uint32_t offset, 85 const BASE_NS::array_view<const StagingAccelerationStructureInstance> instances) override; 86 87 bool HasStagingData() const; 88 AccelerationStructureBuildConsumeStruct ConsumeStagingBuildData(); 89 AccelerationStructureInstanceConsumeStruct ConsumeStagingInstanceData(); 90 91 // for plugin / factory interface 92 static constexpr const char* const TYPE_NAME = "RenderDataStoreDefaultAccelerationStructureStaging"; 93 94 static IRenderDataStore* Create(IRenderContext& renderContext, char const* name); 95 static void Destroy(IRenderDataStore* instance); 96 GetTypeName()97 BASE_NS::string_view GetTypeName() const override 98 { 99 return TYPE_NAME; 100 } 101 GetName()102 BASE_NS::string_view GetName() const override 103 { 104 return name_; 105 } 106 GetUid()107 const BASE_NS::Uid& GetUid() const override 108 { 109 return UID; 110 } 111 112 private: 113 IGpuResourceManager& gpuResourceMgr_; 114 const BASE_NS::string name_; 115 116 AccelerationStructureBuildConsumeStruct stagingBuild_; 117 AccelerationStructureInstanceConsumeStruct stagingInstance_; 118 // in pre render data moved here 119 AccelerationStructureBuildConsumeStruct frameStagingBuild_; 120 AccelerationStructureInstanceConsumeStruct frameStagingInstance_; 121 122 mutable std::mutex mutex_; 123 }; 124 RENDER_END_NAMESPACE() 125 126 #endif // RENDER_RENDER__NODE_DATA__RENDER_DATA_STORE_DEFAULT_ACCELERATION_STRUCTURE_STAGING_H 127