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:
Gary Sweet
2018-08-28 14:24:13 +02:00
committed by Baldur Karlsson
parent a8f35f1bf8
commit 9721150aa9
6 changed files with 87 additions and 0 deletions
+22
View File
@@ -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);
}
+1
View File
@@ -172,6 +172,7 @@ struct GPUBuffer
WrappedVulkan *m_pDriver = NULL;
VkDevice device = VK_NULL_HANDLE;
uint32_t createFlags = 0;
};
// in vk_<platform>.cpp
+11
View File
@@ -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);
+7
View File
@@ -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);
+28
View File
@@ -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;
+18
View File
@@ -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);