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 RENDER_RENDER__NODE__RENDER_BLUR_H
17 #define RENDER_RENDER__NODE__RENDER_BLUR_H
18 
19 #include <base/containers/string.h>
20 #include <base/containers/vector.h>
21 #include <base/math/vector.h>
22 #include <render/datastore/render_data_store_render_pods.h>
23 #include <render/namespace.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 #include <render/shaders/common/render_blur_common.h>
29 
30 RENDER_BEGIN_NAMESPACE()
31 class IRenderCommandList;
32 
33 class RenderBlur final {
34 public:
35     RenderBlur() = default;
36     ~RenderBlur() = default;
37 
38     struct BlurInfo {
39         BindableImage blurTarget;
40         RenderHandle globalUbo;
41         bool upScale { false };
42         uint32_t scaleType { CORE_BLUR_TYPE_DOWNSCALE_RGBA };
43         uint32_t blurType { CORE_BLUR_TYPE_RGBA };
44     };
45     void Init(IRenderNodeContextManager& renderNodeContextMgr, const BlurInfo& blurInfo);
46     void PreExecute(IRenderNodeContextManager& renderNodeContextMgr, const BlurInfo& blurInfo,
47         const PostProcessConfiguration& ppConfig);
48     void Execute(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
49         const PostProcessConfiguration& ppConfig);
50 
51     DescriptorCounts GetDescriptorCounts() const;
52 
53 private:
54     void RenderData(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
55         const RenderPass& renderPassBase, const PostProcessConfiguration& ppConfig);
56     void RenderGaussian(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
57         const RenderPass& renderPassBase, const PostProcessConfiguration& ppConfig);
58 
59     void UpdateGlobalSet(IRenderCommandList& cmdList);
60     void CreateTargets(IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::Math::UVec2 baseSize);
61 
62     struct ImageData {
63         RenderHandle mipImage;
64         uint32_t mipCount { 0 };
65         BASE_NS::Format format { BASE_NS::Format::BASE_FORMAT_UNDEFINED };
66         BASE_NS::Math::UVec2 size { 0u, 0u };
67     };
68     ImageData imageData_;
69     RenderHandle globalUbo_;
70 
71     // additional target
72     struct TemporaryTarget {
73         RenderHandleReference tex;
74         BASE_NS::Math::UVec2 texSize { 0, 0 };
75         BASE_NS::Format format { BASE_NS::Format::BASE_FORMAT_UNDEFINED };
76     };
77     TemporaryTarget tempTarget_;
78 
79     struct RenderDataHandles {
80         RenderHandle shader;
81         PipelineLayout pipelineLayout;
82         RenderHandle psoScale;
83         RenderHandle psoBlur;
84     };
85     RenderDataHandles renderData_;
86 
87     IDescriptorSetBinder::Ptr globalSet0_;
88     BASE_NS::vector<IDescriptorSetBinder::Ptr> binders_;
89     RenderHandle samplerHandle_;
90     BlurInfo blurInfo_;
91 };
92 RENDER_END_NAMESPACE()
93 
94 #endif // CORE__RENDER__NODE__RENDER_BLUR_H
95