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_RENDERER_H
178bf80f4bSopenharmony_ci#define RENDER_RENDERER_H
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ci#include <mutex>
208bf80f4bSopenharmony_ci
218bf80f4bSopenharmony_ci#include <base/containers/unique_ptr.h>
228bf80f4bSopenharmony_ci#include <base/containers/vector.h>
238bf80f4bSopenharmony_ci#include <core/threading/intf_thread_pool.h>
248bf80f4bSopenharmony_ci#include <render/intf_renderer.h>
258bf80f4bSopenharmony_ci#include <render/namespace.h>
268bf80f4bSopenharmony_ci#include <render/render_data_structures.h>
278bf80f4bSopenharmony_ci#include <render/resource_handle.h>
288bf80f4bSopenharmony_ci#include <render/util/intf_render_util.h>
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_ci#include "render_backend.h"
318bf80f4bSopenharmony_ci
328bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE()
338bf80f4bSopenharmony_ciclass Device;
348bf80f4bSopenharmony_ciclass GpuResourceManager;
358bf80f4bSopenharmony_ciclass IRenderContext;
368bf80f4bSopenharmony_ciclass IRenderDataStoreDefaultStaging;
378bf80f4bSopenharmony_ciclass ShaderManager;
388bf80f4bSopenharmony_ciclass PipelineRenderNodes;
398bf80f4bSopenharmony_ciclass RenderPipeline;
408bf80f4bSopenharmony_ciclass RenderFrameSync;
418bf80f4bSopenharmony_ciclass RenderGraph;
428bf80f4bSopenharmony_ciclass PipelineInitializerBase;
438bf80f4bSopenharmony_ciclass RenderNodeGraphManager;
448bf80f4bSopenharmony_ciclass RenderDataStoreManager;
458bf80f4bSopenharmony_ciclass RenderUtil;
468bf80f4bSopenharmony_ciclass RenderNodeGraphGlobalShareDataManager;
478bf80f4bSopenharmony_cistruct RenderNodeGraphNodeStore;
488bf80f4bSopenharmony_ci
498bf80f4bSopenharmony_ci/**
508bf80f4bSopenharmony_ciRenderer.
518bf80f4bSopenharmony_ciImplementation of default renderer.
528bf80f4bSopenharmony_ciRenderer renderers a render node graph with input data.
538bf80f4bSopenharmony_ci*/
548bf80f4bSopenharmony_ciclass Renderer final : public IRenderer {
558bf80f4bSopenharmony_cipublic:
568bf80f4bSopenharmony_ci    explicit Renderer(IRenderContext& context);
578bf80f4bSopenharmony_ci    ~Renderer();
588bf80f4bSopenharmony_ci
598bf80f4bSopenharmony_ci    uint64_t RenderFrame(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
608bf80f4bSopenharmony_ci    uint64_t RenderDeferred(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
618bf80f4bSopenharmony_ci    uint64_t RenderDeferredFrame() override;
628bf80f4bSopenharmony_ci
638bf80f4bSopenharmony_ci    uint64_t RenderFrameBackend(const RenderFrameBackendInfo& info) override;
648bf80f4bSopenharmony_ci    uint64_t RenderFramePresent(const RenderFramePresentInfo& info) override;
658bf80f4bSopenharmony_ci
668bf80f4bSopenharmony_ci    RenderStatus GetFrameStatus() const override;
678bf80f4bSopenharmony_ci
688bf80f4bSopenharmony_ciprivate:
698bf80f4bSopenharmony_ci    void InitNodeGraphs(const BASE_NS::array_view<const RenderHandle> renderNodeGraphs);
708bf80f4bSopenharmony_ci
718bf80f4bSopenharmony_ci    // same render node graphs needs to be removed before calling this
728bf80f4bSopenharmony_ci    void RenderFrameImpl(const BASE_NS::array_view<const RenderHandle> renderNodeGraphs);
738bf80f4bSopenharmony_ci    void RenderFrameBackendImpl();
748bf80f4bSopenharmony_ci    void RenderFramePresentImpl();
758bf80f4bSopenharmony_ci
768bf80f4bSopenharmony_ci    void ExecuteRenderNodes(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputs,
778bf80f4bSopenharmony_ci        const BASE_NS::array_view<RenderNodeGraphNodeStore*> renderNodeGraphNodeStores);
788bf80f4bSopenharmony_ci
798bf80f4bSopenharmony_ci    void FillRngInputs(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputList,
808bf80f4bSopenharmony_ci        BASE_NS::vector<RenderHandle>& rngInputs);
818bf80f4bSopenharmony_ci    void RemapBackBufferHandle(const IRenderDataStoreManager& renderData);
828bf80f4bSopenharmony_ci
838bf80f4bSopenharmony_ci    void ProcessTimeStampEnd();
848bf80f4bSopenharmony_ci    void Tick();
858bf80f4bSopenharmony_ci
868bf80f4bSopenharmony_ci    CORE_NS::IThreadPool::Ptr threadPool_;
878bf80f4bSopenharmony_ci
888bf80f4bSopenharmony_ci    IRenderContext& renderContext_;
898bf80f4bSopenharmony_ci    Device& device_;
908bf80f4bSopenharmony_ci    GpuResourceManager& gpuResourceMgr_;
918bf80f4bSopenharmony_ci    ShaderManager& shaderMgr_;
928bf80f4bSopenharmony_ci    RenderNodeGraphManager& renderNodeGraphMgr_;
938bf80f4bSopenharmony_ci    RenderDataStoreManager& renderDataStoreMgr_;
948bf80f4bSopenharmony_ci    RenderUtil& renderUtil_;
958bf80f4bSopenharmony_ci
968bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderGraph> renderGraph_;
978bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderBackend> renderBackend_;
988bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderFrameSync> renderFrameSync_;
998bf80f4bSopenharmony_ci    CORE_NS::IParallelTaskQueue::Ptr parallelQueue_;
1008bf80f4bSopenharmony_ci    CORE_NS::ISequentialTaskQueue::Ptr sequentialQueue_;
1018bf80f4bSopenharmony_ci    RenderingConfiguration renderConfig_;
1028bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderNodeGraphGlobalShareDataManager> rngGlobalShareDataMgr_;
1038bf80f4bSopenharmony_ci
1048bf80f4bSopenharmony_ci    RenderHandleReference defaultStagingRng_;
1058bf80f4bSopenharmony_ci    RenderHandleReference defaultEndFrameStagingRng_;
1068bf80f4bSopenharmony_ci    // deferred creation (only if using NodeGraphBackBufferConfiguration BackBufferType::GPU_IMAGE_BUFFER_COPY)
1078bf80f4bSopenharmony_ci    // NOTE: should be deprecated
1088bf80f4bSopenharmony_ci    RenderHandleReference defaultBackBufferGpuBufferRng_;
1098bf80f4bSopenharmony_ci
1108bf80f4bSopenharmony_ci    // mutex for calling RenderFrame()
1118bf80f4bSopenharmony_ci    mutable std::mutex renderMutex_;
1128bf80f4bSopenharmony_ci
1138bf80f4bSopenharmony_ci    // mutex for deferred render node graph list
1148bf80f4bSopenharmony_ci    mutable std::mutex deferredMutex_;
1158bf80f4bSopenharmony_ci    BASE_NS::vector<RenderHandleReference> deferredRenderNodeGraphs_;
1168bf80f4bSopenharmony_ci
1178bf80f4bSopenharmony_ci    RenderTimings::Times frameTimes_;
1188bf80f4bSopenharmony_ci    uint64_t firstTime_ { ~0u };
1198bf80f4bSopenharmony_ci    uint64_t previousFrameTime_ { ~0u };
1208bf80f4bSopenharmony_ci    uint64_t deltaTime_ { 1 };
1218bf80f4bSopenharmony_ci
1228bf80f4bSopenharmony_ci    IRenderDataStoreDefaultStaging* dsStaging_ { nullptr };
1238bf80f4bSopenharmony_ci
1248bf80f4bSopenharmony_ci    struct RenderFrameTimeData {
1258bf80f4bSopenharmony_ci        uint64_t frameIndex { 0 };
1268bf80f4bSopenharmony_ci
1278bf80f4bSopenharmony_ci        // filled before backend run
1288bf80f4bSopenharmony_ci        // cleared after present run
1298bf80f4bSopenharmony_ci        RenderBackendBackBufferConfiguration config;
1308bf80f4bSopenharmony_ci        BASE_NS::vector<RenderHandle> rngInputs;
1318bf80f4bSopenharmony_ci        BASE_NS::vector<RenderNodeGraphNodeStore*> rngNodeStores;
1328bf80f4bSopenharmony_ci
1338bf80f4bSopenharmony_ci        // evaluated in RenderFrameBackendImpl
1348bf80f4bSopenharmony_ci        // used in RenderFramePresentImpl
1358bf80f4bSopenharmony_ci        bool hasBackendWork { false };
1368bf80f4bSopenharmony_ci    };
1378bf80f4bSopenharmony_ci    RenderFrameTimeData renderFrameTimeData_;
1388bf80f4bSopenharmony_ci
1398bf80f4bSopenharmony_ci    struct SeparatedRenderingData {
1408bf80f4bSopenharmony_ci        bool separateBackend { false };
1418bf80f4bSopenharmony_ci        bool separatePresent { false };
1428bf80f4bSopenharmony_ci
1438bf80f4bSopenharmony_ci        // this needs to be locked by RenderFrame (front-end) and RenderFrameBackend (back-end)
1448bf80f4bSopenharmony_ci        std::mutex frontMtx;
1458bf80f4bSopenharmony_ci        // this needs to be locked by RenderFrameBackend (back-end) and RenderFramePresent (presentation)
1468bf80f4bSopenharmony_ci        std::mutex backMtx;
1478bf80f4bSopenharmony_ci    };
1488bf80f4bSopenharmony_ci    SeparatedRenderingData separatedRendering_;
1498bf80f4bSopenharmony_ci
1508bf80f4bSopenharmony_ci    RenderStatus renderStatus_;
1518bf80f4bSopenharmony_ci    // could be called in parallel
1528bf80f4bSopenharmony_ci    uint64_t renderStatusDeferred_ { 0 };
1538bf80f4bSopenharmony_ci};
1548bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()
1558bf80f4bSopenharmony_ci
1568bf80f4bSopenharmony_ci#endif // RENDER_RENDERER_H
157