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