• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 RENDER_BEGIN_NAMESPACE()
31 class Device;
32 class GpuResourceManager;
33 class IRenderContext;
34 class ShaderManager;
35 class PipelineRenderNodes;
36 class RenderPipeline;
37 class RenderBackend;
38 class RenderFrameSync;
39 class RenderGraph;
40 class PipelineInitializerBase;
41 class RenderNodeGraphManager;
42 class RenderDataStoreManager;
43 class RenderUtil;
44 struct RenderNodeGraphNodeStore;
45 
46 /**
47 Renderer.
48 Implementation of default renderer.
49 Renderer renderers a render node graph with input data.
50 */
51 class Renderer final : public IRenderer {
52 public:
53     explicit Renderer(IRenderContext& context);
54     ~Renderer();
55 
56     void RenderFrame(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
57     void RenderDeferred(const BASE_NS::array_view<const RenderHandleReference> renderNodeGraphs) override;
58     void RenderDeferredFrame() override;
59 
60     void InitNodeGraph(RenderHandle renderNodeGraphHandle);
61 
62 private:
63     // same render node graphs needs to be removed before calling this
64     void RenderFrameImpl(const BASE_NS::array_view<const RenderHandle> renderNodeGraphs);
65 
66     void ExecuteRenderNodes(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputs,
67         const BASE_NS::array_view<RenderNodeGraphNodeStore*> renderNodeGraphNodeStores);
68     void ExecuteRenderBackend(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputs,
69         const BASE_NS::array_view<RenderNodeGraphNodeStore*> renderNodeGraphNodeStores);
70 
71     BASE_NS::vector<RenderHandle> GatherInputs(const BASE_NS::array_view<const RenderHandle> renderNodeGraphInputList);
72     void RemapBackBufferHandle(const IRenderDataStoreManager& renderData);
73 
74     void ProcessTimeStampEnd();
75     void Tick();
76 
77     CORE_NS::IThreadPool::Ptr threadPool_;
78 
79     IRenderContext& renderContext_;
80     Device& device_;
81     GpuResourceManager& gpuResourceMgr_;
82     ShaderManager& shaderMgr_;
83     RenderNodeGraphManager& renderNodeGraphMgr_;
84     RenderDataStoreManager& renderDataStoreMgr_;
85     RenderUtil& renderUtil_;
86 
87     BASE_NS::unique_ptr<RenderGraph> renderGraph_;
88     BASE_NS::unique_ptr<RenderBackend> renderBackend_;
89     BASE_NS::unique_ptr<RenderFrameSync> renderFrameSync_;
90     CORE_NS::IParallelTaskQueue::Ptr parallelQueue_;
91     CORE_NS::ISequentialTaskQueue::Ptr sequentialQueue_;
92     RenderingConfiguration renderConfig_;
93 
94     RenderHandleReference defaultStagingRng_;
95     // deferred creation (only if using NodeGraphBackBufferConfiguration BackBufferType::GPU_IMAGE_BUFFER_COPY)
96     RenderHandleReference defaultBackBufferGpuBufferRng_;
97 
98     // mutex for calling RenderFrame()
99     mutable std::mutex renderMutex_;
100 
101     // mutex for deferred render node graph list
102     mutable std::mutex deferredMutex_;
103     BASE_NS::vector<RenderHandleReference> deferredRenderNodeGraphs_;
104 
105     RenderTimings::Times frameTimes_;
106     uint64_t firstTime_ { ~0u };
107     uint64_t previousFrameTime_ { ~0u };
108     uint64_t deltaTime_ { 1 };
109 };
110 RENDER_END_NAMESPACE()
111 
112 #endif // RENDER_RENDERER_H
113