1 /* 2 * Copyright (c) 2023 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_DEFAULT_ENVIRONMENT_BLENDER_H 17 #define CORE3D_RENDER__NODE__RENDER_NODE_DEFAULT_ENVIRONMENT_BLENDER_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/containers/vector.h> 23 #include <base/util/uid.h> 24 #include <render/datastore/intf_render_data_store_post_process.h> 25 #include <render/datastore/render_data_store_render_pods.h> 26 #include <render/device/pipeline_state_desc.h> 27 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h> 28 #include <render/nodecontext/intf_render_node.h> 29 #include <render/render_data_structures.h> 30 #include <render/resource_handle.h> 31 32 #include "render/render_node_scene_util.h" 33 34 RENDER_BEGIN_NAMESPACE() 35 struct RenderNodeGraphInputs; 36 RENDER_END_NAMESPACE() 37 38 CORE3D_BEGIN_NAMESPACE() 39 class IRenderDataStoreDefaultCamera; 40 class IRenderDataStoreDefaultScene; 41 42 class RenderNodeDefaultEnvironmentBlender final : public RENDER_NS::IRenderNode { 43 public: 44 RenderNodeDefaultEnvironmentBlender() = default; 45 ~RenderNodeDefaultEnvironmentBlender() override = default; 46 47 void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override; 48 void PreExecuteFrame() override; 49 void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override; 50 ExecuteFlags GetExecuteFlags() const override; 51 52 // for plugin / factory interface 53 static constexpr BASE_NS::Uid UID { "291720f5-1a00-446f-ab98-cc62f6c29562" }; 54 static constexpr char const* TYPE_NAME = "RenderNodeDefaultEnvironmentBlender"; 55 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 56 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 57 static IRenderNode* Create(); 58 static void Destroy(IRenderNode* instance); 59 60 struct DefaultImagesAndSamplers { 61 RENDER_NS::RenderHandle cubemapSamplerHandle; 62 63 RENDER_NS::RenderHandle linearHandle; 64 RENDER_NS::RenderHandle nearestHandle; 65 RENDER_NS::RenderHandle linearMipHandle; 66 67 RENDER_NS::RenderHandle skyBoxRadianceCubemapHandle; 68 }; 69 70 private: 71 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 72 73 void InitializeShaderData(); 74 void InitCreateBinders(); 75 void ParseRenderNodeInputs(); 76 void UpdateImageData(); 77 RENDER_NS::RenderHandle GetEnvironmentTargetHandle(const RenderCamera::Environment& environment); 78 void FillBlendEnvironments(BASE_NS::array_view<const RenderCamera::Environment> environments, uint32_t idx, 79 BASE_NS::array_view<RENDER_NS::RenderHandle>& blendEnvs) const; 80 void UpdateSet0(RENDER_NS::IRenderCommandList& cmdList, 81 BASE_NS::array_view<const RENDER_NS::RenderHandle> blendImages, const uint32_t envIdx, const uint32_t mipIdx); 82 void ExecuteSingleEnvironment(RENDER_NS::IRenderCommandList& cmdList, 83 BASE_NS::array_view<const RenderCamera::Environment> environments, uint32_t idx); 84 85 static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff }; 86 // Json resources which might need re-fetching 87 struct JsonInputs { 88 RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore; 89 }; 90 JsonInputs jsonInputs_; 91 92 struct BuiltInVariables { 93 RENDER_NS::RenderHandle defBlackImage; 94 RENDER_NS::RenderHandle defSampler; 95 }; 96 BuiltInVariables builtInVariables_; 97 DefaultImagesAndSamplers defaultImagesAndSamplers_; 98 99 RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_; 100 RENDER_NS::RenderNodeHandles::InputResources inputResources_; 101 RENDER_NS::RenderHandle shader_; 102 RENDER_NS::PipelineLayout pipelineLayout_; 103 RENDER_NS::RenderHandle psoHandle_; 104 105 RENDER_NS::RenderHandle environmentUbo_; 106 107 struct AllEnvSets { 108 BASE_NS::vector<RENDER_NS::IDescriptorSetBinder::Ptr> localSets; 109 }; 110 BASE_NS::vector<AllEnvSets> allEnvSets_; 111 112 SceneRenderDataStores stores_; 113 114 bool valid_ { false }; 115 bool hasBlendEnvironments_ { false }; 116 bool hasInitializedShaderData_ { false }; 117 118 struct OwnedEnvironmentTargetData { 119 uint64_t id { 0ULL }; 120 RENDER_NS::RenderHandleReference handle; 121 bool usedThisFrame { false }; 122 }; 123 BASE_NS::vector<OwnedEnvironmentTargetData> envTargetData_; 124 }; 125 CORE3D_END_NAMESPACE() 126 127 #endif // CORE3D_RENDER__NODE__RENDER_NODE_DEFAULT_ENVIRONMENT_BLENDER_H 128