• 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_RENDER_SLOT_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_RENDER_SLOT_H
18 
19 #include <3d/render/intf_render_data_store_default_light.h>
20 #include <3d/render/intf_render_data_store_default_material.h>
21 #include <base/containers/string.h>
22 #include <base/containers/string_view.h>
23 #include <base/containers/unordered_map.h>
24 #include <base/containers/vector.h>
25 #include <base/math/vector.h>
26 #include <base/util/uid.h>
27 #include <core/namespace.h>
28 #include <render/datastore/render_data_store_render_pods.h>
29 #include <render/device/pipeline_state_desc.h>
30 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
31 #include <render/nodecontext/intf_render_node.h>
32 #include <render/render_data_structures.h>
33 #include <render/resource_handle.h>
34 
35 #include "render/render_node_scene_util.h"
36 
37 CORE3D_BEGIN_NAMESPACE()
38 class IRenderDataStoreDefaultCamera;
39 class IRenderDataStoreDefaultScene;
40 
41 class RenderNodeDefaultMaterialRenderSlot final : public RENDER_NS::IRenderNode {
42 public:
43     RenderNodeDefaultMaterialRenderSlot() = default;
44     ~RenderNodeDefaultMaterialRenderSlot() override = default;
45 
46     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
47     void PreExecuteFrame() override;
48     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()49     ExecuteFlags GetExecuteFlags() const override
50     {
51         // render pass always open
52         return 0U;
53     }
54 
55     struct ShadowBuffers {
56         RENDER_NS::RenderHandle depthHandle;
57         RENDER_NS::RenderHandle vsmColorHandle;
58 
59         RENDER_NS::RenderHandle pcfSamplerHandle;
60         RENDER_NS::RenderHandle vsmSamplerHandle;
61     };
62 
63     struct PerShaderData {
64         RENDER_NS::RenderHandle shaderHandle;
65         RENDER_NS::RenderHandle psoHandle;
66         RENDER_NS::RenderHandle graphicsStateHandle;
67         bool needsCustomSetBindings { false };
68     };
69     struct AllShaderData {
70         BASE_NS::vector<PerShaderData> perShaderData;
71         // shader hash, per shader data index
72         BASE_NS::unordered_map<uint64_t, uint32_t> shaderIdToData;
73 
74         bool slotHasShaders { false };
75         RENDER_NS::RenderHandle defaultShaderHandle;
76         RENDER_NS::RenderHandle defaultStateHandle;
77         RENDER_NS::RenderHandle defaultPlHandle;
78         RENDER_NS::RenderHandle defaultVidHandle;
79         RENDER_NS::PipelineLayout defaultPipelineLayout;
80         RENDER_NS::PipelineLayout defaultTmpPipelineLayout;
81         BASE_NS::vector<RENDER_NS::ShaderSpecialization::Constant> defaultSpecilizationConstants;
82         bool defaultPlSet3 { false };
83     };
84     struct PipelineInfo {
85         RENDER_NS::RenderHandle boundPsoHandle;
86         uint64_t boundShaderHash { 0U };
87         bool boundCustomSetNeed { false };
88     };
89     struct FrameGlobalDescriptorSets {
90         RENDER_NS::RenderHandle set0;
91         RENDER_NS::RenderHandle set1;
92         RENDER_NS::RenderHandle set2Default;
93         BASE_NS::array_view<const RENDER_NS::RenderHandle> set2;
94         bool valid = false;
95     };
96 
97     // for plugin / factory interface
98     static constexpr BASE_NS::Uid UID { "80758e28-f064-45e6-878d-624652598405" };
99     static constexpr const char* const TYPE_NAME = "RenderNodeDefaultMaterialRenderSlot";
100     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
101     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
102     static IRenderNode* Create();
103     static void Destroy(IRenderNode* instance);
104 
105 private:
106     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
107 
108     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
109     struct JsonInputs {
110         RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
111 
112         BASE_NS::string customCameraName;
113         uint64_t customCameraId { INVALID_CAM_ID };
114 
115         RENDER_NS::RenderSlotSortType sortType { RENDER_NS::RenderSlotSortType::NONE };
116         RENDER_NS::RenderSlotCullType cullType { RENDER_NS::RenderSlotCullType::NONE };
117 
118         RenderSceneFlags nodeFlags { 0u };
119         BASE_NS::string renderSlotName;
120         uint32_t renderSlotId { 0u };
121         uint32_t shaderRenderSlotId { 0u };
122         uint32_t stateRenderSlotId { 0u };
123         uint32_t shaderRenderSlotBaseId { 0u };
124         uint32_t shaderRenderSlotMultiviewId { 0u };
125         bool initialExplicitShader { false };
126         bool explicitShader { false };
127         RenderSubmeshFlags nodeSubmeshExtraFlags { 0 };
128         RenderMaterialFlags nodeMaterialDiscardFlags { 0 };
129 
130         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
131         bool hasChangeableRenderPassHandles { false };
132     };
133     JsonInputs jsonInputs_;
134     RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
135 
136     struct ShaderStateData {
137         RENDER_NS::RenderHandle shader;
138         RENDER_NS::RenderHandle gfxState;
139         uint64_t hash { 0 };
140     };
141     struct CurrentScene {
142         RenderCamera camera;
143         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
144         RENDER_NS::ViewportDesc viewportDesc;
145         RENDER_NS::ScissorDesc scissorDesc;
146 
147         RENDER_NS::RenderHandle prePassColorTarget;
148 
149         bool hasShadow { false };
150         uint32_t cameraIdx { 0u };
151         IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {};
152         IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u };
153         RenderCamera::ShaderFlags cameraShaderFlags { 0u }; // evaluated based on camera and scene flags
154         BASE_NS::vector<uint32_t> mvCameraIndices;
155     };
156     struct SpecializationData {
157         static constexpr uint32_t MAX_FLAG_COUNT { 16u };
158         uint32_t flags[MAX_FLAG_COUNT];
159 
160         uint32_t maxSpecializationCount { 0u };
161     };
162     struct PsoAndInfo {
163         RENDER_NS::RenderHandle pso;
164         bool set3 { false };
165     };
166 
167     void ParseRenderNodeInputs();
168     void RenderSubmeshes(RENDER_NS::IRenderCommandList& cmdList,
169         const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const IRenderDataStoreDefaultCamera& dataStoreCamera);
170     void BindPipeline(RENDER_NS::IRenderCommandList& cmdList, const SlotSubmeshIndex& ssp,
171         const RenderDataDefaultMaterial::SubmeshMaterialFlags& materialFlags, RenderSubmeshFlags submeshFlags,
172         const RENDER_NS::GraphicsState::InputAssembly& inputAssembly, PipelineInfo& info);
173     uint32_t BindSet1And2(RENDER_NS::IRenderCommandList& cmdList, const RenderSubmesh& currSubmesh,
174         RenderSubmeshFlags submeshFlags, bool initialBindDone, const FrameGlobalDescriptorSets& fgds,
175         uint32_t currMaterialIndex);
176     bool UpdateAndBindSet3(RENDER_NS::IRenderCommandList& cmdList,
177         const RenderDataDefaultMaterial::CustomResourceData& customResourceData);
178     void CreateDefaultShaderData();
179     PsoAndInfo CreateNewPso(const ShaderStateData& ssd, const RENDER_NS::GraphicsState::InputAssembly& ia,
180         const RenderDataDefaultMaterial::SubmeshMaterialFlags& submeshMaterialFlags,
181         const RenderSubmeshFlags submeshFlags, const IRenderDataStoreDefaultLight::LightingFlags lightingFlags,
182         const RenderCamera::ShaderFlags cameraShaderFlags);
183     void ProcessSlotSubmeshes(
184         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultMaterial& dataStoreMaterial);
185     void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
186         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
187 
188     void UpdatePostProcessConfiguration();
189     PsoAndInfo GetSubmeshPso(const ShaderStateData& ssd, const RENDER_NS::GraphicsState::InputAssembly& ia,
190         const RenderDataDefaultMaterial::SubmeshMaterialFlags& submeshMatFlags, const RenderSubmeshFlags submeshFlags,
191         const IRenderDataStoreDefaultLight::LightingFlags lightingFlags,
192         const RenderCamera::ShaderFlags camShaderFlags);
193     RENDER_NS::ShaderSpecializationConstantDataView GetShaderSpecView(const RENDER_NS::GraphicsState& gfxState,
194         const RenderDataDefaultMaterial::SubmeshMaterialFlags& submeshMatFlags, const RenderSubmeshFlags submeshFlags,
195         const IRenderDataStoreDefaultLight::LightingFlags lightingFlags,
196         const RenderCamera::ShaderFlags camShaderFlags);
197     BASE_NS::array_view<const RENDER_NS::DynamicStateEnum> GetDynamicStates() const;
198     void EvaluateFogBits();
199     void ResetRenderSlotData(const uint32_t shaderRenderSlotId, const bool multiView);
200     const RENDER_NS::PipelineLayout& GetEvaluatedPipelineLayout(
201         const RENDER_NS::RenderHandle& currShader, bool& needsCustomSet);
202 
203     CurrentScene currentScene_;
204     SceneRenderDataStores stores_;
205     BASE_NS::string cameraName_;
206 
207     struct DefaultSamplers {
208         RENDER_NS::RenderHandle cubemapHandle;
209 
210         RENDER_NS::RenderHandle linearHandle;
211         RENDER_NS::RenderHandle nearestHandle;
212         RENDER_NS::RenderHandle linearMipHandle;
213     };
214     DefaultSamplers defaultSamplers_;
215 
216     RENDER_NS::RenderHandle defaultColorPrePassHandle_;
217     AllShaderData allShaderData_;
218     SpecializationData specializationData_;
219 
220     RENDER_NS::RenderPass renderPass_;
221     // the base default render node graph from RNG setup
222     RENDER_NS::RenderPass rngRenderPass_;
223     bool fsrEnabled_ { false };
224 
225     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
226     BASE_NS::vector<SlotSubmeshIndex> sortedSlotSubmeshes_;
227 };
228 CORE3D_END_NAMESPACE()
229 
230 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_RENDER_SLOT_H
231