18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci
168bf80f4bSopenharmony_ci#ifndef RENDER_RENDER__NODE__RENDER_BLUR_H
178bf80f4bSopenharmony_ci#define RENDER_RENDER__NODE__RENDER_BLUR_H
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ci#include <base/containers/string.h>
208bf80f4bSopenharmony_ci#include <base/containers/vector.h>
218bf80f4bSopenharmony_ci#include <base/math/vector.h>
228bf80f4bSopenharmony_ci#include <render/datastore/render_data_store_render_pods.h>
238bf80f4bSopenharmony_ci#include <render/namespace.h>
248bf80f4bSopenharmony_ci#include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
258bf80f4bSopenharmony_ci#include <render/nodecontext/intf_render_node.h>
268bf80f4bSopenharmony_ci#include <render/render_data_structures.h>
278bf80f4bSopenharmony_ci#include <render/resource_handle.h>
288bf80f4bSopenharmony_ci#include <render/shaders/common/render_blur_common.h>
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE()
318bf80f4bSopenharmony_ciclass IRenderCommandList;
328bf80f4bSopenharmony_ci
338bf80f4bSopenharmony_ciclass RenderBlur final {
348bf80f4bSopenharmony_cipublic:
358bf80f4bSopenharmony_ci    RenderBlur() = default;
368bf80f4bSopenharmony_ci    ~RenderBlur() = default;
378bf80f4bSopenharmony_ci
388bf80f4bSopenharmony_ci    struct BlurInfo {
398bf80f4bSopenharmony_ci        BindableImage blurTarget;
408bf80f4bSopenharmony_ci        RenderHandle globalUbo;
418bf80f4bSopenharmony_ci        bool upScale { false };
428bf80f4bSopenharmony_ci        uint32_t scaleType { CORE_BLUR_TYPE_DOWNSCALE_RGBA };
438bf80f4bSopenharmony_ci        uint32_t blurType { CORE_BLUR_TYPE_RGBA };
448bf80f4bSopenharmony_ci    };
458bf80f4bSopenharmony_ci    void Init(IRenderNodeContextManager& renderNodeContextMgr, const BlurInfo& blurInfo);
468bf80f4bSopenharmony_ci    void PreExecute(IRenderNodeContextManager& renderNodeContextMgr, const BlurInfo& blurInfo,
478bf80f4bSopenharmony_ci        const PostProcessConfiguration& ppConfig);
488bf80f4bSopenharmony_ci    void Execute(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
498bf80f4bSopenharmony_ci        const PostProcessConfiguration& ppConfig);
508bf80f4bSopenharmony_ci
518bf80f4bSopenharmony_ci    DescriptorCounts GetDescriptorCounts() const;
528bf80f4bSopenharmony_ci
538bf80f4bSopenharmony_ciprivate:
548bf80f4bSopenharmony_ci    void RenderData(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
558bf80f4bSopenharmony_ci        const RenderPass& renderPassBase, const PostProcessConfiguration& ppConfig);
568bf80f4bSopenharmony_ci    void RenderGaussian(IRenderNodeContextManager& renderNodeContextMgr, IRenderCommandList& cmdList,
578bf80f4bSopenharmony_ci        const RenderPass& renderPassBase, const PostProcessConfiguration& ppConfig);
588bf80f4bSopenharmony_ci
598bf80f4bSopenharmony_ci    void UpdateGlobalSet(IRenderCommandList& cmdList);
608bf80f4bSopenharmony_ci    void CreateTargets(IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::Math::UVec2 baseSize);
618bf80f4bSopenharmony_ci
628bf80f4bSopenharmony_ci    struct ImageData {
638bf80f4bSopenharmony_ci        RenderHandle mipImage;
648bf80f4bSopenharmony_ci        uint32_t mipCount { 0 };
658bf80f4bSopenharmony_ci        BASE_NS::Format format { BASE_NS::Format::BASE_FORMAT_UNDEFINED };
668bf80f4bSopenharmony_ci        BASE_NS::Math::UVec2 size { 0u, 0u };
678bf80f4bSopenharmony_ci    };
688bf80f4bSopenharmony_ci    ImageData imageData_;
698bf80f4bSopenharmony_ci    RenderHandle globalUbo_;
708bf80f4bSopenharmony_ci
718bf80f4bSopenharmony_ci    // additional target
728bf80f4bSopenharmony_ci    struct TemporaryTarget {
738bf80f4bSopenharmony_ci        RenderHandleReference tex;
748bf80f4bSopenharmony_ci        BASE_NS::Math::UVec2 texSize { 0, 0 };
758bf80f4bSopenharmony_ci        BASE_NS::Format format { BASE_NS::Format::BASE_FORMAT_UNDEFINED };
768bf80f4bSopenharmony_ci    };
778bf80f4bSopenharmony_ci    TemporaryTarget tempTarget_;
788bf80f4bSopenharmony_ci
798bf80f4bSopenharmony_ci    struct RenderDataHandles {
808bf80f4bSopenharmony_ci        RenderHandle shader;
818bf80f4bSopenharmony_ci        PipelineLayout pipelineLayout;
828bf80f4bSopenharmony_ci        RenderHandle psoScale;
838bf80f4bSopenharmony_ci        RenderHandle psoBlur;
848bf80f4bSopenharmony_ci    };
858bf80f4bSopenharmony_ci    RenderDataHandles renderData_;
868bf80f4bSopenharmony_ci
878bf80f4bSopenharmony_ci    IDescriptorSetBinder::Ptr globalSet0_;
888bf80f4bSopenharmony_ci    BASE_NS::vector<IDescriptorSetBinder::Ptr> binders_;
898bf80f4bSopenharmony_ci    RenderHandle samplerHandle_;
908bf80f4bSopenharmony_ci    BlurInfo blurInfo_;
918bf80f4bSopenharmony_ci};
928bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()
938bf80f4bSopenharmony_ci
948bf80f4bSopenharmony_ci#endif // CORE__RENDER__NODE__RENDER_BLUR_H
95