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 CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_DEFERRED_SHADING_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_DEFERRED_SHADING_H
18 
19 #include <3d/render/intf_render_data_store_default_light.h>
20 #include <3d/render/render_data_defines_3d.h>
21 #include <base/containers/string.h>
22 #include <base/util/uid.h>
23 #include <core/namespace.h>
24 #include <render/datastore/intf_render_data_store_post_process.h>
25 #include <render/datastore/render_data_store_render_pods.h>
26 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
27 #include <render/nodecontext/intf_render_node.h>
28 #include <render/render_data_structures.h>
29 #include <render/resource_handle.h>
30 
31 #include "render/render_node_scene_util.h"
32 
33 CORE3D_BEGIN_NAMESPACE()
34 class IRenderDataStoreDefaultCamera;
35 class IRenderDataStoreDefaultScene;
36 
37 class RenderNodeDefaultMaterialDeferredShading final : public RENDER_NS::IRenderNode {
38 public:
39     explicit RenderNodeDefaultMaterialDeferredShading() = default;
40     ~RenderNodeDefaultMaterialDeferredShading() override = default;
41 
42     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
43     void PreExecuteFrame() override;
44     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()45     ExecuteFlags GetExecuteFlags() const override
46     {
47         return 0U;
48     }
49 
50     // for plugin / factory interface
51     static constexpr BASE_NS::Uid UID { "2abdac7a-de6c-4e82-b562-665a0553fc55" };
52     static constexpr char const* const TYPE_NAME = "RenderNodeDefaultMaterialDeferredShading";
53     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
54     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
55     static IRenderNode* Create();
56     static void Destroy(IRenderNode* instance);
57 
58     struct BufferHandles {
59         RENDER_NS::RenderHandle environment;
60         RENDER_NS::RenderHandle fog;
61         RENDER_NS::RenderHandle generalData;
62         RENDER_NS::RenderHandle postProcess;
63 
64         RENDER_NS::RenderHandle camera;
65         RENDER_NS::RenderHandle light;
66         RENDER_NS::RenderHandle lightCluster;
67 
68         RENDER_NS::RenderHandle defaultBuffer;
69     };
70     struct UboHandles {
71         // first 512 aligned is global post process
72         // after (256) we have effect local data
73         RENDER_NS::RenderHandleReference postProcess;
74     };
75     struct ShadowBuffers {
76         RENDER_NS::RenderHandle pcfDepthHandle;
77         RENDER_NS::RenderHandle vsmColorHandle;
78 
79         RENDER_NS::RenderHandle pcfSamplerHandle;
80         RENDER_NS::RenderHandle vsmSamplerHandle;
81     };
82     struct AllShaderData {
83         uint64_t psoHash { 0 };
84 
85         RENDER_NS::RenderHandle psoHandle;
86         RENDER_NS::RenderHandle shaderHandle;
87         RENDER_NS::RenderHandle stateHandle;
88         RENDER_NS::RenderHandle plHandle;
89         BASE_NS::vector<RENDER_NS::ShaderSpecialization::Constant> defaultSpecilizationConstants;
90     };
91 
92 private:
93     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
94 
95     void ParseRenderNodeInputs();
96     void RenderData(RENDER_NS::IRenderCommandList& cmdList);
97     void UpdateSet01(RENDER_NS::IRenderCommandList& cmdList);
98     void UpdateUserSets(RENDER_NS::IRenderCommandList& cmdList);
99     void UpdatePostProcessConfiguration();
100     void UpdateGlobalPostProcessUbo();
101     void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
102         const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
103     RENDER_NS::RenderHandle GetPsoHandle();
104     // unique scene name
105     void GetSceneUniformBuffers(const BASE_NS::string_view us);
106     void CreateDefaultShaderData();
107     void CreateDescriptorSets();
108     void EvaluateFogBits();
109 
110     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
111     struct JsonInputs {
112         RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
113         BASE_NS::string ppName;
114         RENDER_NS::RenderNodeGraphInputs::InputResources resources;
115 
116         BASE_NS::string customCameraName;
117         uint64_t customCameraId { INVALID_CAM_ID };
118 
119         uint32_t nodeFlags { 0u };
120         uint32_t renderSlotId { 0u };
121 
122         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
123         bool hasChangeableRenderPassHandles { false };
124         bool hasChangeableResourceHandles { false };
125     };
126     JsonInputs jsonInputs_;
127     RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
128     RENDER_NS::RenderNodeHandles::InputResources inputResources_;
129 
130     SceneRenderDataStores stores_;
131 
132     SceneBufferHandles sceneBuffers_;
133     SceneCameraBufferHandles cameraBuffers_;
134     UboHandles ubos_;
135     ShadowBuffers shadowBuffers_;
136 
137     struct SamplerHandles {
138         RENDER_NS::RenderHandle cubemap;
139         RENDER_NS::RenderHandle linear;
140         RENDER_NS::RenderHandle nearest;
141         RENDER_NS::RenderHandle linearMip;
142     };
143     SamplerHandles samplerHandles_;
144 
145     RENDER_NS::RenderHandle defaultColorPrePassHandle_;
146 
147     struct DescriptorSets {
148         RENDER_NS::IDescriptorSetBinder::Ptr set0;
149         RENDER_NS::IDescriptorSetBinder::Ptr set1;
150 
151         // user inputs (not built-in)
152         bool hasUserSet2 { false };
153         bool hasUserSet3 { false };
154         RENDER_NS::IPipelineDescriptorSetBinder::Ptr pipelineDescriptorSetBinder;
155     };
156     DescriptorSets allDescriptorSets_;
157     AllShaderData allShaderData_;
158 
159     struct CurrentScene {
160         RenderCamera camera;
161         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
162         RENDER_NS::ViewportDesc viewportDesc;
163         RENDER_NS::ScissorDesc scissorDesc;
164 
165         RENDER_NS::RenderHandle prePassColorTarget;
166 
167         bool hasShadow { false };
168         IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {};
169         IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u };
170         RenderCamera::ShaderFlags cameraShaderFlags { 0u }; // evaluated based on camera and scene flags
171     };
172     CurrentScene currentScene_;
173 
174     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
175     RENDER_NS::RenderPass renderPass_;
176     RENDER_NS::RenderHandle shader_;
177     RENDER_NS::PipelineLayout pipelineLayout_;
178 
179     RENDER_NS::PostProcessConfiguration ppGlobalConfig_;
180     RENDER_NS::IRenderDataStorePostProcess::PostProcess ppLocalConfig_;
181 
182     bool valid_ { false };
183 };
184 CORE3D_END_NAMESPACE()
185 
186 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_DEFERRED_SHADING_H
187