summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2016-12-19 22:00:42 +1000
committerStenzek <stenzek@gmail.com>2016-12-19 22:00:42 +1000
commit9290bf5844def612bddd3c01248576d171983b54 (patch)
treeadd8db6beaa4658a36f9a6df3f7142d2617d70a5 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp
parent989cdc09293130eaf6e99296c870b2edc4035f19 (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.cpp16
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)