Vulkan: Fix use-after-destruction of VkFence event
Remove sw::TaskEvents and sw::WaitGroup, replace this with sw::CountedEvent.
See b/173784261 for details.
Fixes: b/173784261
Change-Id: I21fb69c810558a1929bba5cc46f106d9d4e51c4b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/50628
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Presubmit-Ready: Ben Clayton <bclayton@google.com>
diff --git a/src/Vulkan/VkQueue.cpp b/src/Vulkan/VkQueue.cpp
index ccb8cfe..fd8bc6d 100644
--- a/src/Vulkan/VkQueue.cpp
+++ b/src/Vulkan/VkQueue.cpp
@@ -102,11 +102,10 @@
Task task;
task.submitCount = submitCount;
task.pSubmits = DeepCopySubmitInfo(submitCount, pSubmits);
- task.events = fence;
-
- if(task.events)
+ if(fence)
{
- task.events->start();
+ task.events = fence->getCountedEvent();
+ task.events->add();
}
pending.put(task);
@@ -132,7 +131,7 @@
{
CommandBuffer::ExecutionState executionState;
executionState.renderer = renderer.get();
- executionState.events = task.events;
+ executionState.events = task.events.get();
for(uint32_t j = 0; j < submitInfo.commandBufferCount; j++)
{
vk::Cast(submitInfo.pCommandBuffers[j])->submit(executionState);
@@ -155,7 +154,7 @@
// TODO: fix renderer signaling so that work submitted separately from (but before) a fence
// is guaranteed complete by the time the fence signals.
renderer->synchronize();
- task.events->finish();
+ task.events->done();
}
}
@@ -187,14 +186,14 @@
VkResult Queue::waitIdle()
{
// Wait for task queue to flush.
- sw::WaitGroup wg;
- wg.add();
+ auto event = std::make_shared<sw::CountedEvent>();
+ event->add(); // done() is called at the end of submitQueue()
Task task;
- task.events = &wg;
+ task.events = event;
pending.put(task);
- wg.wait();
+ event->wait();
garbageCollect();