• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_OBJECTS_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_OBJECTS_H
18 
19 #include <3d/render/intf_render_data_store_default_material.h>
20 #include <base/containers/vector.h>
21 #include <base/util/uid.h>
22 #include <core/namespace.h>
23 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
24 #include <render/nodecontext/intf_render_node.h>
25 #include <render/resource_handle.h>
26 
27 #include "render/render_node_scene_util.h"
28 
29 CORE3D_BEGIN_NAMESPACE()
30 class IRenderDataStoreDefaultMaterial;
31 
32 class RenderNodeDefaultMaterialObjects final : public RENDER_NS::IRenderNode {
33 public:
34     RenderNodeDefaultMaterialObjects() = default;
35     ~RenderNodeDefaultMaterialObjects() override = default;
36 
37     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
38     void PreExecuteFrame() override;
39     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()40     ExecuteFlags GetExecuteFlags() const override
41     {
42         return 0U;
43     }
44 
45     // for plugin / factory interface
46     static constexpr BASE_NS::Uid UID { "a25b27ea-a4ff-4b64-87c7-a7865cccfd92" };
47     static constexpr const char* const TYPE_NAME = "RenderNodeDefaultMaterialObjects";
48     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
49     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
50     static IRenderNode* Create();
51     static void Destroy(IRenderNode* instance);
52 
53     struct MaterialHandleStruct {
54         RENDER_NS::BindableImage resources[RenderDataDefaultMaterial::MATERIAL_TEXTURE_COUNT];
55     };
56 
57 private:
58     struct ObjectCounts {
59         uint32_t maxMeshCount { 0u };
60         uint32_t maxSubmeshCount { 0u };
61         uint32_t maxSkinCount { 0u };
62         uint32_t maxMaterialCount { 0u };
63         uint32_t maxUniqueMaterialCount { 0u };
64     };
65     struct UboHandles {
66         RENDER_NS::RenderHandleReference mat;
67         RENDER_NS::RenderHandleReference matTransform;
68         RENDER_NS::RenderHandleReference userMat;
69         RENDER_NS::RenderHandleReference mesh;
70         RENDER_NS::RenderHandleReference submeshSkin;
71     };
72     struct GlobalDescriptorSets {
73         BASE_NS::vector<RENDER_NS::RenderHandleReference> handles;
74         BASE_NS::vector<RENDER_NS::IDescriptorSetBinder::Ptr> descriptorSets;
75 
76         // keeps track if we need changes
77         BASE_NS::vector<MaterialHandleStruct> materials;
78         // force update all new descriptor sets
79         bool forceUpdate { false };
80 
81         // default material set 1 descriptor set
82         RENDER_NS::RenderHandleReference dmSet1;
83         RENDER_NS::IDescriptorSetBinder::Ptr dmSet1Binder;
84 
85         // default material set 2 descriptor set
86         RENDER_NS::RenderHandleReference dmSet2;
87         RENDER_NS::IDescriptorSetBinder::Ptr dmSet2Binder;
88         bool dmSet2Ready { false };
89     };
90     struct TlasData {
91         RENDER_NS::RenderHandleReference as;
92         RENDER_NS::RenderHandleReference asInstanceBuffer;
93         RENDER_NS::RenderHandleReference scratch;
94 
95         RENDER_NS::AsBuildSizes asBuildSizes;
96         bool createNewBuffer { false };
97     };
98 
99     void UpdateMeshBuffer(const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
100     void UpdateSkinBuffer(const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
101     void UpdateMaterialBuffers(const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
102     void UpdateTlasBuffers(
103         RENDER_NS::IRenderCommandList& cmdList, const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
104     void UpdateDescriptorSets(
105         RENDER_NS::IRenderCommandList& cmdList, const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
106 
107     void ProcessBuffers(const ObjectCounts& objectCounts);
108     void ProcessGlobalBinders();
109     void ProcessTlasBuffers();
110 
111     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
112 
113     SceneRenderDataStores stores_;
114     ObjectCounts objectCounts_;
115     UboHandles ubos_;
116 
117     GlobalDescriptorSets globalDescs_;
118     RENDER_NS::PipelineLayout defaultMaterialPipelineLayout_;
119     MaterialHandleStruct defaultMaterialStruct_;
120 
121     bool rtEnabled_ { false };
122     TlasData tlas_;
123 };
124 CORE3D_END_NAMESPACE()
125 
126 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_OBJECTS_H
127