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_CAMERA_CONTROLLER_H 17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 18 19 #include <base/containers/string.h> 20 #include <base/containers/unordered_map.h> 21 #include <base/util/uid.h> 22 #include <core/namespace.h> 23 #include <render/datastore/render_data_store_render_pods.h> 24 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h> 25 #include <render/nodecontext/intf_render_node.h> 26 #include <render/resource_handle.h> 27 28 #include "render/render_node_scene_util.h" 29 30 CORE3D_BEGIN_NAMESPACE() 31 class IRenderDataStoreDefaultMaterial; 32 class IRenderDataStoreDefaultLight; 33 class IRenderDataStoreDefaultScene; 34 35 class RenderNodeDefaultCameraController final : public RENDER_NS::IRenderNode { 36 public: 37 RenderNodeDefaultCameraController() = default; 38 ~RenderNodeDefaultCameraController() override = default; 39 40 void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override; 41 void PreExecuteFrame() override; 42 void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override; GetExecuteFlags()43 ExecuteFlags GetExecuteFlags() const override 44 { 45 return 0U; 46 } 47 48 // for plugin / factory interface 49 static constexpr BASE_NS::Uid UID { "46144344-29f8-4fc1-913a-ed5f6f2e20d0" }; 50 static constexpr char const* TYPE_NAME = "RenderNodeDefaultCameraController"; 51 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 52 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 53 static IRenderNode* Create(); 54 static void Destroy(IRenderNode* instance); 55 56 struct ImageDescs { 57 RENDER_NS::GpuImageDesc depth; 58 59 RENDER_NS::GpuImageDesc output; 60 61 RENDER_NS::GpuImageDesc color; 62 RENDER_NS::GpuImageDesc velocityNormal; 63 RENDER_NS::GpuImageDesc history; 64 RENDER_NS::GpuImageDesc baseColor; 65 RENDER_NS::GpuImageDesc material; 66 }; 67 68 struct CreatedTargets { 69 RENDER_NS::RenderHandleReference outputColor; 70 RENDER_NS::RenderHandleReference depth; 71 72 // NOTE: depending on the post processes and the output target one could re-use colorTarget as resolve 73 // With hdrp and no msaa acts as a 3d scene camera rendering output 74 RENDER_NS::RenderHandleReference colorResolve; 75 76 RENDER_NS::RenderHandleReference colorMsaa; 77 RENDER_NS::RenderHandleReference depthMsaa; 78 79 // used in both DF and FW pipeline (not with light-weight) 80 RENDER_NS::RenderHandleReference velocityNormal; 81 // enabled with a flag with both DF and FW (not with light-weight) 82 RENDER_NS::RenderHandleReference history[2u]; 83 84 RENDER_NS::RenderHandleReference baseColor; 85 RENDER_NS::RenderHandleReference material; 86 87 ImageDescs imageDescs; 88 }; 89 90 struct CameraResourceSetup { 91 BASE_NS::Math::UVec2 outResolution { 0u, 0u }; 92 BASE_NS::Math::UVec2 renResolution { 0u, 0u }; 93 94 RenderCamera::Flags camFlags { 0u }; 95 RenderCamera::RenderPipelineType pipelineType { RenderCamera::RenderPipelineType::FORWARD }; 96 97 RENDER_NS::RenderHandle colorTarget; 98 RENDER_NS::RenderHandle depthTarget; 99 100 uint32_t historyFlipFrame { 0 }; 101 102 RENDER_NS::DeviceBackendType backendType { RENDER_NS::DeviceBackendType::VULKAN }; 103 104 ImageDescs inputImageDescs; 105 106 bool isMultiview { false }; 107 RENDER_NS::SampleCountFlags sampleCountFlags { RENDER_NS::SampleCountFlagBits::CORE_SAMPLE_COUNT_4_BIT }; 108 }; 109 struct ShadowBuffers { 110 RENDER_NS::RenderHandle depthHandle; 111 RENDER_NS::RenderHandle vsmColorHandle; 112 113 RENDER_NS::RenderHandle pcfSamplerHandle; 114 RENDER_NS::RenderHandle vsmSamplerHandle; 115 }; 116 117 private: 118 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 119 120 static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff }; 121 struct JsonInputs { 122 BASE_NS::string customCameraName; 123 uint64_t customCameraId { INVALID_CAM_ID }; 124 }; 125 JsonInputs jsonInputs_; 126 127 struct UboHandles { 128 RENDER_NS::RenderHandle cameraData; 129 RENDER_NS::RenderHandleReference generalData; 130 RENDER_NS::RenderHandleReference environment; 131 RENDER_NS::RenderHandleReference postProcess; 132 RENDER_NS::RenderHandleReference fog; 133 134 RENDER_NS::RenderHandleReference light; 135 RENDER_NS::RenderHandleReference lightCluster; 136 }; 137 struct DefaultSamplers { 138 RENDER_NS::RenderHandle cubemapHandle; 139 140 RENDER_NS::RenderHandle linearHandle; 141 RENDER_NS::RenderHandle nearestHandle; 142 RENDER_NS::RenderHandle linearMipHandle; 143 }; 144 DefaultSamplers defaultSamplers_; 145 RENDER_NS::RenderHandle defaultColorPrePassHandle_; 146 ShadowBuffers shadowBuffers_; 147 148 struct CurrentScene { 149 RenderCamera camera; 150 151 RENDER_NS::RenderHandle cameraEnvRadianceHandle; 152 RENDER_NS::RenderHandle prePassColorTarget; 153 154 uint32_t cameraIdx { 0 }; 155 BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f }; 156 157 BASE_NS::string customCameraName; 158 uint64_t customCameraId { INVALID_CAM_ID }; 159 BASE_NS::string customCamRngName; 160 }; 161 struct ConfigurationNames { 162 BASE_NS::string renderDataStoreName; 163 BASE_NS::string postProcessConfigurationName; 164 }; 165 struct ClusterBinders { 166 RENDER_NS::IDescriptorSetBinder::Ptr clusterBuffersSet0; 167 RENDER_NS::PipelineLayout pl; 168 169 RENDER_NS::RenderHandle shaderHandleCluster; 170 RENDER_NS::PipelineLayout pipelineLayout; 171 Render::RenderHandle psoHandle; 172 }; 173 ClusterBinders clusterBinders_; 174 175 struct GlobalDescriptorSets { 176 // default material set 0 descriptor set 177 RENDER_NS::RenderHandleReference dmSet0; 178 RENDER_NS::IDescriptorSetBinder::Ptr dmSet0Binder; 179 }; 180 GlobalDescriptorSets globalDescs_; 181 182 void SetDefaultGpuImageDescs(); 183 void ParseRenderNodeInputs(); 184 void CreateResources(); 185 void CreateResourceBaseTargets(); 186 void RegisterOutputs(); 187 188 void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene, 189 const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight); 190 void CreateBuffers(); 191 void UpdateBuffers(); 192 void UpdateGeneralUniformBuffer(); 193 void UpdateEnvironmentUniformBuffer(); 194 void UpdateFogUniformBuffer(); 195 void UpdatePostProcessUniformBuffer(); 196 void UpdateLightBuffer(); 197 void UpdatePostProcessConfiguration(); 198 void ClusterLights(RENDER_NS::IRenderCommandList& cmdList); 199 void UpdateGlobalDescriptorSets(RENDER_NS::IRenderCommandList& cmdList); 200 201 SceneRenderDataStores stores_; 202 CameraResourceSetup camRes_; 203 UboHandles uboHandles_; 204 CurrentScene currentScene_; 205 CreatedTargets createdTargets_; 206 RENDER_NS::RenderHandle defaultCubemap_; 207 208 RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_; 209 }; 210 CORE3D_END_NAMESPACE() 211 212 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 213