From 8c9527cdf799883ad0e88918d13ea4cf4542cd6b Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 25 Feb 2021 06:59:33 +0000 Subject: [PATCH] vkd3d: Refactor SetName implementation As per MSDN, SetName is just a wrapper around SetPrivateData and a specific GUID. Some apps and tools will use this to retrieve their name back. So instead, just forward the name to Vulkan in the SetPrivateData call. Signed-off-by: Joshua Ashton --- libs/vkd3d/cache.c | 15 ++-- libs/vkd3d/command.c | 97 ++++++++--------------- libs/vkd3d/command_list_profiled.h | 2 +- libs/vkd3d/device.c | 24 +++--- libs/vkd3d/device_profiled.h | 2 +- libs/vkd3d/heap.c | 28 +++---- libs/vkd3d/raytracing_pipeline.c | 15 ++-- libs/vkd3d/resource.c | 113 +++++++++++++-------------- libs/vkd3d/state.c | 49 +++++------- libs/vkd3d/swapchain.c | 6 +- libs/vkd3d/utils.c | 76 ++++-------------- libs/vkd3d/vkd3d_private.h | 119 +++++++++++++++++++++++++++-- 12 files changed, 266 insertions(+), 280 deletions(-) diff --git a/libs/vkd3d/cache.c b/libs/vkd3d/cache.c index 4d0ca125..26810319 100644 --- a/libs/vkd3d/cache.c +++ b/libs/vkd3d/cache.c @@ -305,7 +305,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_pipeline_library_SetPrivateData(d3d12_pip TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&pipeline_library->private_store, guid, data_size, data); + return vkd3d_set_private_data(&pipeline_library->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_pipeline_library_SetPrivateDataInterface(d3d12_pipeline_library_iface *iface, @@ -315,14 +316,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_pipeline_library_SetPrivateDataInterface( TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&pipeline_library->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_pipeline_library_SetName(d3d12_pipeline_library_iface *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&pipeline_library->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_pipeline_library_GetDevice(d3d12_pipeline_library_iface *iface, @@ -604,7 +599,7 @@ static CONST_VTBL struct ID3D12PipelineLibrary1Vtbl d3d12_pipeline_library_vtbl d3d12_pipeline_library_GetPrivateData, d3d12_pipeline_library_SetPrivateData, d3d12_pipeline_library_SetPrivateDataInterface, - d3d12_pipeline_library_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_pipeline_library_GetDevice, /* ID3D12PipelineLibrary methods */ diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index aeb21bdf..c22a68c1 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -851,7 +851,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_fence_SetPrivateData(d3d12_fence_iface *i TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&fence->private_store, guid, data_size, data); + return vkd3d_set_private_data(&fence->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_fence_SetPrivateDataInterface(d3d12_fence_iface *iface, @@ -861,14 +862,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_fence_SetPrivateDataInterface(d3d12_fence TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&fence->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_fence_SetName(d3d12_fence_iface *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&fence->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_fence_GetDevice(d3d12_fence_iface *iface, REFIID iid, void **device) @@ -976,7 +971,7 @@ static CONST_VTBL struct ID3D12Fence1Vtbl d3d12_fence_vtbl = d3d12_fence_GetPrivateData, d3d12_fence_SetPrivateData, d3d12_fence_SetPrivateDataInterface, - d3d12_fence_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_fence_GetDevice, /* ID3D12Fence methods */ @@ -1494,6 +1489,12 @@ static void d3d12_command_allocator_free_resources(struct d3d12_command_allocato allocator->pass_count = 0; } +static void d3d12_command_allocator_set_name(struct d3d12_command_allocator *allocator, const char *name) +{ + vkd3d_set_vk_object_name(allocator->device, (uint64_t)allocator->vk_command_pool, + VK_OBJECT_TYPE_COMMAND_POOL, name); +} + /* ID3D12CommandAllocator */ static inline struct d3d12_command_allocator *impl_from_ID3D12CommandAllocator(ID3D12CommandAllocator *iface) { @@ -1598,7 +1599,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_SetPrivateData(ID3D12Co TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&allocator->private_store, guid, data_size, data); + return vkd3d_set_private_data(&allocator->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_command_allocator_set_name, allocator); } static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_SetPrivateDataInterface(ID3D12CommandAllocator *iface, @@ -1608,17 +1610,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_SetPrivateDataInterface TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&allocator->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_SetName(ID3D12CommandAllocator *iface, const WCHAR *name) -{ - struct d3d12_command_allocator *allocator = impl_from_ID3D12CommandAllocator(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return vkd3d_set_vk_object_name(allocator->device, (uint64_t)allocator->vk_command_pool, - VK_OBJECT_TYPE_COMMAND_POOL, name); + return vkd3d_set_private_data_interface(&allocator->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_command_allocator_set_name, allocator); } static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_GetDevice(ID3D12CommandAllocator *iface, REFIID iid, void **device) @@ -1713,7 +1706,7 @@ static CONST_VTBL struct ID3D12CommandAllocatorVtbl d3d12_command_allocator_vtbl d3d12_command_allocator_GetPrivateData, d3d12_command_allocator_SetPrivateData, d3d12_command_allocator_SetPrivateDataInterface, - d3d12_command_allocator_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_command_allocator_GetDevice, /* ID3D12CommandAllocator methods */ @@ -3531,7 +3524,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_SetPrivateData(d3d12_command TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&list->private_store, guid, data_size, data); + return vkd3d_set_private_data(&list->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_list_SetPrivateDataInterface(d3d12_command_list_iface *iface, @@ -3541,14 +3535,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_SetPrivateDataInterface(d3d1 TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&list->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_command_list_SetName(d3d12_command_list_iface *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&list->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_list_GetDevice(d3d12_command_list_iface *iface, REFIID iid, void **device) @@ -8312,7 +8300,7 @@ static CONST_VTBL struct ID3D12GraphicsCommandList5Vtbl d3d12_command_list_vtbl d3d12_command_list_GetPrivateData, d3d12_command_list_SetPrivateData, d3d12_command_list_SetPrivateDataInterface, - d3d12_command_list_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_command_list_GetDevice, /* ID3D12CommandList methods */ @@ -8572,7 +8560,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_SetPrivateData(ID3D12Comman TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&command_queue->private_store, guid, data_size, data); + return vkd3d_set_private_data(&command_queue->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_queue_SetPrivateDataInterface(ID3D12CommandQueue *iface, @@ -8582,27 +8571,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_SetPrivateDataInterface(ID3 TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&command_queue->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_command_queue_SetName(ID3D12CommandQueue *iface, const WCHAR *name) -{ - struct d3d12_command_queue *command_queue = impl_from_ID3D12CommandQueue(iface); - VkQueue vk_queue; - HRESULT hr; - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - if (!(vk_queue = vkd3d_queue_acquire(command_queue->vkd3d_queue))) - { - ERR("Failed to acquire queue %p.\n", command_queue->vkd3d_queue); - return E_FAIL; - } - - hr = vkd3d_set_vk_object_name(command_queue->device, (uint64_t)(uintptr_t)vk_queue, - VK_OBJECT_TYPE_QUEUE, name); - vkd3d_queue_release(command_queue->vkd3d_queue); - return hr; + return vkd3d_set_private_data_interface(&command_queue->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_queue_GetDevice(ID3D12CommandQueue *iface, REFIID iid, void **device) @@ -9111,7 +9081,7 @@ static CONST_VTBL struct ID3D12CommandQueueVtbl d3d12_command_queue_vtbl = d3d12_command_queue_GetPrivateData, d3d12_command_queue_SetPrivateData, d3d12_command_queue_SetPrivateDataInterface, - d3d12_command_queue_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_command_queue_GetDevice, /* ID3D12CommandQueue methods */ @@ -10186,7 +10156,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_signature_SetPrivateData(ID3D12Co TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&signature->private_store, guid, data_size, data); + return vkd3d_set_private_data(&signature->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_signature_SetPrivateDataInterface(ID3D12CommandSignature *iface, @@ -10196,14 +10167,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_signature_SetPrivateDataInterface TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&signature->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_command_signature_SetName(ID3D12CommandSignature *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&signature->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_command_signature_GetDevice(ID3D12CommandSignature *iface, REFIID iid, void **device) @@ -10225,7 +10190,7 @@ static CONST_VTBL struct ID3D12CommandSignatureVtbl d3d12_command_signature_vtbl d3d12_command_signature_GetPrivateData, d3d12_command_signature_SetPrivateData, d3d12_command_signature_SetPrivateDataInterface, - d3d12_command_signature_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_command_signature_GetDevice, }; diff --git a/libs/vkd3d/command_list_profiled.h b/libs/vkd3d/command_list_profiled.h index 9fdc23ba..9b519d97 100644 --- a/libs/vkd3d/command_list_profiled.h +++ b/libs/vkd3d/command_list_profiled.h @@ -469,7 +469,7 @@ static CONST_VTBL struct ID3D12GraphicsCommandList5Vtbl d3d12_command_list_vtbl_ d3d12_command_list_GetPrivateData, d3d12_command_list_SetPrivateData, d3d12_command_list_SetPrivateDataInterface, - d3d12_command_list_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_command_list_GetDevice, /* ID3D12CommandList methods */ diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index a5b8936f..d4744aae 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -2368,6 +2368,12 @@ static void d3d12_device_destroy(struct d3d12_device *device) vkd3d_instance_decref(device->vkd3d_instance); } +static void d3d12_device_set_name(struct d3d12_device *device, const char *name) +{ + vkd3d_set_vk_object_name(device, (uint64_t)(uintptr_t)device->vk_device, + VK_OBJECT_TYPE_DEVICE, name); +} + static ULONG STDMETHODCALLTYPE d3d12_device_Release(d3d12_device_iface *iface) { struct d3d12_device *device = impl_from_ID3D12Device(iface); @@ -2427,7 +2433,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateData(d3d12_device_iface TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&device->private_store, guid, data_size, data); + return vkd3d_set_private_data(&device->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_device_set_name, device); } static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateDataInterface(d3d12_device_iface *iface, @@ -2437,17 +2444,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateDataInterface(d3d12_devi TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&device->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_device_SetName(d3d12_device_iface *iface, const WCHAR *name) -{ - struct d3d12_device *device = impl_from_ID3D12Device(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return vkd3d_set_vk_object_name(device, (uint64_t)(uintptr_t)device->vk_device, - VK_OBJECT_TYPE_DEVICE, name); + return vkd3d_set_private_data_interface(&device->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_device_set_name, device); } static UINT STDMETHODCALLTYPE d3d12_device_GetNodeCount(d3d12_device_iface *iface) @@ -4313,7 +4311,7 @@ static CONST_VTBL struct ID3D12Device6Vtbl d3d12_device_vtbl = d3d12_device_GetPrivateData, d3d12_device_SetPrivateData, d3d12_device_SetPrivateDataInterface, - d3d12_device_SetName, + (void *)d3d12_object_SetName, /* ID3D12Device methods */ d3d12_device_GetNodeCount, d3d12_device_CreateCommandQueue, diff --git a/libs/vkd3d/device_profiled.h b/libs/vkd3d/device_profiled.h index 1bef4096..2d578600 100644 --- a/libs/vkd3d/device_profiled.h +++ b/libs/vkd3d/device_profiled.h @@ -225,7 +225,7 @@ static CONST_VTBL struct ID3D12Device6Vtbl d3d12_device_vtbl_profiled = d3d12_device_GetPrivateData, d3d12_device_SetPrivateData, d3d12_device_SetPrivateDataInterface, - d3d12_device_SetName, + (void *)d3d12_object_SetName, /* ID3D12Device methods */ d3d12_device_GetNodeCount, d3d12_device_CreateCommandQueue, diff --git a/libs/vkd3d/heap.c b/libs/vkd3d/heap.c index e98a5c20..cd8084c6 100644 --- a/libs/vkd3d/heap.c +++ b/libs/vkd3d/heap.c @@ -70,6 +70,13 @@ static void d3d12_heap_destroy(struct d3d12_heap *heap) vkd3d_free(heap); } +static void d3d12_heap_set_name(struct d3d12_heap *heap, const char *name) +{ + if (!heap->allocation.chunk) + vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->allocation.vk_memory, + VK_OBJECT_TYPE_DEVICE_MEMORY, name); +} + static ULONG STDMETHODCALLTYPE d3d12_heap_Release(d3d12_heap_iface *iface) { struct d3d12_heap *heap = impl_from_ID3D12Heap(iface); @@ -100,7 +107,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_heap_SetPrivateData(d3d12_heap_iface *ifa TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&heap->private_store, guid, data_size, data); + return vkd3d_set_private_data(&heap->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_heap_set_name, heap); } static HRESULT STDMETHODCALLTYPE d3d12_heap_SetPrivateDataInterface(d3d12_heap_iface *iface, @@ -110,20 +118,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_heap_SetPrivateDataInterface(d3d12_heap_i TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&heap->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_heap_SetName(d3d12_heap_iface *iface, const WCHAR *name) -{ - struct d3d12_heap *heap = impl_from_ID3D12Heap(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - if (!heap->allocation.chunk) - return vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->allocation.vk_memory, - VK_OBJECT_TYPE_DEVICE_MEMORY, name); - else - return S_OK; + return vkd3d_set_private_data_interface(&heap->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_heap_set_name, heap); } static HRESULT STDMETHODCALLTYPE d3d12_heap_GetDevice(d3d12_heap_iface *iface, REFIID iid, void **device) @@ -164,7 +160,7 @@ static CONST_VTBL struct ID3D12Heap1Vtbl d3d12_heap_vtbl = d3d12_heap_GetPrivateData, d3d12_heap_SetPrivateData, d3d12_heap_SetPrivateDataInterface, - d3d12_heap_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_heap_GetDevice, /* ID3D12Heap methods */ diff --git a/libs/vkd3d/raytracing_pipeline.c b/libs/vkd3d/raytracing_pipeline.c index 418e7abb..9fea4836 100644 --- a/libs/vkd3d/raytracing_pipeline.c +++ b/libs/vkd3d/raytracing_pipeline.c @@ -149,7 +149,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_state_object_SetPrivateData(ID3D12StateOb TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&state_object->private_store, guid, data_size, data); + return vkd3d_set_private_data(&state_object->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_state_object_SetPrivateDataInterface(ID3D12StateObject *iface, @@ -159,14 +160,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_state_object_SetPrivateDataInterface(ID3D TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&state_object->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_state_object_SetName(ID3D12StateObject *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&state_object->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_state_object_GetDevice(ID3D12StateObject *iface, @@ -270,7 +265,7 @@ static CONST_VTBL struct ID3D12StateObjectVtbl d3d12_state_object_vtbl = d3d12_state_object_GetPrivateData, d3d12_state_object_SetPrivateData, d3d12_state_object_SetPrivateDataInterface, - d3d12_state_object_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_state_object_GetDevice, }; diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 7fb7560f..bd61a322 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -1205,6 +1205,18 @@ static void d3d12_resource_get_level_box(const struct d3d12_resource *resource, box->back = d3d12_resource_desc_get_depth(&resource->desc, level); } +static void d3d12_resource_set_name(struct d3d12_resource *resource, const char *name) +{ + /* Multiple committed and placed buffers may refer to the same VkBuffer, + * which may cause race conditions if the app calls this concurrently */ + if (d3d12_resource_is_buffer(resource) && (resource->flags & VKD3D_RESOURCE_RESERVED)) + vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->res.vk_buffer, + VK_OBJECT_TYPE_BUFFER, name); + else if (d3d12_resource_is_texture(resource)) + vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->res.vk_image, + VK_OBJECT_TYPE_IMAGE, name); +} + /* ID3D12Resource */ static inline struct d3d12_resource *impl_from_ID3D12Resource(d3d12_resource_iface *iface) { @@ -1282,7 +1294,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_SetPrivateData(d3d12_resource_if TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&resource->private_store, guid, data_size, data); + return vkd3d_set_private_data(&resource->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_resource_set_name, resource); } static HRESULT STDMETHODCALLTYPE d3d12_resource_SetPrivateDataInterface(d3d12_resource_iface *iface, @@ -1292,25 +1305,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_SetPrivateDataInterface(d3d12_re TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&resource->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_resource_SetName(d3d12_resource_iface *iface, const WCHAR *name) -{ - struct d3d12_resource *resource = impl_from_ID3D12Resource(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - /* Multiple committed and placed buffers may refer to the same VkBuffer, - * which may cause race conditions if the app calls this concurrently */ - if (d3d12_resource_is_buffer(resource) && (resource->flags & VKD3D_RESOURCE_RESERVED)) - return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->res.vk_buffer, - VK_OBJECT_TYPE_BUFFER, name); - else if (d3d12_resource_is_texture(resource)) - return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->res.vk_image, - VK_OBJECT_TYPE_IMAGE, name); - else - return S_OK; + return vkd3d_set_private_data_interface(&resource->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_resource_set_name, resource); } static HRESULT STDMETHODCALLTYPE d3d12_resource_GetDevice(d3d12_resource_iface *iface, REFIID iid, void **device) @@ -1683,7 +1679,7 @@ static CONST_VTBL struct ID3D12Resource1Vtbl d3d12_resource_vtbl = d3d12_resource_GetPrivateData, d3d12_resource_SetPrivateData, d3d12_resource_SetPrivateDataInterface, - d3d12_resource_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_resource_GetDevice, /* ID3D12Resource methods */ @@ -4738,7 +4734,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_descriptor_heap_SetPrivateData(ID3D12Desc TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&heap->private_store, guid, data_size, data); + return vkd3d_set_private_data(&heap->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_descriptor_heap_SetPrivateDataInterface(ID3D12DescriptorHeap *iface, @@ -4748,14 +4745,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_descriptor_heap_SetPrivateDataInterface(I TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&heap->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_descriptor_heap_SetName(ID3D12DescriptorHeap *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&heap->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_descriptor_heap_GetDevice(ID3D12DescriptorHeap *iface, REFIID iid, void **device) @@ -4812,7 +4803,7 @@ static CONST_VTBL struct ID3D12DescriptorHeapVtbl d3d12_descriptor_heap_vtbl = d3d12_descriptor_heap_GetPrivateData, d3d12_descriptor_heap_SetPrivateData, d3d12_descriptor_heap_SetPrivateDataInterface, - d3d12_descriptor_heap_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_descriptor_heap_GetDevice, /* ID3D12DescriptorHeap methods */ @@ -5307,6 +5298,20 @@ void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap #endif } +static void d3d12_query_heap_set_name(struct d3d12_query_heap *heap, const char *name) +{ + if (heap->vk_query_pool) + { + vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->vk_query_pool, + VK_OBJECT_TYPE_QUERY_POOL, name); + } + else /*if (heap->vk_buffer)*/ + { + vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->vk_buffer, + VK_OBJECT_TYPE_BUFFER, name); + } +} + /* ID3D12QueryHeap */ static inline struct d3d12_query_heap *impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface) { @@ -5388,7 +5393,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_query_heap_SetPrivateData(ID3D12QueryHeap TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&heap->private_store, guid, data_size, data); + return vkd3d_set_private_data(&heap->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_query_heap_set_name, heap); } static HRESULT STDMETHODCALLTYPE d3d12_query_heap_SetPrivateDataInterface(ID3D12QueryHeap *iface, @@ -5398,25 +5404,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_query_heap_SetPrivateDataInterface(ID3D12 TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&heap->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_query_heap_SetName(ID3D12QueryHeap *iface, const WCHAR *name) -{ - struct d3d12_query_heap *heap = impl_from_ID3D12QueryHeap(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - if (heap->vk_query_pool) - { - return vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->vk_query_pool, - VK_OBJECT_TYPE_QUERY_POOL, name); - } - else /*if (heap->vk_buffer)*/ - { - return vkd3d_set_vk_object_name(heap->device, (uint64_t)heap->vk_buffer, - VK_OBJECT_TYPE_BUFFER, name); - } + return vkd3d_set_private_data_interface(&heap->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_query_heap_set_name, heap); } static HRESULT STDMETHODCALLTYPE d3d12_query_heap_GetDevice(ID3D12QueryHeap *iface, REFIID iid, void **device) @@ -5438,7 +5427,7 @@ static CONST_VTBL struct ID3D12QueryHeapVtbl d3d12_query_heap_vtbl = d3d12_query_heap_GetPrivateData, d3d12_query_heap_SetPrivateData, d3d12_query_heap_SetPrivateDataInterface, - d3d12_query_heap_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_query_heap_GetDevice, }; @@ -5863,27 +5852,27 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, goto fail; /* set Vulkan object names */ - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_buffer, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_buffer, VK_OBJECT_TYPE_BUFFER, "NULL buffer"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_buffer_view, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_buffer_view, VK_OBJECT_TYPE_BUFFER_VIEW, "NULL buffer view"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_buffer_memory, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_buffer_memory, VK_OBJECT_TYPE_DEVICE_MEMORY, "NULL memory"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_storage_buffer, VK_OBJECT_TYPE_BUFFER, "NULL UAV buffer"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer_view, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_storage_buffer_view, VK_OBJECT_TYPE_BUFFER_VIEW, "NULL UAV buffer view"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_2d_image, VK_OBJECT_TYPE_IMAGE, "NULL 2D SRV image"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image_memory, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_2d_image_memory, VK_OBJECT_TYPE_DEVICE_MEMORY, "NULL 2D SRV memory"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_2d_storage_image, VK_OBJECT_TYPE_IMAGE, "NULL 2D UAV image"); if (!use_sparse_resources) { - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer_memory, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_storage_buffer_memory, VK_OBJECT_TYPE_DEVICE_MEMORY, "NULL UAV buffer memory"); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image_memory, + vkd3d_set_vk_object_name(device, (uint64_t)null_resources->vk_2d_storage_image_memory, VK_OBJECT_TYPE_DEVICE_MEMORY, "NULL 2D UAV memory"); } diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 15a44c58..f4e7f139 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -113,7 +113,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_root_signature_SetPrivateData(ID3D12RootS TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&root_signature->private_store, guid, data_size, data); + return vkd3d_set_private_data(&root_signature->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_root_signature_SetPrivateDataInterface(ID3D12RootSignature *iface, @@ -123,14 +124,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_root_signature_SetPrivateDataInterface(ID TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&root_signature->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_root_signature_SetName(ID3D12RootSignature *iface, const WCHAR *name) -{ - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&root_signature->private_store, guid, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_root_signature_GetDevice(ID3D12RootSignature *iface, @@ -153,7 +148,7 @@ static CONST_VTBL struct ID3D12RootSignatureVtbl d3d12_root_signature_vtbl = d3d12_root_signature_GetPrivateData, d3d12_root_signature_SetPrivateData, d3d12_root_signature_SetPrivateDataInterface, - d3d12_root_signature_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_root_signature_GetDevice, }; @@ -1671,6 +1666,15 @@ static void d3d12_pipeline_state_destroy_graphics(struct d3d12_pipeline_state *s VK_CALL(vkDestroyPipeline(device->vk_device, graphics->pipeline, NULL)); } +static void d3d12_pipeline_state_set_name(struct d3d12_pipeline_state *state, const char *name) +{ + if (d3d12_pipeline_state_is_compute(state)) + { + vkd3d_set_vk_object_name(state->device, (uint64_t)state->compute.vk_pipeline, + VK_OBJECT_TYPE_PIPELINE, name); + } +} + static ULONG STDMETHODCALLTYPE d3d12_pipeline_state_Release(ID3D12PipelineState *iface) { struct d3d12_pipeline_state *state = impl_from_ID3D12PipelineState(iface); @@ -1720,7 +1724,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_SetPrivateData(ID3D12Pipel TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&state->private_store, guid, data_size, data); + return vkd3d_set_private_data(&state->private_store, guid, data_size, data, + (vkd3d_set_name_callback) d3d12_pipeline_state_set_name, state); } static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_SetPrivateDataInterface(ID3D12PipelineState *iface, @@ -1730,22 +1735,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_SetPrivateDataInterface(ID TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); - return vkd3d_set_private_data_interface(&state->private_store, guid, data); -} - -static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_SetName(ID3D12PipelineState *iface, const WCHAR *name) -{ - struct d3d12_pipeline_state *state = impl_from_ID3D12PipelineState(iface); - - TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - - if (d3d12_pipeline_state_is_compute(state)) - { - return vkd3d_set_vk_object_name(state->device, (uint64_t)state->compute.vk_pipeline, - VK_OBJECT_TYPE_PIPELINE, name); - } - - return name ? S_OK : E_INVALIDARG; + return vkd3d_set_private_data_interface(&state->private_store, guid, data, + (vkd3d_set_name_callback) d3d12_pipeline_state_set_name, state); } static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_GetDevice(ID3D12PipelineState *iface, @@ -1803,7 +1794,7 @@ static CONST_VTBL struct ID3D12PipelineStateVtbl d3d12_pipeline_state_vtbl = d3d12_pipeline_state_GetPrivateData, d3d12_pipeline_state_SetPrivateData, d3d12_pipeline_state_SetPrivateDataInterface, - d3d12_pipeline_state_SetName, + (void *)d3d12_object_SetName, /* ID3D12DeviceChild methods */ d3d12_pipeline_state_GetDevice, /* ID3D12PipelineState methods */ @@ -1861,7 +1852,7 @@ static HRESULT create_shader_stage(struct d3d12_device *device, /* Helpful for tooling like RenderDoc. */ sprintf(hash_str, "%016"PRIx64, spirv.meta.hash); - vkd3d_set_vk_object_name_utf8(device, (uint64_t)stage_desc->module, VK_OBJECT_TYPE_SHADER_MODULE, hash_str); + vkd3d_set_vk_object_name(device, (uint64_t)stage_desc->module, VK_OBJECT_TYPE_SHADER_MODULE, hash_str); return S_OK; } diff --git a/libs/vkd3d/swapchain.c b/libs/vkd3d/swapchain.c index 86919c25..ff0b9393 100644 --- a/libs/vkd3d/swapchain.c +++ b/libs/vkd3d/swapchain.c @@ -1595,7 +1595,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_SetPrivateData(dxgi_swapchain_i TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return vkd3d_set_private_data(&swapchain->private_store, guid, data_size, data); + return vkd3d_set_private_data(&swapchain->private_store, guid, data_size, data, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_swapchain_SetPrivateDataInterface(dxgi_swapchain_iface *iface, @@ -1605,7 +1606,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_SetPrivateDataInterface(dxgi_sw TRACE("iface %p, guid %s, object %p.\n", iface, debugstr_guid(guid), object); - return vkd3d_set_private_data_interface(&swapchain->private_store, guid, object); + return vkd3d_set_private_data_interface(&swapchain->private_store, guid, object, + NULL, NULL); } static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetPrivateData(dxgi_swapchain_iface *iface, diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c index 970e87ad..2de1c552 100644 --- a/libs/vkd3d/utils.c +++ b/libs/vkd3d/utils.c @@ -1022,7 +1022,7 @@ static struct vkd3d_private_data *vkd3d_private_store_get_private_data( return NULL; } -static HRESULT vkd3d_private_store_set_private_data(struct vkd3d_private_store *store, +HRESULT vkd3d_private_store_set_private_data(struct vkd3d_private_store *store, const GUID *tag, const void *data, unsigned int data_size, bool is_object) { struct vkd3d_private_data *d, *old_data; @@ -1067,18 +1067,14 @@ HRESULT vkd3d_get_private_data(struct vkd3d_private_store *store, const GUID *tag, unsigned int *out_size, void *out) { const struct vkd3d_private_data *data; - HRESULT hr = S_OK; unsigned int size; - int rc; + HRESULT hr; if (!out_size) return E_INVALIDARG; - if ((rc = pthread_mutex_lock(&store->mutex))) - { - ERR("Failed to lock mutex, error %d.\n", rc); - return hresult_from_errno(rc); - } + if (FAILED(hr = vkd3d_private_data_lock(store))) + return hr; if (!(data = vkd3d_private_store_get_private_data(store, tag))) { @@ -1103,52 +1099,28 @@ HRESULT vkd3d_get_private_data(struct vkd3d_private_store *store, memcpy(out, data->data, data->size); done: - pthread_mutex_unlock(&store->mutex); + vkd3d_private_data_unlock(store); return hr; } -HRESULT vkd3d_set_private_data(struct vkd3d_private_store *store, - const GUID *tag, unsigned int data_size, const void *data) +HRESULT STDMETHODCALLTYPE d3d12_object_SetName(ID3D12Object *iface, const WCHAR *name) { - HRESULT hr; - int rc; + size_t size = 0; - if ((rc = pthread_mutex_lock(&store->mutex))) - { - ERR("Failed to lock mutex, error %d.\n", rc); - return hresult_from_errno(rc); - } + TRACE("iface %p, name %s.\n", iface, debugstr_w(name)); - hr = vkd3d_private_store_set_private_data(store, tag, data, data_size, false); + if (name) + size = sizeof(WCHAR) * (vkd3d_wcslen(name) + 1); - pthread_mutex_unlock(&store->mutex); - return hr; + return ID3D12Object_SetPrivateData(iface, &WKPDID_D3DDebugObjectNameW, size, name); } -HRESULT vkd3d_set_private_data_interface(struct vkd3d_private_store *store, - const GUID *tag, const IUnknown *object) -{ - const void *data = object ? object : (void *)&object; - HRESULT hr; - int rc; - - if ((rc = pthread_mutex_lock(&store->mutex))) - { - ERR("Failed to lock mutex, error %d.\n", rc); - return hresult_from_errno(rc); - } - - hr = vkd3d_private_store_set_private_data(store, tag, data, sizeof(object), !!object); - - pthread_mutex_unlock(&store->mutex); - return hr; -} - -VkResult vkd3d_set_vk_object_name_utf8(struct d3d12_device *device, uint64_t vk_object, +HRESULT vkd3d_set_vk_object_name(struct d3d12_device *device, uint64_t vk_object, VkObjectType vk_object_type, const char *name) { const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; VkDebugUtilsObjectNameInfoEXT info; + VkResult vr; if (!device->vk_info.EXT_debug_utils) return VK_SUCCESS; @@ -1158,28 +1130,8 @@ VkResult vkd3d_set_vk_object_name_utf8(struct d3d12_device *device, uint64_t vk_ info.objectType = vk_object_type; info.objectHandle = vk_object; info.pObjectName = name; - return VK_CALL(vkSetDebugUtilsObjectNameEXT(device->vk_device, &info)); -} - -HRESULT vkd3d_set_vk_object_name(struct d3d12_device *device, uint64_t vk_object, - VkObjectType vk_object_type, const WCHAR *name) -{ - char *name_utf8; - VkResult vr; - - if (!name) - return E_INVALIDARG; - - if (!device->vk_info.EXT_debug_utils) - return S_OK; - - if (!(name_utf8 = vkd3d_strdup_w_utf8(name, 0))) - return E_OUTOFMEMORY; - - vr = vkd3d_set_vk_object_name_utf8(device, vk_object, vk_object_type, name_utf8); - - vkd3d_free(name_utf8); + vr = VK_CALL(vkSetDebugUtilsObjectNameEXT(device->vk_device, &info)); return hresult_from_vk_result(vr); } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 6ed1a85b..313037fd 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -36,7 +36,7 @@ #include "vkd3d_threads.h" #include "vkd3d_platform.h" #include "vkd3d_swapchain_factory.h" - +#include "vkd3d_string.h" #include #include #include @@ -406,12 +406,117 @@ static inline void vkd3d_private_store_destroy(struct vkd3d_private_store *store pthread_mutex_destroy(&store->mutex); } +static inline HRESULT vkd3d_private_data_lock(struct vkd3d_private_store *store) +{ + int rc; + if ((rc = pthread_mutex_lock(&store->mutex))) + { + ERR("Failed to lock mutex, error %d.\n", rc); + return hresult_from_errno(rc); + } + + return S_OK; +} + +static inline void vkd3d_private_data_unlock(struct vkd3d_private_store *store) +{ + pthread_mutex_unlock(&store->mutex); +} + HRESULT vkd3d_get_private_data(struct vkd3d_private_store *store, const GUID *tag, unsigned int *out_size, void *out); -HRESULT vkd3d_set_private_data(struct vkd3d_private_store *store, - const GUID *tag, unsigned int data_size, const void *data); -HRESULT vkd3d_set_private_data_interface(struct vkd3d_private_store *store, - const GUID *tag, const IUnknown *object); + +HRESULT vkd3d_private_store_set_private_data(struct vkd3d_private_store *store, + const GUID *tag, const void *data, unsigned int data_size, bool is_object); + +typedef void(*vkd3d_set_name_callback)(void *, const char *); + +static inline bool vkd3d_private_data_object_name_ptr(REFGUID guid, + UINT data_size, const void *data, const char **out_name) +{ + if (out_name) + *out_name = NULL; + + if (IsEqualGUID(guid, &WKPDID_D3DDebugObjectName)) + { + const char *name = (const char *)data; + + if (!data || !data_size) + return true; + + if (out_name) + *out_name = name[data_size - 1] != '\0' + ? vkd3d_strdup_n(name, data_size) + : name; + + return true; + } + else if (IsEqualGUID(guid, &WKPDID_D3DDebugObjectNameW)) + { + const WCHAR *name = (const WCHAR *)data; + + if (!data || data_size < sizeof(WCHAR)) + return true; + + if (out_name) + *out_name = vkd3d_strdup_w_utf8(name, data_size / sizeof(WCHAR)); + return true; + } + + return false; +} + +static inline HRESULT vkd3d_set_private_data(struct vkd3d_private_store *store, + const GUID *tag, unsigned int data_size, const void *data, + vkd3d_set_name_callback set_name_callback, void *calling_object) +{ + const char *name; + HRESULT hr; + + if (FAILED(hr = vkd3d_private_data_lock(store))) + return hr; + + if (FAILED(hr = vkd3d_private_store_set_private_data(store, tag, data, data_size, false))) + { + vkd3d_private_data_unlock(store); + return hr; + } + + if (set_name_callback && vkd3d_private_data_object_name_ptr(tag, data_size, data, &name)) + { + set_name_callback(calling_object, name); + if (name && name != data) + vkd3d_free((void *)name); + } + + vkd3d_private_data_unlock(store); + return hr; +} + +static inline HRESULT vkd3d_set_private_data_interface(struct vkd3d_private_store *store, + const GUID *tag, const IUnknown *object, + vkd3d_set_name_callback set_name_callback, void *calling_object) +{ + const void *data = object ? object : (void *)&object; + HRESULT hr; + + if (FAILED(hr = vkd3d_private_data_lock(store))) + return hr; + + if (FAILED(hr = vkd3d_private_store_set_private_data(store, tag, data, sizeof(object), !!object))) + { + vkd3d_private_data_unlock(store); + return hr; + } + + if (set_name_callback && vkd3d_private_data_object_name_ptr(tag, 0, NULL, NULL)) + set_name_callback(calling_object, NULL); + + vkd3d_private_data_unlock(store); + return hr; +} + +HRESULT STDMETHODCALLTYPE d3d12_object_SetName(ID3D12Object *iface, const WCHAR *name); /* ID3D12Fence */ typedef ID3D12Fence1 d3d12_fence_iface; @@ -2669,10 +2774,8 @@ HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs, const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device); -VkResult vkd3d_set_vk_object_name_utf8(struct d3d12_device *device, uint64_t vk_object, - VkObjectType vk_object_type, const char *name); HRESULT vkd3d_set_vk_object_name(struct d3d12_device *device, uint64_t vk_object, - VkObjectType vk_object_type, const WCHAR *name); + VkObjectType vk_object_type, const char *name); enum VkPrimitiveTopology vk_topology_from_d3d12_topology(D3D12_PRIMITIVE_TOPOLOGY topology);