vk: Avoid use-after-free fence object

This commit is contained in:
kd-11 2018-06-03 10:26:41 +03:00 committed by kd-11
commit 1c5667f0ce

View file

@ -94,14 +94,16 @@ struct command_buffer_chunk: public vk::command_buffer
bool poke() bool poke()
{ {
reader_lock lock(guard_mutex);
if (vkGetFenceStatus(m_device, submit_fence) == VK_SUCCESS) if (vkGetFenceStatus(m_device, submit_fence) == VK_SUCCESS)
{ {
std::lock_guard<shared_mutex> lock(guard_mutex); lock.upgrade();
if (pending) if (pending)
{ {
vk::reset_fence(&submit_fence);
pending = false; pending = false;
vk::reset_fence(&submit_fence);
} }
} }
@ -110,7 +112,7 @@ struct command_buffer_chunk: public vk::command_buffer
void wait() void wait()
{ {
std::lock_guard<shared_mutex> lock(guard_mutex); reader_lock lock(guard_mutex);
if (!pending) if (!pending)
return; return;
@ -124,9 +126,14 @@ struct command_buffer_chunk: public vk::command_buffer
break; break;
} }
lock.upgrade();
if (pending)
{
vk::reset_fence(&submit_fence); vk::reset_fence(&submit_fence);
pending = false; pending = false;
} }
}
}; };
struct occlusion_data struct occlusion_data