• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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