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