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_ENV_H
17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_ENV_H
18 
19 #include <3d/render/render_data_defines_3d.h>
20 #include <base/containers/string.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/render_data_structures.h>
27 #include <render/resource_handle.h>
28 
29 #include "render/render_node_scene_util.h"
30 
31 CORE3D_BEGIN_NAMESPACE()
32 class IRenderDataStoreDefaultCamera;
33 class IRenderDataStoreDefaultScene;
34 
35 class RenderNodeDefaultEnv final : public RENDER_NS::IRenderNode {
36 public:
37     explicit RenderNodeDefaultEnv() = default;
38     ~RenderNodeDefaultEnv() 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 { "e3bc29b2-c1d0-4322-a41a-449354fd5a42" };
50     static constexpr char const* const TYPE_NAME = "RenderNodeDefaultEnv";
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 DefaultImages {
57         RENDER_NS::RenderHandle cubeHandle;
58         RENDER_NS::RenderHandle texHandle;
59     };
60 
61 private:
62     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
63 
64     void ParseRenderNodeInputs();
65 
66     void RenderData(RENDER_NS::IRenderCommandList& cmdList);
67     bool UpdateAndBindCustomSet(RENDER_NS::IRenderCommandList& cmdList, const RenderCamera::Environment& renderEnv);
68     void UpdateCurrentScene(
69         const IRenderDataStoreDefaultScene& dataStoreScene, const IRenderDataStoreDefaultCamera& dataStoreCamera);
70     RENDER_NS::RenderHandle GetPso(const RENDER_NS::RenderHandle shaderHandle,
71         const RenderCamera::Environment::BackgroundType bgType,
72         const RENDER_NS::RenderPostProcessConfiguration& renderPostProcessConfiguration);
73     void CreateDescriptorSets();
74     // unique scene name
75     void GetSceneUniformBuffers(const BASE_NS::string_view us);
76     void UpdatePostProcessConfiguration();
77     BASE_NS::array_view<const RENDER_NS::DynamicStateEnum> GetDynamicStates() const;
78     void ResetRenderSlotData(const bool enableMultiview);
79     void EvaluateFogBits();
80 
81     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
82     struct JsonInputs {
83         RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
84 
85         BASE_NS::string customCameraName;
86         uint64_t customCameraId { INVALID_CAM_ID };
87         uint32_t nodeFlags { 0u };
88 
89         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
90         bool hasChangeableRenderPassHandles { false };
91     };
92     JsonInputs jsonInputs_;
93     RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
94 
95     SceneBufferHandles sceneBuffers_;
96     SceneCameraBufferHandles cameraBuffers_;
97     SceneRenderDataStores stores_;
98 
99     RENDER_NS::RenderHandle cubemapSampler;
100 
101     RenderCamera::Environment::BackgroundType currentBgType_ { RenderCamera::Environment::BG_TYPE_NONE };
102     RenderCamera::ShaderFlags currentCameraShaderFlags_ { 0U };
103 
104     struct DescriptorSets {
105         RENDER_NS::IDescriptorSetBinder::Ptr set0;
106         RENDER_NS::IDescriptorSetBinder::Ptr set1;
107     };
108     DescriptorSets allDescriptorSets_;
109 
110     RENDER_NS::PipelineLayout defaultPipelineLayout_;
111     RENDER_NS::RenderHandle shaderHandle_;
112     RENDER_NS::RenderHandle psoHandle_;
113     bool enableMultiView_ { false };
114     bool customSet2_ { false };
115 
116     struct CurrentScene {
117         RenderCamera camera;
118         RENDER_NS::ViewportDesc viewportDesc;
119         RENDER_NS::ScissorDesc scissorDesc;
120 
121         RenderCamera::ShaderFlags cameraShaderFlags { 0u }; // evaluated based on camera and scene flags
122     };
123     CurrentScene currentScene_;
124     DefaultImages defaultImages_;
125 
126     RENDER_NS::RenderPass renderPass_;
127     // the base default render node graph from RNG setup
128     RENDER_NS::RenderPass rngRenderPass_;
129     bool fsrEnabled_ { false };
130 
131     RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_;
132 };
133 CORE3D_END_NAMESPACE()
134 
135 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_ENV_H
136