/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef RENDER_RENDERER_H #define RENDER_RENDERER_H #include #include #include #include #include #include #include #include #include #include "render_backend.h" RENDER_BEGIN_NAMESPACE() class Device; class GpuResourceManager; class IRenderContext; class IRenderDataStoreDefaultStaging; class ShaderManager; class PipelineRenderNodes; class RenderPipeline; class RenderFrameSync; class RenderGraph; class PipelineInitializerBase; class RenderNodeGraphManager; class RenderDataStoreManager; class RenderUtil; class RenderNodeGraphGlobalShareDataManager; struct RenderNodeGraphNodeStore; /** Renderer. Implementation of default renderer. Renderer renderers a render node graph with input data. */ class Renderer final : public IRenderer { public: explicit Renderer(IRenderContext& context); ~Renderer(); uint64_t RenderFrame(const BASE_NS::array_view renderNodeGraphs) override; uint64_t RenderDeferred(const BASE_NS::array_view renderNodeGraphs) override; uint64_t RenderDeferredFrame() override; uint64_t RenderFrameBackend(const RenderFrameBackendInfo& info) override; uint64_t RenderFramePresent(const RenderFramePresentInfo& info) override; RenderStatus GetFrameStatus() const override; private: void InitNodeGraphs(const BASE_NS::array_view renderNodeGraphs); // same render node graphs needs to be removed before calling this void RenderFrameImpl(const BASE_NS::array_view renderNodeGraphs); void RenderFrameBackendImpl(); void RenderFramePresentImpl(); void ExecuteRenderNodes(const BASE_NS::array_view renderNodeGraphInputs, const BASE_NS::array_view renderNodeGraphNodeStores); void FillRngInputs(const BASE_NS::array_view renderNodeGraphInputList, BASE_NS::vector& rngInputs); void RemapBackBufferHandle(const IRenderDataStoreManager& renderData); void ProcessTimeStampEnd(); void Tick(); CORE_NS::IThreadPool::Ptr threadPool_; IRenderContext& renderContext_; Device& device_; GpuResourceManager& gpuResourceMgr_; ShaderManager& shaderMgr_; RenderNodeGraphManager& renderNodeGraphMgr_; RenderDataStoreManager& renderDataStoreMgr_; RenderUtil& renderUtil_; BASE_NS::unique_ptr renderGraph_; BASE_NS::unique_ptr renderBackend_; BASE_NS::unique_ptr renderFrameSync_; CORE_NS::IParallelTaskQueue::Ptr parallelQueue_; CORE_NS::ISequentialTaskQueue::Ptr sequentialQueue_; RenderingConfiguration renderConfig_; BASE_NS::unique_ptr rngGlobalShareDataMgr_; RenderHandleReference defaultStagingRng_; RenderHandleReference defaultEndFrameStagingRng_; // deferred creation (only if using NodeGraphBackBufferConfiguration BackBufferType::GPU_IMAGE_BUFFER_COPY) // NOTE: should be deprecated RenderHandleReference defaultBackBufferGpuBufferRng_; // mutex for calling RenderFrame() mutable std::mutex renderMutex_; // mutex for deferred render node graph list mutable std::mutex deferredMutex_; BASE_NS::vector deferredRenderNodeGraphs_; RenderTimings::Times frameTimes_; uint64_t firstTime_ { ~0u }; uint64_t previousFrameTime_ { ~0u }; uint64_t deltaTime_ { 1 }; IRenderDataStoreDefaultStaging* dsStaging_ { nullptr }; struct RenderFrameTimeData { uint64_t frameIndex { 0 }; // filled before backend run // cleared after present run RenderBackendBackBufferConfiguration config; BASE_NS::vector rngInputs; BASE_NS::vector rngNodeStores; // evaluated in RenderFrameBackendImpl // used in RenderFramePresentImpl bool hasBackendWork { false }; }; RenderFrameTimeData renderFrameTimeData_; struct SeparatedRenderingData { bool separateBackend { false }; bool separatePresent { false }; // this needs to be locked by RenderFrame (front-end) and RenderFrameBackend (back-end) std::mutex frontMtx; // this needs to be locked by RenderFrameBackend (back-end) and RenderFramePresent (presentation) std::mutex backMtx; }; SeparatedRenderingData separatedRendering_; RenderStatus renderStatus_; // could be called in parallel uint64_t renderStatusDeferred_ { 0 }; }; RENDER_END_NAMESPACE() #endif // RENDER_RENDERER_H