1 /*
2 * Copyright (c) 2022 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 "vulkan/gpu_resource_util_vk.h"
17
18 #include <cinttypes>
19 #include <vulkan/vulkan_core.h>
20
21 #include <base/containers/allocator.h>
22 #include <base/containers/byte_array.h>
23 #include <base/containers/string_view.h>
24 #include <render/namespace.h>
25 #include <render/vulkan/intf_device_vk.h>
26
27 #include "util/log.h"
28 #include "vulkan/device_vk.h"
29 #include "vulkan/gpu_buffer_vk.h"
30 #include "vulkan/gpu_image_vk.h"
31 #include "vulkan/gpu_sampler_vk.h"
32
33 using namespace BASE_NS;
34
35 RENDER_BEGIN_NAMESPACE()
36 namespace GpuResourceUtil {
37 namespace {
38 constexpr bool LOG_PRINT_GPU_BUFFER_ADDRESS { false };
39 }
40
CopyGpuBufferVk(GpuBuffer & buffer,ByteArray & byteArray)41 void CopyGpuBufferVk(GpuBuffer& buffer, ByteArray& byteArray)
42 {
43 auto& vkBuffer = (GpuBufferVk&)buffer;
44 if (const void* resData = vkBuffer.MapMemory(); resData) {
45 const GpuBufferDesc& desc = vkBuffer.GetDesc();
46 CloneData(byteArray.GetData().data(), byteArray.GetData().size_bytes(), (const uint8_t*)resData, desc.byteSize);
47 vkBuffer.Unmap();
48 }
49 }
50
DebugObjectNameVk(const IDevice & device,const VkObjectType objectType,const uint64_t castedHandle,const string_view name)51 void DebugObjectNameVk(
52 const IDevice& device, const VkObjectType objectType, const uint64_t castedHandle, const string_view name)
53 {
54 const auto& devicePlat = static_cast<const DevicePlatformDataVk&>(device.GetPlatformData());
55 const auto& funcPtrs = (static_cast<const DeviceVk&>(device)).GetDebugFunctionUtilities();
56 if (castedHandle && funcPtrs.vkSetDebugUtilsObjectNameEXT) {
57 const VkDebugUtilsObjectNameInfoEXT info { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
58 objectType, castedHandle, name.data() };
59 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &info);
60 }
61 }
62
DebugBufferNameVk(const IDevice & device,const GpuBuffer & buffer,const string_view name)63 void DebugBufferNameVk(const IDevice& device, const GpuBuffer& buffer, const string_view name)
64 {
65 const auto& devicePlat = static_cast<const DevicePlatformDataVk&>(device.GetPlatformData());
66 const auto& funcPtrs = (static_cast<const DeviceVk&>(device)).GetDebugFunctionUtilities();
67 if (funcPtrs.vkSetDebugUtilsObjectNameEXT) {
68 const GpuBufferPlatformDataVk& plat = (static_cast<const GpuBufferVk&>(buffer)).GetPlatformData();
69 if (plat.buffer) {
70 const VkDebugUtilsObjectNameInfoEXT info { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
71 VK_OBJECT_TYPE_BUFFER, VulkanHandleCast<uint64_t>(plat.buffer), name.data() };
72 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &info);
73 if constexpr (LOG_PRINT_GPU_BUFFER_ADDRESS) {
74 #if (RENDER_VULKAN_RT_ENABLED == 1)
75 const GpuAccelerationStructurePlatformDataVk platAccel =
76 (static_cast<const GpuBufferVk&>(buffer)).GetPlatformDataAccelerationStructure();
77 PLUGIN_LOG_I("GPU BUFFER: %s:", name.data());
78 if (platAccel.accelerationStructure) {
79 PLUGIN_LOG_I("deviceAddress: %" PRIx64 " accelDeviceAddress: %" PRIx64, plat.deviceAddress,
80 platAccel.deviceAddress);
81 } else {
82 PLUGIN_LOG_I("deviceAddress: %" PRIx64, plat.deviceAddress);
83 }
84 #endif
85 }
86 }
87 }
88 }
89
DebugImageNameVk(const IDevice & device,const GpuImage & image,const string_view name)90 void DebugImageNameVk(const IDevice& device, const GpuImage& image, const string_view name)
91 {
92 const auto& devicePlat = static_cast<const DevicePlatformDataVk&>(device.GetPlatformData());
93 const auto& funcPtrs = (static_cast<const DeviceVk&>(device)).GetDebugFunctionUtilities();
94 if (funcPtrs.vkSetDebugUtilsObjectNameEXT) {
95 const auto& plat = static_cast<const GpuImagePlatformDataVk&>(image.GetBasePlatformData());
96 if (plat.image) {
97 const VkDebugUtilsObjectNameInfoEXT img { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
98 VK_OBJECT_TYPE_IMAGE, VulkanHandleCast<uint64_t>(plat.image), name.data() };
99 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &img);
100 }
101 if (plat.imageView) {
102 const VkDebugUtilsObjectNameInfoEXT view { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
103 VK_OBJECT_TYPE_IMAGE_VIEW, VulkanHandleCast<uint64_t>(plat.imageView), name.data() };
104 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &view);
105 }
106 if (plat.imageViewBase) {
107 const VkDebugUtilsObjectNameInfoEXT viewBase { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
108 VK_OBJECT_TYPE_IMAGE_VIEW, VulkanHandleCast<uint64_t>(plat.imageViewBase), name.data() };
109 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &viewBase);
110 }
111 }
112 }
113
DebugSamplerNameVk(const IDevice & device,const GpuSampler & sampler,const string_view name)114 void DebugSamplerNameVk(const IDevice& device, const GpuSampler& sampler, const string_view name)
115 {
116 const auto& devicePlat = static_cast<const DevicePlatformDataVk&>(device.GetPlatformData());
117 const auto& funcPtrs = (static_cast<const DeviceVk&>(device)).GetDebugFunctionUtilities();
118 if (funcPtrs.vkSetDebugUtilsObjectNameEXT) {
119 const GpuSamplerPlatformDataVk& plat = (static_cast<const GpuSamplerVk&>(sampler)).GetPlatformData();
120 if (plat.sampler) {
121 const VkDebugUtilsObjectNameInfoEXT info { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr,
122 VK_OBJECT_TYPE_SAMPLER, VulkanHandleCast<uint64_t>(plat.sampler), name.data() };
123 funcPtrs.vkSetDebugUtilsObjectNameEXT(devicePlat.device, &info);
124 }
125 }
126 }
127 } // namespace GpuResourceUtil
128 RENDER_END_NAMESPACE()
129