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