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_RENDERER_H
17  #define RENDER_RENDERER_H
18  
19  #include <mutex>
20  
21  #include <base/containers/unique_ptr.h>
22  #include <base/containers/vector.h>
23  #include <core/threading/intf_thread_pool.h>
24  #include <render/intf_renderer.h>
25  #include <render/namespace.h>
26  #include <render/render_data_structures.h>
27  #include <render/resource_handle.h>
28  #include <render/util/intf_render_util.h>
29  
30  #include "render_backend.h"
31  
32  RENDER_BEGIN_NAMESPACE()
33  class Device;
34  class GpuResourceManager;
35  class IRenderContext;
36  class IRenderDataStoreDefaultStaging;
37  class ShaderManager;
38  class PipelineRenderNodes;
39  class RenderPipeline;
40  class RenderFrameSync;
41  class RenderGraph;
42  class PipelineInitializerBase;
43  class RenderNodeGraphManager;
44  class RenderDataStoreManager;
45  class RenderUtil;
46  class RenderNodeGraphGlobalShareDataManager;
47  struct RenderNodeGraphNodeStore;
48  
49  /**
50  Renderer.
51  Implementation of default renderer.
52  Renderer renderers a render node graph with input data.
53  */
54  class Renderer final : public IRenderer {
55  public:
56      explicit Renderer(IRenderContext& context);
57      ~Renderer();
58  
59      uint64_t RenderFrame(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
60      uint64_t RenderDeferred(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
61      uint64_t RenderDeferredFrame() override;
62  
63      uint64_t RenderFrameBackend(const RenderFrameBackendInfo& info) override;
64      uint64_t RenderFramePresent(const RenderFramePresentInfo& info) override;
65  
66      RenderStatus GetFrameStatus() const override;
67  
68  private:
69      void InitNodeGraphs(const BASE_NS::array_view<const RenderHandle> renderNodeGraphs);
70  
71      // same render node graphs needs to be removed before calling this
72      void RenderFrameImpl(const BASE_NS::array_view<const RenderHandle> renderNodeGraphs);
73      void RenderFrameBackendImpl();
74      void RenderFramePresentImpl();
75  
76      void ExecuteRenderNodes(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputs,
77          const BASE_NS::array_view<RenderNodeGraphNodeStore*> renderNodeGraphNodeStores);
78  
79      void FillRngInputs(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputList,
80          BASE_NS::vector<RenderHandle>& rngInputs);
81      void RemapBackBufferHandle(const IRenderDataStoreManager& renderData);
82  
83      void ProcessTimeStampEnd();
84      void Tick();
85  
86      CORE_NS::IThreadPool::Ptr threadPool_;
87  
88      IRenderContext& renderContext_;
89      Device& device_;
90      GpuResourceManager& gpuResourceMgr_;
91      ShaderManager& shaderMgr_;
92      RenderNodeGraphManager& renderNodeGraphMgr_;
93      RenderDataStoreManager& renderDataStoreMgr_;
94      RenderUtil& renderUtil_;
95  
96      BASE_NS::unique_ptr<RenderGraph> renderGraph_;
97      BASE_NS::unique_ptr<RenderBackend> renderBackend_;
98      BASE_NS::unique_ptr<RenderFrameSync> renderFrameSync_;
99      CORE_NS::IParallelTaskQueue::Ptr parallelQueue_;
100      CORE_NS::ISequentialTaskQueue::Ptr sequentialQueue_;
101      RenderingConfiguration renderConfig_;
102      BASE_NS::unique_ptr<RenderNodeGraphGlobalShareDataManager> rngGlobalShareDataMgr_;
103  
104      RenderHandleReference defaultStagingRng_;
105      RenderHandleReference defaultEndFrameStagingRng_;
106      // deferred creation (only if using NodeGraphBackBufferConfiguration BackBufferType::GPU_IMAGE_BUFFER_COPY)
107      // NOTE: should be deprecated
108      RenderHandleReference defaultBackBufferGpuBufferRng_;
109  
110      // mutex for calling RenderFrame()
111      mutable std::mutex renderMutex_;
112  
113      // mutex for deferred render node graph list
114      mutable std::mutex deferredMutex_;
115      BASE_NS::vector<RenderHandleReference> deferredRenderNodeGraphs_;
116  
117      RenderTimings::Times frameTimes_;
118      uint64_t firstTime_ { ~0u };
119      uint64_t previousFrameTime_ { ~0u };
120      uint64_t deltaTime_ { 1 };
121  
122      IRenderDataStoreDefaultStaging* dsStaging_ { nullptr };
123  
124      struct RenderFrameTimeData {
125          uint64_t frameIndex { 0 };
126  
127          // filled before backend run
128          // cleared after present run
129          RenderBackendBackBufferConfiguration config;
130          BASE_NS::vector<RenderHandle> rngInputs;
131          BASE_NS::vector<RenderNodeGraphNodeStore*> rngNodeStores;
132  
133          // evaluated in RenderFrameBackendImpl
134          // used in RenderFramePresentImpl
135          bool hasBackendWork { false };
136      };
137      RenderFrameTimeData renderFrameTimeData_;
138  
139      struct SeparatedRenderingData {
140          bool separateBackend { false };
141          bool separatePresent { false };
142  
143          // this needs to be locked by RenderFrame (front-end) and RenderFrameBackend (back-end)
144          std::mutex frontMtx;
145          // this needs to be locked by RenderFrameBackend (back-end) and RenderFramePresent (presentation)
146          std::mutex backMtx;
147      };
148      SeparatedRenderingData separatedRendering_;
149  
150      RenderStatus renderStatus_;
151      // could be called in parallel
152      uint64_t renderStatusDeferred_ { 0 };
153  };
154  RENDER_END_NAMESPACE()
155  
156  #endif // RENDER_RENDERER_H
157