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