mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-08 01:54:15 +01:00
[dxvk] Add support for resource debug names
This commit is contained in:
parent
7f4f927980
commit
2507820339
@ -19,6 +19,14 @@ namespace dxvk {
|
||||
m_info (createInfo) {
|
||||
m_allocator->registerResource(this);
|
||||
|
||||
// Assign debug name to buffer
|
||||
if (device->isDebugEnabled()) {
|
||||
m_debugName = createDebugName(createInfo.debugName);
|
||||
m_info.debugName = m_debugName.c_str();
|
||||
} else {
|
||||
m_info.debugName = nullptr;
|
||||
}
|
||||
|
||||
// Create and assign actual buffer resource
|
||||
assignStorage(allocateStorage());
|
||||
}
|
||||
@ -100,4 +108,32 @@ namespace dxvk {
|
||||
return m_allocator->createBufferResource(info, allocationInfo, nullptr);
|
||||
}
|
||||
|
||||
|
||||
void DxvkBuffer::setDebugName(const char* name) {
|
||||
if (likely(!m_info.debugName))
|
||||
return;
|
||||
|
||||
m_debugName = createDebugName(name);
|
||||
m_info.debugName = m_debugName.c_str();
|
||||
|
||||
updateDebugName();
|
||||
}
|
||||
|
||||
|
||||
void DxvkBuffer::updateDebugName() {
|
||||
if (m_storage->flags().test(DxvkAllocationFlag::OwnsBuffer)) {
|
||||
VkDebugUtilsObjectNameInfoEXT nameInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT };
|
||||
nameInfo.objectType = VK_OBJECT_TYPE_BUFFER;
|
||||
nameInfo.objectHandle = vk::getObjectHandle(m_bufferInfo.buffer);
|
||||
nameInfo.pObjectName = m_info.debugName;
|
||||
|
||||
m_vkd->vkSetDebugUtilsObjectNameEXT(m_vkd->device(), &nameInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string DxvkBuffer::createDebugName(const char* name) const {
|
||||
return str::format(vk::isValidDebugName(name) ? name : "Buffer", " (", cookie(), ")");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,9 @@ namespace dxvk {
|
||||
|
||||
/// Buffer create flags
|
||||
VkBufferCreateFlags flags = 0;
|
||||
|
||||
/// Debug name.
|
||||
const char* debugName = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@ -341,6 +344,9 @@ namespace dxvk {
|
||||
m_storage = std::move(slice);
|
||||
m_bufferInfo = m_storage->getBufferInfo();
|
||||
|
||||
if (unlikely(m_info.debugName))
|
||||
updateDebugName();
|
||||
|
||||
// Implicitly invalidate views
|
||||
m_version += 1u;
|
||||
return result;
|
||||
@ -406,6 +412,12 @@ namespace dxvk {
|
||||
Rc<DxvkResourceAllocation> relocateStorage(
|
||||
DxvkAllocationModes mode);
|
||||
|
||||
/**
|
||||
* \brief Sets debug name for the backing resource
|
||||
* \param [in] name New debug name
|
||||
*/
|
||||
void setDebugName(const char* name);
|
||||
|
||||
private:
|
||||
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
@ -429,6 +441,12 @@ namespace dxvk {
|
||||
std::unordered_map<DxvkBufferViewKey,
|
||||
DxvkBufferView, DxvkHash, DxvkEq> m_views;
|
||||
|
||||
std::string m_debugName;
|
||||
|
||||
void updateDebugName();
|
||||
|
||||
std::string createDebugName(const char* name) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -2495,6 +2495,14 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::setDebugName(const Rc<DxvkPagedResource>& resource, const char* name) {
|
||||
if (!m_device->isDebugEnabled())
|
||||
return;
|
||||
|
||||
resource->setDebugName(name);
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::blitImageFb(
|
||||
Rc<DxvkImageView> dstView,
|
||||
const VkOffset3D* dstOffsets,
|
||||
|
@ -1365,6 +1365,14 @@ namespace dxvk {
|
||||
m_cmd->addStatCtr(counter, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sets new debug name for a resource
|
||||
*
|
||||
* \param [in] buffer Buffer object
|
||||
* \param [in] name New debug name, or \c nullptr
|
||||
*/
|
||||
void setDebugName(const Rc<DxvkPagedResource>& resource, const char* name);
|
||||
|
||||
private:
|
||||
|
||||
Rc<DxvkDevice> m_device;
|
||||
|
@ -18,6 +18,14 @@ namespace dxvk {
|
||||
|
||||
copyFormatList(createInfo.viewFormatCount, createInfo.viewFormats);
|
||||
|
||||
// Assign debug name to image
|
||||
if (device->isDebugEnabled()) {
|
||||
m_debugName = createDebugName(createInfo.debugName);
|
||||
m_info.debugName = m_debugName.c_str();
|
||||
} else {
|
||||
m_info.debugName = nullptr;
|
||||
}
|
||||
|
||||
// Always enable depth-stencil attachment usage for depth-stencil
|
||||
// formats since some internal operations rely on it. Read-only
|
||||
// versions of these make little sense to begin with.
|
||||
@ -228,6 +236,9 @@ namespace dxvk {
|
||||
m_info.viewFormats = m_viewFormats.data();
|
||||
}
|
||||
|
||||
if (unlikely(m_info.debugName))
|
||||
updateDebugName();
|
||||
|
||||
m_stableAddress |= usageInfo.stableGpuAddress;
|
||||
return old;
|
||||
}
|
||||
@ -283,6 +294,34 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkImage::setDebugName(const char* name) {
|
||||
if (likely(!m_info.debugName))
|
||||
return;
|
||||
|
||||
m_debugName = createDebugName(name);
|
||||
m_info.debugName = m_debugName.c_str();
|
||||
|
||||
updateDebugName();
|
||||
}
|
||||
|
||||
|
||||
void DxvkImage::updateDebugName() {
|
||||
if (m_storage->flags().test(DxvkAllocationFlag::OwnsImage)) {
|
||||
VkDebugUtilsObjectNameInfoEXT nameInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT };
|
||||
nameInfo.objectType = VK_OBJECT_TYPE_IMAGE;
|
||||
nameInfo.objectHandle = vk::getObjectHandle(m_imageInfo.image);
|
||||
nameInfo.pObjectName = m_info.debugName;
|
||||
|
||||
m_vkd->vkSetDebugUtilsObjectNameEXT(m_vkd->device(), &nameInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string DxvkImage::createDebugName(const char* name) const {
|
||||
return str::format(vk::isValidDebugName(name) ? name : "Image", " (", cookie(), ")");
|
||||
}
|
||||
|
||||
|
||||
VkImageCreateInfo DxvkImage::getImageCreateInfo(
|
||||
const DxvkImageUsageInfo& usageInfo) const {
|
||||
VkImageCreateInfo info = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
|
||||
|
@ -66,6 +66,9 @@ namespace dxvk {
|
||||
|
||||
// Shared handle info
|
||||
DxvkSharedHandleInfo sharing = { };
|
||||
|
||||
// Debug name
|
||||
const char* debugName = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@ -601,6 +604,12 @@ namespace dxvk {
|
||||
bool isInitialized(
|
||||
const VkImageSubresourceRange& subresources) const;
|
||||
|
||||
/**
|
||||
* \brief Sets debug name for the backing resource
|
||||
* \param [in] name New debug name
|
||||
*/
|
||||
void setDebugName(const char* name);
|
||||
|
||||
private:
|
||||
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
@ -626,6 +635,12 @@ namespace dxvk {
|
||||
std::unordered_map<DxvkImageViewKey,
|
||||
DxvkImageView, DxvkHash, DxvkEq> m_views;
|
||||
|
||||
std::string m_debugName;
|
||||
|
||||
void updateDebugName();
|
||||
|
||||
std::string createDebugName(const char* name) const;
|
||||
|
||||
VkImageCreateInfo getImageCreateInfo(
|
||||
const DxvkImageUsageInfo& usageInfo) const;
|
||||
|
||||
|
@ -752,6 +752,8 @@ namespace dxvk {
|
||||
memoryRequirements.memoryTypeBits = findGlobalBufferMemoryTypeMask(createInfo.usage);
|
||||
|
||||
if (likely(memoryRequirements.memoryTypeBits)) {
|
||||
bool allowSuballocation = true;
|
||||
|
||||
// If the given allocation cache supports the memory types and usage
|
||||
// flags that we need, try to use it to service this allocation.
|
||||
// Only use the allocation cache for mappable allocations since those
|
||||
@ -769,11 +771,16 @@ namespace dxvk {
|
||||
// for any relevant memory pools as necessary.
|
||||
if (refillAllocationCache(allocationCache, memoryRequirements, allocationInfo.properties))
|
||||
return allocationCache->allocateFromCache(createInfo.size);
|
||||
} else {
|
||||
// Do not suballocate buffers if debug mode is enabled in order
|
||||
// to allow the application to set meaningful debug names.
|
||||
allowSuballocation = !m_device->isDebugEnabled();
|
||||
}
|
||||
|
||||
// If there is at least one memory type that supports the required
|
||||
// buffer usage flags and requested memory properties, suballocate
|
||||
// from a global buffer.
|
||||
if (likely(allowSuballocation)) {
|
||||
allocation = allocateMemory(memoryRequirements, allocationInfo);
|
||||
|
||||
if (likely(allocation && allocation->m_buffer))
|
||||
@ -810,6 +817,7 @@ namespace dxvk {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we can't suballocate from an existing global buffer
|
||||
// for any reason, create a dedicated buffer resource.
|
||||
|
@ -604,6 +604,18 @@ namespace dxvk {
|
||||
virtual Rc<DxvkResourceAllocation> relocateStorage(
|
||||
DxvkAllocationModes mode) = 0;
|
||||
|
||||
/**
|
||||
* \brief Sets debug name for the backing resource
|
||||
*
|
||||
* The caller \e must ensure that the backing resource
|
||||
* is not being swapped out at the same time. This may
|
||||
* also be ignored for certain types of resources for
|
||||
* performance reasons, and has no effect if the device
|
||||
* does not have debug layers enabled.
|
||||
* \param [in] name New debug name
|
||||
*/
|
||||
virtual void setDebugName(const char* name) = 0;
|
||||
|
||||
private:
|
||||
|
||||
std::atomic<uint64_t> m_useCount = { 0u };
|
||||
|
@ -211,6 +211,22 @@ namespace dxvk::vk {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline uint64_t getObjectHandle(uint64_t handle) {
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
uint64_t getObjectHandle(T* object) {
|
||||
return reinterpret_cast<uintptr_t>(object);
|
||||
}
|
||||
|
||||
|
||||
inline bool isValidDebugName(const char* name) {
|
||||
return name && name[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user