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_SHADOW_RENDER_SLOT_H 17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_SHADOW_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 <3d/render/render_data_defines_3d.h> 22 #include <base/containers/unordered_map.h> 23 #include <base/containers/vector.h> 24 #include <base/util/formats.h> 25 #include <base/util/uid.h> 26 #include <core/namespace.h> 27 #include <render/device/pipeline_state_desc.h> 28 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h> 29 #include <render/nodecontext/intf_render_node.h> 30 #include <render/render_data_structures.h> 31 #include <render/resource_handle.h> 32 33 #include "render/render_node_scene_util.h" 34 35 CORE3D_BEGIN_NAMESPACE() 36 class IRenderDataStoreDefaultCamera; 37 class IRenderDataStoreDefaultScene; 38 39 class RenderNodeDefaultShadowRenderSlot final : public RENDER_NS::IRenderNode { 40 public: 41 RenderNodeDefaultShadowRenderSlot() = default; 42 ~RenderNodeDefaultShadowRenderSlot() override = default; 43 44 void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override; 45 void PreExecuteFrame() override; 46 void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override; 47 ExecuteFlags GetExecuteFlags() const override; 48 49 struct ShadowBuffers { 50 BASE_NS::string depthName; 51 BASE_NS::string vsmColorName; 52 53 RENDER_NS::RenderHandleReference depthHandle; 54 RENDER_NS::RenderHandleReference vsmColorHandle; 55 56 BASE_NS::Format depthFormat { BASE_NS::Format::BASE_FORMAT_D16_UNORM }; 57 BASE_NS::Format colorFormat { BASE_NS::Format::BASE_FORMAT_R16G16_UNORM }; 58 59 // full size of atlas 60 uint32_t width { 2u }; 61 uint32_t height { 2u }; 62 63 IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {}; 64 }; 65 66 struct ShaderStateData { 67 RENDER_NS::RenderHandle shader; 68 RENDER_NS::RenderHandle gfxState; 69 uint64_t hash { 0 }; 70 RENDER_NS::RenderHandle defaultShader; 71 RENDER_NS::RenderHandle defaultShaderState; 72 }; 73 struct ShadowTypeShaders { 74 RENDER_NS::RenderHandle basic; 75 RENDER_NS::RenderHandle basicState; 76 }; 77 78 struct PsoCreationValue { 79 RENDER_NS::RenderHandle psoHandle; 80 bool hasImageData { false }; 81 }; 82 83 // for plugin / factory interface 84 static constexpr BASE_NS::Uid UID { "ce5b861e-09a0-4dfa-84f1-c1a9986f1fdf" }; 85 static constexpr const char* const TYPE_NAME = "RenderNodeDefaultShadowRenderSlot"; 86 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 87 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 88 static IRenderNode* Create(); 89 static void Destroy(IRenderNode* instance); 90 91 private: 92 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 93 94 struct UboHandles { 95 RENDER_NS::RenderHandleReference generalData; 96 }; 97 98 void ParseRenderNodeInputs(); 99 void RenderSubmeshes(RENDER_NS::IRenderCommandList& cmdList, 100 const IRenderDataStoreDefaultMaterial& dataStoreMaterial, 101 const IRenderDataStoreDefaultLight::ShadowType shadowType, const RenderCamera& camera, const RenderLight& light, 102 const uint32_t shadowPassIdx); 103 void UpdateSet0(RENDER_NS::IRenderCommandList& cmdList, const uint32_t shadowPassIdx); 104 105 void UpdateGeneralDataUniformBuffers(const IRenderDataStoreDefaultLight& dataStoreLight); 106 void CreateDefaultShaderData(); 107 PsoCreationValue CreateNewPso(const ShaderStateData& ssd, const RENDER_NS::GraphicsState::InputAssembly& ia, 108 const RENDER_NS::ShaderSpecializationConstantDataView& specialization, const RenderSubmeshFlags submeshFlags); 109 RENDER_NS::RenderPass CreateRenderPass(const ShadowBuffers& buffers); 110 void ProcessSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera, 111 const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const uint32_t shadowCameraIdx); 112 void ProcessBuffersAndDescriptors(); 113 void UpdateCurrentScene( 114 const IRenderDataStoreDefaultScene& dataStoreScene, const IRenderDataStoreDefaultLight& dataStoreLight); 115 116 PsoCreationValue GetSubmeshPso(const ShaderStateData& ssd, const RENDER_NS::GraphicsState::InputAssembly& ia, 117 const RenderDataDefaultMaterial::SubmeshMaterialFlags& submeshMaterialFlags, 118 const RenderSubmeshFlags submeshFlags); 119 120 struct JsonInputs { 121 RENDER_NS::RenderSlotSortType sortType { RENDER_NS::RenderSlotSortType::NONE }; 122 RENDER_NS::RenderSlotCullType cullType { RENDER_NS::RenderSlotCullType::NONE }; 123 124 uint32_t nodeFlags { 0u }; 125 uint32_t renderSlotId { 0u }; 126 uint32_t renderSlotVsmId { 0u }; 127 }; 128 JsonInputs jsonInputs_; 129 130 struct CurrentScene { 131 BASE_NS::Math::UVec2 res { 0u, 0u }; 132 RENDER_NS::ViewportDesc viewportDesc; 133 RENDER_NS::ScissorDesc scissorDesc; 134 BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f }; 135 136 uint32_t renderSlotId { ~0u }; 137 }; 138 CurrentScene currentScene_; 139 140 SceneRenderDataStores stores_; 141 ShadowBuffers shadowBuffers_; 142 143 struct AllDescriptorSets { 144 RENDER_NS::IDescriptorSetBinder::Ptr set0[DefaultMaterialLightingConstants::MAX_SHADOW_COUNT]; 145 }; 146 AllDescriptorSets allDescriptorSets_; 147 148 ShadowTypeShaders pcfShaders_; 149 ShadowTypeShaders vsmShaders_; 150 151 struct PerShaderData { 152 RENDER_NS::RenderHandle shaderHandle; 153 RENDER_NS::RenderHandle psoHandle; 154 RENDER_NS::RenderHandle stateHandle; 155 bool hasSet2Images { false }; 156 }; 157 struct AllShaderData { 158 BASE_NS::vector<PerShaderData> perShaderData; 159 // shader hash, per shader data index 160 BASE_NS::unordered_map<uint64_t, uint32_t> shaderIdToData; 161 162 bool slotHasShaders { false }; 163 RENDER_NS::RenderHandle defaultPlHandle; 164 RENDER_NS::RenderHandle defaultVidHandle; 165 RENDER_NS::PipelineLayout defaultPipelineLayout; 166 BASE_NS::vector<RENDER_NS::ShaderSpecialization::Constant> defaultSpecilizationConstants; 167 RENDER_NS::BindableImage defaultBaseColor; 168 }; 169 AllShaderData allShaderData_; 170 171 UboHandles uboHandles_; 172 SceneBufferHandles sceneBuffers_; 173 174 RENDER_NS::RenderPass renderPass_; 175 BASE_NS::vector<SlotSubmeshIndex> sortedSlotSubmeshes_; 176 177 bool validShadowNode_ { true }; 178 uint32_t shadowCount_ { 0U }; 179 }; 180 CORE3D_END_NAMESPACE() 181 182 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_SHADOW_RENDER_SLOT_H 183