mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-28 17:36:36 +00:00
Try to create descriptor buffer buffer if failing to create wholeMemBuf
* On some drivers such as radv there are memory types only accessible via descriptor buffer usage flags, and it's important to have a wholeMemBuf to readback both for maps (quite possible/likely) as well as initial contents.
This commit is contained in:
@@ -715,11 +715,38 @@ VkResult WrappedVulkan::vkAllocateMemory(VkDevice device, const VkMemoryAllocate
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// can't create a memory-spanning buffer for this allocation. Assume this is a case where
|
|
||||||
// this memory type is only available to images and is not mappable - in which case the
|
|
||||||
// whole memory buffer won't be needed so we can skip this.
|
|
||||||
ObjDisp(device)->DestroyBuffer(Unwrap(device), wholeMemBuf, NULL);
|
ObjDisp(device)->DestroyBuffer(Unwrap(device), wholeMemBuf, NULL);
|
||||||
wholeMemBuf = VK_NULL_HANDLE;
|
wholeMemBuf = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
// can't create a memory-spanning buffer for this allocation. Try again with descriptor
|
||||||
|
// buffers if that is enabled as those memory types are sometimes unique.
|
||||||
|
if(DescriptorBuffers())
|
||||||
|
{
|
||||||
|
bufInfo.usage |= VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT;
|
||||||
|
|
||||||
|
ret = ObjDisp(device)->CreateBuffer(Unwrap(device), &bufInfo, NULL, &wholeMemBuf);
|
||||||
|
RDCASSERTEQUAL(ret, VK_SUCCESS);
|
||||||
|
|
||||||
|
ObjDisp(device)->GetBufferMemoryRequirements(Unwrap(device), wholeMemBuf, &mrq);
|
||||||
|
|
||||||
|
RDCASSERTEQUAL(mrq.size, info.allocationSize);
|
||||||
|
|
||||||
|
if((mrq.memoryTypeBits & (1U << info.memoryTypeIndex)) != 0)
|
||||||
|
{
|
||||||
|
bufid = GetResourceManager()->WrapResource(Unwrap(device), wholeMemBuf);
|
||||||
|
|
||||||
|
ObjDisp(device)->BindBufferMemory(Unwrap(device), Unwrap(wholeMemBuf), Unwrap(*pMemory),
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ObjDisp(device)->DestroyBuffer(Unwrap(device), wholeMemBuf, NULL);
|
||||||
|
wholeMemBuf = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise this could be a case where this memory type is only available to images and is
|
||||||
|
// not mappable - in which case the whole memory buffer shouldn't be needed so we can skip this.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user