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
26RENDER_BEGIN_NAMESPACE()
27using namespace BASE_NS;
28
29RenderUtil::RenderUtil(const IRenderContext& renderContext) : renderContext_(renderContext)
30{
31    renderFrameUtil_ = make_unique<RenderFrameUtil>(renderContext);
32}
33
34void RenderUtil::BeginFrame()
35{
36    renderFrameUtil_->BeginFrame();
37}
38
39void RenderUtil::EndFrame()
40{
41    renderFrameUtil_->EndFrame();
42}
43
44RenderHandleDesc 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
72RenderHandleReference 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
104void RenderUtil::SetRenderTimings(const RenderTimings::Times& times)
105{
106    renderTimings_.prevFrame = renderTimings_.frame;
107    renderTimings_.frame = times;
108}
109
110RenderTimings RenderUtil::GetRenderTimings() const
111{
112    return renderTimings_;
113}
114
115IRenderFrameUtil& RenderUtil::GetRenderFrameUtil() const
116{
117    return *renderFrameUtil_;
118}
119
120RENDER_END_NAMESPACE()
121