18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci
168bf80f4bSopenharmony_ci#include "util/render_util.h"
178bf80f4bSopenharmony_ci
188bf80f4bSopenharmony_ci#include <render/device/intf_device.h>
198bf80f4bSopenharmony_ci#include <render/device/intf_gpu_resource_manager.h>
208bf80f4bSopenharmony_ci#include <render/device/intf_shader_manager.h>
218bf80f4bSopenharmony_ci#include <render/intf_render_context.h>
228bf80f4bSopenharmony_ci#include <render/nodecontext/intf_render_node_graph_manager.h>
238bf80f4bSopenharmony_ci
248bf80f4bSopenharmony_ci#include "device/gpu_resource_manager.h"
258bf80f4bSopenharmony_ci
268bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE()
278bf80f4bSopenharmony_ciusing namespace BASE_NS;
288bf80f4bSopenharmony_ci
298bf80f4bSopenharmony_ciRenderUtil::RenderUtil(const IRenderContext& renderContext) : renderContext_(renderContext)
308bf80f4bSopenharmony_ci{
318bf80f4bSopenharmony_ci    renderFrameUtil_ = make_unique<RenderFrameUtil>(renderContext);
328bf80f4bSopenharmony_ci}
338bf80f4bSopenharmony_ci
348bf80f4bSopenharmony_civoid RenderUtil::BeginFrame()
358bf80f4bSopenharmony_ci{
368bf80f4bSopenharmony_ci    renderFrameUtil_->BeginFrame();
378bf80f4bSopenharmony_ci}
388bf80f4bSopenharmony_ci
398bf80f4bSopenharmony_civoid RenderUtil::EndFrame()
408bf80f4bSopenharmony_ci{
418bf80f4bSopenharmony_ci    renderFrameUtil_->EndFrame();
428bf80f4bSopenharmony_ci}
438bf80f4bSopenharmony_ci
448bf80f4bSopenharmony_ciRenderHandleDesc RenderUtil::GetRenderHandleDesc(const RenderHandleReference& handle) const
458bf80f4bSopenharmony_ci{
468bf80f4bSopenharmony_ci    RenderHandleDesc desc;
478bf80f4bSopenharmony_ci    if (handle) {
488bf80f4bSopenharmony_ci        const RenderHandleType handleType = handle.GetHandleType();
498bf80f4bSopenharmony_ci        desc.type = handleType;
508bf80f4bSopenharmony_ci        desc.refCount = handle.GetRefCount();
518bf80f4bSopenharmony_ci        if ((handleType >= RenderHandleType::GPU_BUFFER) && (handleType <= RenderHandleType::GPU_SAMPLER)) {
528bf80f4bSopenharmony_ci            const IGpuResourceManager& mgr = renderContext_.GetDevice().GetGpuResourceManager();
538bf80f4bSopenharmony_ci            desc.name = mgr.GetName(handle);
548bf80f4bSopenharmony_ci            desc.refCount -= 1; // one count in mgr
558bf80f4bSopenharmony_ci        } else if ((handleType >= RenderHandleType::SHADER_STATE_OBJECT) &&
568bf80f4bSopenharmony_ci                   (handleType <= RenderHandleType::GRAPHICS_STATE)) {
578bf80f4bSopenharmony_ci            const IShaderManager& mgr = renderContext_.GetDevice().GetShaderManager();
588bf80f4bSopenharmony_ci            IShaderManager::IdDesc info = mgr.GetIdDesc(handle);
598bf80f4bSopenharmony_ci            desc.name = info.path;
608bf80f4bSopenharmony_ci            desc.additionalName = info.variant;
618bf80f4bSopenharmony_ci        } else if (handleType == RenderHandleType::RENDER_NODE_GRAPH) {
628bf80f4bSopenharmony_ci            const IRenderNodeGraphManager& mgr = renderContext_.GetRenderNodeGraphManager();
638bf80f4bSopenharmony_ci            const RenderNodeGraphDescInfo info = mgr.GetInfo(handle);
648bf80f4bSopenharmony_ci            desc.name = info.renderNodeGraphUri;
658bf80f4bSopenharmony_ci            desc.additionalName = info.renderNodeGraphName;
668bf80f4bSopenharmony_ci            desc.refCount -= 1; // one count in mgr
678bf80f4bSopenharmony_ci        }
688bf80f4bSopenharmony_ci    }
698bf80f4bSopenharmony_ci    return desc;
708bf80f4bSopenharmony_ci}
718bf80f4bSopenharmony_ci
728bf80f4bSopenharmony_ciRenderHandleReference RenderUtil::GetRenderHandle(const RenderHandleDesc& desc) const
738bf80f4bSopenharmony_ci{
748bf80f4bSopenharmony_ci    RenderHandleReference rhr;
758bf80f4bSopenharmony_ci    if (desc.type != RenderHandleType::UNDEFINED) {
768bf80f4bSopenharmony_ci        if ((desc.type >= RenderHandleType::GPU_BUFFER) && (desc.type <= RenderHandleType::GPU_SAMPLER)) {
778bf80f4bSopenharmony_ci            const IGpuResourceManager& mgr = renderContext_.GetDevice().GetGpuResourceManager();
788bf80f4bSopenharmony_ci            if (desc.type == RenderHandleType::GPU_BUFFER) {
798bf80f4bSopenharmony_ci                rhr = mgr.GetBufferHandle(desc.name);
808bf80f4bSopenharmony_ci            } else if (desc.type == RenderHandleType::GPU_IMAGE) {
818bf80f4bSopenharmony_ci                rhr = mgr.GetImageHandle(desc.name);
828bf80f4bSopenharmony_ci            } else if (desc.type == RenderHandleType::GPU_SAMPLER) {
838bf80f4bSopenharmony_ci                rhr = mgr.GetSamplerHandle(desc.name);
848bf80f4bSopenharmony_ci            }
858bf80f4bSopenharmony_ci        } else if ((desc.type >= RenderHandleType::SHADER_STATE_OBJECT) &&
868bf80f4bSopenharmony_ci                   (desc.type <= RenderHandleType::GRAPHICS_STATE)) {
878bf80f4bSopenharmony_ci            const IShaderManager& mgr = renderContext_.GetDevice().GetShaderManager();
888bf80f4bSopenharmony_ci            if ((desc.type == RenderHandleType::SHADER_STATE_OBJECT) ||
898bf80f4bSopenharmony_ci                (desc.type == RenderHandleType::COMPUTE_SHADER_STATE_OBJECT)) {
908bf80f4bSopenharmony_ci                rhr = mgr.GetShaderHandle(desc.name, desc.additionalName);
918bf80f4bSopenharmony_ci            } else if (desc.type == RenderHandleType::GRAPHICS_STATE) {
928bf80f4bSopenharmony_ci                rhr = mgr.GetGraphicsStateHandle(desc.name, desc.additionalName);
938bf80f4bSopenharmony_ci            } else if (desc.type == RenderHandleType::PIPELINE_LAYOUT) {
948bf80f4bSopenharmony_ci                rhr = mgr.GetPipelineLayoutHandle(desc.name);
958bf80f4bSopenharmony_ci            } else if (desc.type == RenderHandleType::VERTEX_INPUT_DECLARATION) {
968bf80f4bSopenharmony_ci                rhr = mgr.GetVertexInputDeclarationHandle(desc.name);
978bf80f4bSopenharmony_ci            }
988bf80f4bSopenharmony_ci        } else if (desc.type == RenderHandleType::RENDER_NODE_GRAPH) {
998bf80f4bSopenharmony_ci        }
1008bf80f4bSopenharmony_ci    }
1018bf80f4bSopenharmony_ci    return rhr;
1028bf80f4bSopenharmony_ci}
1038bf80f4bSopenharmony_ci
1048bf80f4bSopenharmony_civoid RenderUtil::SetRenderTimings(const RenderTimings::Times& times)
1058bf80f4bSopenharmony_ci{
1068bf80f4bSopenharmony_ci    renderTimings_.prevFrame = renderTimings_.frame;
1078bf80f4bSopenharmony_ci    renderTimings_.frame = times;
1088bf80f4bSopenharmony_ci}
1098bf80f4bSopenharmony_ci
1108bf80f4bSopenharmony_ciRenderTimings RenderUtil::GetRenderTimings() const
1118bf80f4bSopenharmony_ci{
1128bf80f4bSopenharmony_ci    return renderTimings_;
1138bf80f4bSopenharmony_ci}
1148bf80f4bSopenharmony_ci
1158bf80f4bSopenharmony_ciIRenderFrameUtil& RenderUtil::GetRenderFrameUtil() const
1168bf80f4bSopenharmony_ci{
1178bf80f4bSopenharmony_ci    return *renderFrameUtil_;
1188bf80f4bSopenharmony_ci}
1198bf80f4bSopenharmony_ci
1208bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()
121