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