mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-06 23:00:59 +00:00
Add missing Vulkan cache flushes and invalidates
Without these flushes and invalidates, I see missing data on readback and bad text in the overlay.
This commit is contained in:
committed by
Baldur Karlsson
parent
a8f35f1bf8
commit
9721150aa9
@@ -127,6 +127,7 @@ void GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, VkDeviceSize size, u
|
||||
{
|
||||
m_pDriver = driver;
|
||||
device = dev;
|
||||
createFlags = flags;
|
||||
|
||||
align = (VkDeviceSize)driver->GetDeviceProps().limits.minUniformBufferOffsetAlignment;
|
||||
|
||||
@@ -216,6 +217,17 @@ void *GPUBuffer::Map(uint32_t *bindoffset, VkDeviceSize usedsize)
|
||||
void *ptr = NULL;
|
||||
VkResult vkr = m_pDriver->vkMapMemory(device, mem, offset, size, 0, (void **)&ptr);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
if(createFlags & eGPUBufferReadback)
|
||||
{
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, mem, offset, size,
|
||||
};
|
||||
|
||||
vkr = m_pDriver->vkInvalidateMappedMemoryRanges(device, 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@@ -232,6 +244,16 @@ void *GPUBuffer::Map(VkDeviceSize &bindoffset, VkDeviceSize usedsize)
|
||||
|
||||
void GPUBuffer::Unmap()
|
||||
{
|
||||
if(!(createFlags & eGPUBufferReadback) && !(createFlags & eGPUBufferGPULocal))
|
||||
{
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, mem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
VkResult vkr = m_pDriver->vkFlushMappedMemoryRanges(device, 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
}
|
||||
|
||||
m_pDriver->vkUnmapMemory(device, mem);
|
||||
}
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ struct GPUBuffer
|
||||
|
||||
WrappedVulkan *m_pDriver = NULL;
|
||||
VkDevice device = VK_NULL_HANDLE;
|
||||
uint32_t createFlags = 0;
|
||||
};
|
||||
|
||||
// in vk_<platform>.cpp
|
||||
|
||||
@@ -1402,6 +1402,17 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd)
|
||||
|
||||
RDCASSERT(pData != NULL);
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
|
||||
NULL,
|
||||
Unwrap(readbackMem.mem),
|
||||
readbackMem.offs,
|
||||
readbackMem.size,
|
||||
};
|
||||
|
||||
vkr = vt->InvalidateMappedMemoryRanges(Unwrap(device), 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
// point sample info into raw buffer
|
||||
{
|
||||
ResourceFormat fmt = MakeResourceFormat(imInfo.format);
|
||||
|
||||
@@ -1355,6 +1355,13 @@ void VulkanDebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_
|
||||
(void **)&pData);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, Unwrap(m_ReadbackWindow.mem), 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
RDCASSERT(pData != NULL);
|
||||
memcpy(&ret[dstoffset], pData, (size_t)chunkSize);
|
||||
|
||||
|
||||
@@ -1351,6 +1351,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId)
|
||||
|
||||
memcpy(idxData, &indices[0], indices.size() * sizeof(uint32_t));
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, uniqIdxBufMem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
m_pDriver->vkUnmapMemory(m_Device, uniqIdxBufMem);
|
||||
|
||||
// rebase existing index buffer to point to the right elements in our stream-out'd
|
||||
@@ -1399,6 +1406,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId)
|
||||
|
||||
memcpy(idxData, idxdata.data(), idxdata.size());
|
||||
|
||||
VkMappedMemoryRange rebasedRange = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, rebasedIdxBufMem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &rebasedRange);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
m_pDriver->vkUnmapMemory(m_Device, rebasedIdxBufMem);
|
||||
}
|
||||
|
||||
@@ -1685,6 +1699,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId)
|
||||
}
|
||||
}
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, vbuffers[attr].mem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
m_pDriver->vkUnmapMemory(m_Device, vbuffers[attr].mem);
|
||||
}
|
||||
|
||||
@@ -1968,6 +1989,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId)
|
||||
byte *byteData = NULL;
|
||||
vkr = m_pDriver->vkMapMemory(m_Device, readbackMem, 0, VK_WHOLE_SIZE, 0, (void **)&byteData);
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, readbackMem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = m_pDriver->vkInvalidateMappedMemoryRanges(m_Device, 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
// do near/far calculations
|
||||
|
||||
float nearp = 0.1f;
|
||||
|
||||
@@ -527,6 +527,17 @@ void VulkanReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_
|
||||
vt->MapMemory(Unwrap(dev), Unwrap(m_PixelPick.ReadbackBuffer.mem), 0, VK_WHOLE_SIZE, 0,
|
||||
(void **)&pData);
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
|
||||
NULL,
|
||||
Unwrap(m_PixelPick.ReadbackBuffer.mem),
|
||||
0,
|
||||
VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
RDCASSERT(pData != NULL);
|
||||
|
||||
if(pData == NULL)
|
||||
@@ -2893,6 +2904,13 @@ void VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mi
|
||||
vkr = vt->MapMemory(Unwrap(dev), readbackMem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
VkMappedMemoryRange range = {
|
||||
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, readbackMem, 0, VK_WHOLE_SIZE,
|
||||
};
|
||||
|
||||
vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
RDCASSERT(pData != NULL);
|
||||
|
||||
data.resize(dataSize);
|
||||
|
||||
Reference in New Issue
Block a user