diff options
| author | Stenzek <stenzek@gmail.com> | 2016-11-30 22:20:44 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2016-11-30 22:45:00 +1000 |
| commit | 4c11735bd5a9d99304d3f641fe615533dc157b8e (patch) | |
| tree | c403f0a6285778933379d9e1746840be94347164 /Source/Core/VideoBackends/Vulkan/VertexManager.cpp | |
| parent | 37550501ccaba65fd91f22b24c2f30ac7245c771 (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.cpp | 9 |
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(); |
