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