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 CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H 17 #define CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H 18 19 #include <3d/namespace.h> 20 #include <3d/render/intf_render_data_store_default_light.h> 21 #include <base/containers/string.h> 22 #include <base/util/uid.h> 23 #include <render/datastore/intf_render_data_store_post_process.h> 24 #include <render/datastore/render_data_store_render_pods.h> 25 #include <render/device/pipeline_state_desc.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 RENDER_BEGIN_NAMESPACE() 34 struct RenderNodeGraphInputs; 35 RENDER_END_NAMESPACE() 36 37 CORE3D_BEGIN_NAMESPACE() 38 class IRenderDataStoreDefaultCamera; 39 class IRenderDataStoreDefaultScene; 40 41 class RenderNodeCameraCubemap final : public RENDER_NS::IRenderNode { 42 public: 43 RenderNodeCameraCubemap() = default; 44 ~RenderNodeCameraCubemap() 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 return 0U; 52 } 53 54 // for plugin / factory interface 55 static constexpr BASE_NS::Uid UID { "ba8d2db0-5550-4a04-abe6-e39c6794baf8" }; 56 static constexpr char const* TYPE_NAME = "RenderNodeCameraCubemap"; 57 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 58 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 59 static IRenderNode* Create(); 60 static void Destroy(IRenderNode* instance); 61 62 struct ShadowBuffers { 63 RENDER_NS::RenderHandle pcfDepthHandle; 64 RENDER_NS::RenderHandle vsmColorHandle; 65 66 RENDER_NS::RenderHandle pcfSamplerHandle; 67 RENDER_NS::RenderHandle vsmSamplerHandle; 68 }; 69 struct DefaultImagesAndSamplers { 70 RENDER_NS::RenderHandle cubemapSamplerHandle; 71 72 RENDER_NS::RenderHandle linearHandle; 73 RENDER_NS::RenderHandle nearestHandle; 74 RENDER_NS::RenderHandle linearMipHandle; 75 76 RENDER_NS::RenderHandle colorPrePassHandle; 77 78 RENDER_NS::RenderHandle skyBoxRadianceCubemapHandle; 79 }; 80 81 private: 82 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 83 84 void RegisterOutputs(); 85 void InitCreateBinders(); 86 void ParseRenderNodeInputs(); 87 void UpdateGlobalPostProcessUbo(); 88 void UpdateImageData(); 89 void ProcessPostProcessConfiguration(); 90 void GetSceneUniformBuffers(const BASE_NS::string_view us); 91 void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene, 92 const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight); 93 void UpdateSet0(RENDER_NS::IRenderCommandList& cmdList); 94 void UpdateSet1(RENDER_NS::IRenderCommandList& cmdList, const uint32_t idx); 95 void ExecuteSinglePostProcess(RENDER_NS::IRenderCommandList& cmdList); 96 97 static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff }; 98 // Json resources which might need re-fetching 99 struct JsonInputs { 100 RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore; 101 102 BASE_NS::string ppName; 103 104 BASE_NS::string customCameraName; 105 uint64_t customCameraId { INVALID_CAM_ID }; 106 107 uint32_t outputIdx { ~0u }; 108 }; 109 JsonInputs jsonInputs_; 110 111 struct BuiltInVariables { 112 RENDER_NS::RenderHandle output; 113 BASE_NS::Math::UVec2 outputSize; 114 uint32_t outputMipCount; 115 116 RENDER_NS::RenderHandle defBuffer; 117 RENDER_NS::RenderHandle defBlackImage; 118 RENDER_NS::RenderHandle defSampler; 119 }; 120 BuiltInVariables builtInVariables_; 121 122 SceneBufferHandles sceneBuffers_; 123 SceneCameraBufferHandles cameraBuffers_; 124 125 DefaultImagesAndSamplers defaultImagesAndSamplers_; 126 127 struct CurrentScene { 128 RenderCamera camera; 129 RENDER_NS::RenderHandle cameraEnvRadianceHandles[DefaultMaterialCameraConstants::MAX_ENVIRONMENT_COUNT] {}; 130 RENDER_NS::RenderHandle prePassColorTarget; 131 BASE_NS::string cameraName; 132 133 bool hasShadow { false }; 134 IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {}; 135 IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u }; 136 }; 137 CurrentScene currentScene_; 138 139 ShadowBuffers shadowBuffers_; 140 141 RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_; 142 RENDER_NS::RenderNodeHandles::InputResources inputResources_; 143 RENDER_NS::RenderHandle shader_; 144 RENDER_NS::PipelineLayout pipelineLayout_; 145 RENDER_NS::RenderHandle psoHandle_; 146 RENDER_NS::PushConstant pushConstant_; 147 148 RENDER_NS::IDescriptorSetBinder::Ptr globalSet0_; 149 BASE_NS::vector<RENDER_NS::IDescriptorSetBinder::Ptr> localSets_; 150 151 RENDER_NS::PostProcessConfiguration ppGlobalConfig_; 152 RENDER_NS::IRenderDataStorePostProcess::PostProcess ppLocalConfig_; 153 154 SceneRenderDataStores stores_; 155 156 struct UboHandles { 157 // first 512 aligned is global post process 158 // after (256) we have effect local data 159 RENDER_NS::RenderHandleReference postProcess; 160 }; 161 UboHandles ubos_; 162 163 bool valid_ { false }; 164 }; 165 CORE3D_END_NAMESPACE() 166 167 #endif // CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H 168