1 /*
2 * Copyright © 2022 Friedrich Vock
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7 #include "rmv/vk_rmv_common.h"
8 #include "rmv/vk_rmv_tokens.h"
9 #include "radv_device.h"
10 #include "radv_entrypoints.h"
11 #include "radv_queue.h"
12 #include "vk_common_entrypoints.h"
13
14 VKAPI_ATTR VkResult VKAPI_CALL
rmv_QueuePresentKHR(VkQueue _queue,const VkPresentInfoKHR * pPresentInfo)15 rmv_QueuePresentKHR(VkQueue _queue, const VkPresentInfoKHR *pPresentInfo)
16 {
17 VK_FROM_HANDLE(radv_queue, queue, _queue);
18 struct radv_device *device = radv_queue_device(queue);
19
20 VkResult res = device->layer_dispatch.rmv.QueuePresentKHR(_queue, pPresentInfo);
21 if ((res != VK_SUCCESS && res != VK_SUBOPTIMAL_KHR) || !device->vk.memory_trace_data.is_enabled)
22 return res;
23
24 vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_PRESENT);
25
26 return VK_SUCCESS;
27 }
28
29 VKAPI_ATTR VkResult VKAPI_CALL
rmv_FlushMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)30 rmv_FlushMappedMemoryRanges(VkDevice _device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges)
31 {
32 VK_FROM_HANDLE(radv_device, device, _device);
33
34 VkResult res = device->layer_dispatch.rmv.FlushMappedMemoryRanges(_device, memoryRangeCount, pMemoryRanges);
35 if (res != VK_SUCCESS || !device->vk.memory_trace_data.is_enabled)
36 return res;
37
38 vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_FLUSH_MAPPED_RANGE);
39
40 return VK_SUCCESS;
41 }
42
43 VKAPI_ATTR VkResult VKAPI_CALL
rmv_InvalidateMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)44 rmv_InvalidateMappedMemoryRanges(VkDevice _device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges)
45 {
46 VK_FROM_HANDLE(radv_device, device, _device);
47
48 VkResult res = device->layer_dispatch.rmv.InvalidateMappedMemoryRanges(_device, memoryRangeCount, pMemoryRanges);
49 if (res != VK_SUCCESS || !device->vk.memory_trace_data.is_enabled)
50 return res;
51
52 vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_INVALIDATE_RANGES);
53
54 return VK_SUCCESS;
55 }
56
57 VKAPI_ATTR VkResult VKAPI_CALL
rmv_SetDebugUtilsObjectNameEXT(VkDevice _device,const VkDebugUtilsObjectNameInfoEXT * pNameInfo)58 rmv_SetDebugUtilsObjectNameEXT(VkDevice _device, const VkDebugUtilsObjectNameInfoEXT *pNameInfo)
59 {
60 assert(pNameInfo->sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT);
61 VK_FROM_HANDLE(radv_device, device, _device);
62
63 VkResult result = device->layer_dispatch.rmv.SetDebugUtilsObjectNameEXT(_device, pNameInfo);
64 if (result != VK_SUCCESS || !device->vk.memory_trace_data.is_enabled)
65 return result;
66
67 switch (pNameInfo->objectType) {
68 /* only name object types we care about */
69 case VK_OBJECT_TYPE_BUFFER:
70 case VK_OBJECT_TYPE_DEVICE_MEMORY:
71 case VK_OBJECT_TYPE_IMAGE:
72 case VK_OBJECT_TYPE_EVENT:
73 case VK_OBJECT_TYPE_QUERY_POOL:
74 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
75 case VK_OBJECT_TYPE_PIPELINE:
76 break;
77 default:
78 return VK_SUCCESS;
79 }
80
81 size_t name_len = strlen(pNameInfo->pObjectName);
82 char *name_buf = malloc(name_len + 1);
83 if (!name_buf) {
84 /*
85 * Silently fail, so that applications may still continue if possible.
86 */
87 return VK_SUCCESS;
88 }
89 strcpy(name_buf, pNameInfo->pObjectName);
90
91 simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
92 struct vk_rmv_userdata_token token;
93 token.name = name_buf;
94 token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, pNameInfo->objectHandle);
95
96 vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_USERDATA, &token);
97 simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
98
99 return VK_SUCCESS;
100 }
101