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_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 RENDER_NS::RenderHandle tlas; 138 }; 139 struct DefaultSamplers { 140 RENDER_NS::RenderHandle cubemapHandle; 141 142 RENDER_NS::RenderHandle linearHandle; 143 RENDER_NS::RenderHandle nearestHandle; 144 RENDER_NS::RenderHandle linearMipHandle; 145 }; 146 DefaultSamplers defaultSamplers_; 147 RENDER_NS::RenderHandle defaultColorPrePassHandle_; 148 ShadowBuffers shadowBuffers_; 149 150 struct CurrentScene { 151 RenderCamera camera; 152 153 RENDER_NS::RenderHandle cameraEnvRadianceHandle; 154 RENDER_NS::RenderHandle prePassColorTarget; 155 156 uint32_t cameraIdx { 0 }; 157 BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f }; 158 159 BASE_NS::string customCameraName; 160 uint64_t customCameraId { INVALID_CAM_ID }; 161 BASE_NS::string customCamRngName; 162 }; 163 struct ConfigurationNames { 164 BASE_NS::string renderDataStoreName; 165 BASE_NS::string postProcessConfigurationName; 166 }; 167 struct ClusterBinders { 168 RENDER_NS::IDescriptorSetBinder::Ptr clusterBuffersSet0; 169 RENDER_NS::PipelineLayout pl; 170 171 RENDER_NS::RenderHandle shaderHandleCluster; 172 RENDER_NS::PipelineLayout pipelineLayout; 173 RENDER_NS::RenderHandle psoHandle; 174 }; 175 ClusterBinders clusterBinders_; 176 177 struct GlobalDescriptorSets { 178 // default material set 0 descriptor set 179 RENDER_NS::RenderHandleReference dmSet0; 180 RENDER_NS::IDescriptorSetBinder::Ptr dmSet0Binder; 181 }; 182 GlobalDescriptorSets globalDescs_; 183 184 void SetDefaultGpuImageDescs(); 185 void ParseRenderNodeInputs(); 186 void CreateResources(); 187 void CreateResourceBaseTargets(); 188 void RegisterOutputs(); 189 190 void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene, 191 const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight); 192 void CreateBuffers(); 193 void UpdateBuffers(); 194 void UpdateGeneralUniformBuffer(); 195 void UpdateEnvironmentUniformBuffer(); 196 void UpdateFogUniformBuffer(); 197 void UpdatePostProcessUniformBuffer(); 198 void UpdateLightBuffer(); 199 void UpdatePostProcessConfiguration(); 200 void ClusterLights(RENDER_NS::IRenderCommandList& cmdList); 201 void UpdateGlobalDescriptorSets(RENDER_NS::IRenderCommandList& cmdList); 202 203 SceneRenderDataStores stores_; 204 BASE_NS::string dsWeatherName_; 205 206 CameraResourceSetup camRes_; 207 UboHandles uboHandles_; 208 CurrentScene currentScene_; 209 CreatedTargets createdTargets_; 210 RENDER_NS::RenderHandle defaultCubemap_; 211 212 RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_; 213 214 bool rtEnabled_ { false }; 215 }; 216 CORE3D_END_NAMESPACE() 217 218 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 219