summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/VertexManager.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2016-11-30 22:20:44 +1000
committerStenzek <stenzek@gmail.com>2016-11-30 22:45:00 +1000
commit4c11735bd5a9d99304d3f641fe615533dc157b8e (patch)
treec403f0a6285778933379d9e1746840be94347164 /Source/Core/VideoBackends/Vulkan/VertexManager.cpp
parent37550501ccaba65fd91f22b24c2f30ac7245c771 (diff)
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.
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VertexManager.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/VertexManager.cpp9
1 files 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<VertexFormat*>(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();