diff options
| author | Stenzek <stenzek@gmail.com> | 2016-12-19 22:00:42 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2016-12-19 22:00:42 +1000 |
| commit | 9290bf5844def612bddd3c01248576d171983b54 (patch) | |
| tree | add8db6beaa4658a36f9a6df3f7142d2617d70a5 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp | |
| parent | 989cdc09293130eaf6e99296c870b2edc4035f19 (diff) | |
Vulkan: Fix crash where a potentially deleted buffer is referenced
This happened when the geometry shader was disabled, and the uniform
buffer was grown to a larger size. The update would be skipped, leaving
the old buffer to be included in the descriptor set.
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index e9bbb980b0..d374ec5f1d 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -384,12 +384,22 @@ void StateTracker::UpdateVertexShaderConstants() void StateTracker::UpdateGeometryShaderConstants() { // Skip updating geometry shader constants if it's not in use. - if (m_pipeline_state.gs == VK_NULL_HANDLE || !GeometryShaderManager::dirty || - !ReserveConstantStorage()) + if (m_pipeline_state.gs == VK_NULL_HANDLE) { - return; + // However, if the buffer has changed, we can't skip the update, because then we'll + // try to include the now non-existant buffer in the descriptor set. + if (m_uniform_stream_buffer->GetBuffer() == + m_bindings.uniform_buffer_bindings[UBO_DESCRIPTOR_SET_BINDING_GS].buffer) + { + return; + } + + GeometryShaderManager::dirty = true; } + if (!GeometryShaderManager::dirty || !ReserveConstantStorage()) + return; + // Buffer allocation changed? if (m_uniform_stream_buffer->GetBuffer() != m_bindings.uniform_buffer_bindings[UBO_DESCRIPTOR_SET_BINDING_GS].buffer) |
