From 4c11735bd5a9d99304d3f641fe615533dc157b8e Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 30 Nov 2016 22:20:44 +1000 Subject: [PATCH] Vulkan: Fix case where a draw's vertices could be overwritten This could happen because the vertex memory was already committed, if a uniform buffer allocation failed and caused a command buffer to be executed, it would be associated with the previous command buffer rather than the buffer containing the draw that consumed these vertices. --- Source/Core/VideoBackends/Vulkan/VertexManager.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Core/VideoBackends/Vulkan/VertexManager.cpp b/Source/Core/VideoBackends/Vulkan/VertexManager.cpp index 8300fb5fdd..f3116a8cb6 100644 --- a/Source/Core/VideoBackends/Vulkan/VertexManager.cpp +++ b/Source/Core/VideoBackends/Vulkan/VertexManager.cpp @@ -130,9 +130,6 @@ void VertexManager::vFlush(bool use_dst_alpha) static_cast(VertexLoaderManager::GetCurrentVertexFormat()); u32 vertex_stride = vertex_format->GetVertexStride(); - // Commit memory to device - PrepareDrawBuffers(vertex_stride); - // Figure out the number of indices to draw u32 index_count = IndexGenerator::GetIndexLen(); @@ -169,6 +166,12 @@ void VertexManager::vFlush(bool use_dst_alpha) StateTracker::GetInstance()->UpdateGeometryShaderConstants(); StateTracker::GetInstance()->UpdatePixelShaderConstants(); + // Commit memory to device. + // NOTE: This must be done after constant upload, as a constant buffer overrun can cause + // the current command buffer to be executed, and we want the buffer space to be associated + // with the command buffer that has the corresponding draw. + PrepareDrawBuffers(vertex_stride); + // Flush all EFB pokes and invalidate the peek cache. FramebufferManager::GetInstance()->InvalidatePeekCache(); FramebufferManager::GetInstance()->FlushEFBPokes();