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 #include "util/render_util.h"
17 
18 #include <render/device/intf_device.h>
19 #include <render/device/intf_gpu_resource_manager.h>
20 #include <render/device/intf_shader_manager.h>
21 #include <render/intf_render_context.h>
22 #include <render/nodecontext/intf_render_node_graph_manager.h>
23 
24 #include "device/gpu_resource_manager.h"
25 
26 RENDER_BEGIN_NAMESPACE()
27 using namespace BASE_NS;
28 
RenderUtil(const IRenderContext & renderContext)29 RenderUtil::RenderUtil(const IRenderContext& renderContext) : renderContext_(renderContext)
30 {
31     renderFrameUtil_ = make_unique<RenderFrameUtil>(renderContext);
32 }
33 
BeginFrame()34 void RenderUtil::BeginFrame()
35 {
36     renderFrameUtil_->BeginFrame();
37 }
38 
EndFrame()39 void RenderUtil::EndFrame()
40 {
41     renderFrameUtil_->EndFrame();
42 }
43 
GetRenderHandleDesc(const RenderHandleReference & handle) const44 RenderHandleDesc RenderUtil::GetRenderHandleDesc(const RenderHandleReference& handle) const
45 {
46     RenderHandleDesc desc;
47     if (handle) {
48         const RenderHandleType handleType = handle.GetHandleType();
49         desc.type = handleType;
50         desc.refCount = handle.GetRefCount();
51         if ((handleType >= RenderHandleType::GPU_BUFFER) && (handleType <= RenderHandleType::GPU_SAMPLER)) {
52             const IGpuResourceManager& mgr = renderContext_.GetDevice().GetGpuResourceManager();
53             desc.name = mgr.GetName(handle);
54             desc.refCount -= 1; // one count in mgr
55         } else if ((handleType >= RenderHandleType::SHADER_STATE_OBJECT) &&
56                    (handleType <= RenderHandleType::GRAPHICS_STATE)) {
57             const IShaderManager& mgr = renderContext_.GetDevice().GetShaderManager();
58             IShaderManager::IdDesc info = mgr.GetIdDesc(handle);
59             desc.name = info.path;
60             desc.additionalName = info.variant;
61         } else if (handleType == RenderHandleType::RENDER_NODE_GRAPH) {
62             const IRenderNodeGraphManager& mgr = renderContext_.GetRenderNodeGraphManager();
63             const RenderNodeGraphDescInfo info = mgr.GetInfo(handle);
64             desc.name = info.renderNodeGraphUri;
65             desc.additionalName = info.renderNodeGraphName;
66             desc.refCount -= 1; // one count in mgr
67         }
68     }
69     return desc;
70 }
71 
GetRenderHandle(const RenderHandleDesc & desc) const72 RenderHandleReference RenderUtil::GetRenderHandle(const RenderHandleDesc& desc) const
73 {
74     RenderHandleReference rhr;
75     if (desc.type != RenderHandleType::UNDEFINED) {
76         if ((desc.type >= RenderHandleType::GPU_BUFFER) && (desc.type <= RenderHandleType::GPU_SAMPLER)) {
77             const IGpuResourceManager& mgr = renderContext_.GetDevice().GetGpuResourceManager();
78             if (desc.type == RenderHandleType::GPU_BUFFER) {
79                 rhr = mgr.GetBufferHandle(desc.name);
80             } else if (desc.type == RenderHandleType::GPU_IMAGE) {
81                 rhr = mgr.GetImageHandle(desc.name);
82             } else if (desc.type == RenderHandleType::GPU_SAMPLER) {
83                 rhr = mgr.GetSamplerHandle(desc.name);
84             }
85         } else if ((desc.type >= RenderHandleType::SHADER_STATE_OBJECT) &&
86                    (desc.type <= RenderHandleType::GRAPHICS_STATE)) {
87             const IShaderManager& mgr = renderContext_.GetDevice().GetShaderManager();
88             if ((desc.type == RenderHandleType::SHADER_STATE_OBJECT) ||
89                 (desc.type == RenderHandleType::COMPUTE_SHADER_STATE_OBJECT)) {
90                 rhr = mgr.GetShaderHandle(desc.name, desc.additionalName);
91             } else if (desc.type == RenderHandleType::GRAPHICS_STATE) {
92                 rhr = mgr.GetGraphicsStateHandle(desc.name, desc.additionalName);
93             } else if (desc.type == RenderHandleType::PIPELINE_LAYOUT) {
94                 rhr = mgr.GetPipelineLayoutHandle(desc.name);
95             } else if (desc.type == RenderHandleType::VERTEX_INPUT_DECLARATION) {
96                 rhr = mgr.GetVertexInputDeclarationHandle(desc.name);
97             }
98         } else if (desc.type == RenderHandleType::RENDER_NODE_GRAPH) {
99         }
100     }
101     return rhr;
102 }
103 
SetRenderTimings(const RenderTimings::Times & times)104 void RenderUtil::SetRenderTimings(const RenderTimings::Times& times)
105 {
106     renderTimings_.prevFrame = renderTimings_.frame;
107     renderTimings_.frame = times;
108 }
109 
GetRenderTimings() const110 RenderTimings RenderUtil::GetRenderTimings() const
111 {
112     return renderTimings_;
113 }
114 
GetRenderFrameUtil() const115 IRenderFrameUtil& RenderUtil::GetRenderFrameUtil() const
116 {
117     return *renderFrameUtil_;
118 }
119 
120 RENDER_END_NAMESPACE()
121