From 7e9a423ae4ef792e4262190f57a6c62b8ec76a89 Mon Sep 17 00:00:00 2001 From: Aaron Leiby Date: Mon, 6 Jan 2025 14:07:54 -0800 Subject: [PATCH] Implement SetPrivateData WKPDID_D3DDebugObjectName for select resources: buffers, fences, textures, views. --- src/d3d11/d3d11_buffer.h | 7 ++++++- src/d3d11/d3d11_device_child.h | 5 +++++ src/d3d11/d3d11_fence.h | 7 ++++++- src/d3d11/d3d11_texture.h | 15 +++++++++++++++ src/d3d11/d3d11_view_dsv.h | 5 +++++ src/d3d11/d3d11_view_rtv.h | 5 +++++ src/d3d11/d3d11_view_srv.h | 7 +++++++ src/d3d11/d3d11_view_uav.h | 9 +++++++++ src/dxvk/dxvk_buffer.cpp | 34 +++++++++++++++++++++++++++++++++- src/dxvk/dxvk_buffer.h | 14 ++++++++++++++ src/dxvk/dxvk_fence.cpp | 16 ++++++++++++++++ src/dxvk/dxvk_fence.h | 7 +++++++ src/dxvk/dxvk_image.cpp | 33 ++++++++++++++++++++++++++++++++- src/dxvk/dxvk_image.h | 14 ++++++++++++++ 14 files changed, 174 insertions(+), 4 deletions(-) diff --git a/src/d3d11/d3d11_buffer.h b/src/d3d11/d3d11_buffer.h index b65df66a6..ca425d68e 100644 --- a/src/d3d11/d3d11_buffer.h +++ b/src/d3d11/d3d11_buffer.h @@ -181,7 +181,12 @@ namespace dxvk { D3D11_BUFFER_DESC* pBufferDesc); private: - + + virtual void SetD3DDebugObjectName(const char* name) { + if (m_buffer) + m_buffer->setDebugName(name); + } + D3D11_BUFFER_DESC m_desc; D3D11_ON_12_RESOURCE_INFO m_11on12; D3D11_COMMON_BUFFER_MAP_MODE m_mapMode; diff --git a/src/d3d11/d3d11_device_child.h b/src/d3d11/d3d11_device_child.h index 60eff07af..ca4399568 100644 --- a/src/d3d11/d3d11_device_child.h +++ b/src/d3d11/d3d11_device_child.h @@ -1,5 +1,6 @@ #pragma once +#include #include "d3d11_include.h" #include "../util/com/com_private_data.h" @@ -30,6 +31,8 @@ namespace dxvk { REFGUID guid, UINT DataSize, const void *pData) final { + if (guid == WKPDID_D3DDebugObjectName) + SetD3DDebugObjectName((const char*)pData); return m_privateData.setData( guid, DataSize, pData); } @@ -55,6 +58,8 @@ namespace dxvk { } D3D11Device* const m_parent; + + virtual void SetD3DDebugObjectName(const char* name) {} private: diff --git a/src/d3d11/d3d11_fence.h b/src/d3d11/d3d11_fence.h index 99d42a943..7e17356ef 100644 --- a/src/d3d11/d3d11_fence.h +++ b/src/d3d11/d3d11_fence.h @@ -40,7 +40,12 @@ namespace dxvk { } private: - + + virtual void SetD3DDebugObjectName(const char* name) { + if (m_fence) + m_fence->setDebugName(name); + } + Rc m_fence; D3D11_FENCE_FLAG m_flags; diff --git a/src/d3d11/d3d11_texture.h b/src/d3d11/d3d11_texture.h index 5e799afc1..6f43fd283 100644 --- a/src/d3d11/d3d11_texture.h +++ b/src/d3d11/d3d11_texture.h @@ -769,6 +769,11 @@ namespace dxvk { private: + virtual void SetD3DDebugObjectName(const char* name) { + if (m_texture.GetImage()) + m_texture.GetImage()->setDebugName(name); + } + D3D11CommonTexture m_texture; D3D11VkInteropSurface m_interop; D3D11DXGISurface m_surface; @@ -834,6 +839,11 @@ namespace dxvk { } private: + + virtual void SetD3DDebugObjectName(const char* name) { + if (m_texture.GetImage()) + m_texture.GetImage()->setDebugName(name); + } D3D11CommonTexture m_texture; D3D11VkInteropSurface m_interop; @@ -884,6 +894,11 @@ namespace dxvk { } private: + + virtual void SetD3DDebugObjectName(const char* name) { + if (m_texture.GetImage()) + m_texture.GetImage()->setDebugName(name); + } D3D11CommonTexture m_texture; D3D11VkInteropSurface m_interop; diff --git a/src/d3d11/d3d11_view_dsv.h b/src/d3d11/d3d11_view_dsv.h index d4ca554f7..216a7cda8 100644 --- a/src/d3d11/d3d11_view_dsv.h +++ b/src/d3d11/d3d11_view_dsv.h @@ -91,6 +91,11 @@ namespace dxvk { private: + virtual void SetD3DDebugObjectName(const char* name) { + if (m_view) + m_view->setDebugName(name); + } + ID3D11Resource* m_resource; D3D11_DEPTH_STENCIL_VIEW_DESC m_desc; D3D11_VK_VIEW_INFO m_info; diff --git a/src/d3d11/d3d11_view_rtv.h b/src/d3d11/d3d11_view_rtv.h index 13ab73323..4fb6dc0dd 100644 --- a/src/d3d11/d3d11_view_rtv.h +++ b/src/d3d11/d3d11_view_rtv.h @@ -80,6 +80,11 @@ namespace dxvk { private: + virtual void SetD3DDebugObjectName(const char* name) { + if (m_view) + m_view->setDebugName(name); + } + ID3D11Resource* m_resource; D3D11_RENDER_TARGET_VIEW_DESC1 m_desc; D3D11_VK_VIEW_INFO m_info; diff --git a/src/d3d11/d3d11_view_srv.h b/src/d3d11/d3d11_view_srv.h index e7c5872ec..17f60f03e 100644 --- a/src/d3d11/d3d11_view_srv.h +++ b/src/d3d11/d3d11_view_srv.h @@ -82,6 +82,13 @@ namespace dxvk { private: + virtual void SetD3DDebugObjectName(const char* name) { + if (m_bufferView) + m_bufferView->setDebugName(name); + if (m_imageView) + m_imageView->setDebugName(name); + } + ID3D11Resource* m_resource; D3D11_SHADER_RESOURCE_VIEW_DESC1 m_desc; D3D11_VK_VIEW_INFO m_info; diff --git a/src/d3d11/d3d11_view_uav.h b/src/d3d11/d3d11_view_uav.h index c86eba5fa..03ebb3405 100644 --- a/src/d3d11/d3d11_view_uav.h +++ b/src/d3d11/d3d11_view_uav.h @@ -78,6 +78,15 @@ namespace dxvk { private: + virtual void SetD3DDebugObjectName(const char* name) { + if (m_bufferView) + m_bufferView->setDebugName(name); + if (m_imageView) + m_imageView->setDebugName(name); + if (m_counterView) + m_counterView->setDebugName(name); + } + ID3D11Resource* m_resource; D3D11_UNORDERED_ACCESS_VIEW_DESC1 m_desc; D3D11_VK_VIEW_INFO m_info; diff --git a/src/dxvk/dxvk_buffer.cpp b/src/dxvk/dxvk_buffer.cpp index 1f71da961..00df89ed0 100644 --- a/src/dxvk/dxvk_buffer.cpp +++ b/src/dxvk/dxvk_buffer.cpp @@ -99,5 +99,37 @@ namespace dxvk { return m_allocator->createBufferResource(info, allocationInfo, nullptr); } - + + + void DxvkBuffer::setDebugName( + const char* name) { + if (!m_vkd->vkSetDebugUtilsObjectNameEXT) + return; + + VkDebugUtilsObjectNameInfoEXT nameInfo{}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = nullptr; + nameInfo.objectType = VK_OBJECT_TYPE_BUFFER; + nameInfo.objectHandle = (uint64_t)storage()->getBufferInfo().buffer; + nameInfo.pObjectName = name; + + m_vkd->vkSetDebugUtilsObjectNameEXT(m_vkd->device(), &nameInfo); + } + + + void DxvkBufferView::setDebugName( + const char* name) { + if (!m_buffer->m_vkd->vkSetDebugUtilsObjectNameEXT) + return; + + VkDebugUtilsObjectNameInfoEXT nameInfo{}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = nullptr; + nameInfo.objectType = VK_OBJECT_TYPE_BUFFER_VIEW; + nameInfo.objectHandle = (uint64_t)handle(); + nameInfo.pObjectName = name; + + m_buffer->m_vkd->vkSetDebugUtilsObjectNameEXT(m_buffer->m_vkd->device(), &nameInfo); + } + } diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index c287b89cc..90d11c760 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -132,6 +132,13 @@ namespace dxvk { return lookupFormatInfo(m_key.format); } + /** + * \brief Sets debug name for this resources when markers are enabled + * + * \params[in] name Name of the resource to set + */ + void setDebugName(const char* name); + private: DxvkBuffer* m_buffer = nullptr; @@ -406,6 +413,13 @@ namespace dxvk { Rc relocateStorage( DxvkAllocationModes mode); + /** + * \brief Sets debug name for this resources when markers are enabled + * + * \params[in] name Name of the resource to set + */ + void setDebugName(const char* name); + private: Rc m_vkd; diff --git a/src/dxvk/dxvk_fence.cpp b/src/dxvk/dxvk_fence.cpp index 8e2b7c6a6..96b8d6b9c 100644 --- a/src/dxvk/dxvk_fence.cpp +++ b/src/dxvk/dxvk_fence.cpp @@ -181,4 +181,20 @@ namespace dxvk { return sharedHandle; } + + void DxvkFence::setDebugName( + const char* name) { + if (!m_vkd->vkSetDebugUtilsObjectNameEXT) + return; + + VkDebugUtilsObjectNameInfoEXT nameInfo{}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = nullptr; + nameInfo.objectType = VK_OBJECT_TYPE_FENCE; + nameInfo.objectHandle = (uint64_t)m_semaphore; + nameInfo.pObjectName = name; + + m_vkd->vkSetDebugUtilsObjectNameEXT(m_vkd->device(), &nameInfo); + } + } diff --git a/src/dxvk/dxvk_fence.h b/src/dxvk/dxvk_fence.h index ffa2556d4..da96d0ac1 100644 --- a/src/dxvk/dxvk_fence.h +++ b/src/dxvk/dxvk_fence.h @@ -97,6 +97,13 @@ namespace dxvk { */ void wait(uint64_t value); + /** + * \brief Sets debug name for this resources when markers are enabled + * + * \params[in] name Name of the resource to set + */ + void setDebugName(const char* name); + private: struct QueueItem { diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index bc25c49be..f143d0230 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -283,6 +283,22 @@ namespace dxvk { } + void DxvkImage::setDebugName( + const char* name) { + if (!m_vkd->vkSetDebugUtilsObjectNameEXT) + return; + + VkDebugUtilsObjectNameInfoEXT nameInfo{}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = nullptr; + nameInfo.objectType = VK_OBJECT_TYPE_IMAGE; + nameInfo.objectHandle = (uint64_t)storage()->getImageInfo().image; + nameInfo.pObjectName = name; + + m_vkd->vkSetDebugUtilsObjectNameEXT(m_vkd->device(), &nameInfo); + } + + VkImageCreateInfo DxvkImage::getImageCreateInfo( const DxvkImageUsageInfo& usageInfo) const { VkImageCreateInfo info = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO }; @@ -452,5 +468,20 @@ namespace dxvk { m_version = m_image->m_version; } - + + void DxvkImageView::setDebugName( + const char* name) { + if (!m_image->m_vkd->vkSetDebugUtilsObjectNameEXT) + return; + + VkDebugUtilsObjectNameInfoEXT nameInfo{}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = nullptr; + nameInfo.objectType = VK_OBJECT_TYPE_IMAGE_VIEW; + nameInfo.objectHandle = (uint64_t)handle(); + nameInfo.pObjectName = name; + + m_image->m_vkd->vkSetDebugUtilsObjectNameEXT(m_image->m_vkd->device(), &nameInfo); + } + } diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index f98184370..6f415a004 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -263,6 +263,13 @@ namespace dxvk { view->imageSubresources()); } + /** + * \brief Sets debug name for this resources when markers are enabled + * + * \params[in] name Name of the resource to set + */ + void setDebugName(const char* name); + private: DxvkImage* m_image = nullptr; @@ -601,6 +608,13 @@ namespace dxvk { bool isInitialized( const VkImageSubresourceRange& subresources) const; + /** + * \brief Sets debug name for this resources when markers are enabled + * + * \params[in] name Name of the resource to set + */ + void setDebugName(const char* name); + private: Rc m_vkd;