| 307 | } |
| 308 | |
| 309 | void vvl::Queue::Retire(QueueSubmission& submission) { |
| 310 | submission.EndUse(); |
| 311 | for (auto& wait : submission.wait_semaphores) { |
| 312 | wait.semaphore->RetireWait(this, wait.payload, submission.loc.Get(), true); |
| 313 | timeline_wait_count_.fetch_sub((wait.semaphore->type == VK_SEMAPHORE_TYPE_TIMELINE) ? 1 : 0); |
| 314 | } |
| 315 | |
| 316 | // When device is lost skip updating substates which might access destroyed/garbage objects. |
| 317 | // NOTE: we still need to run semaphore/fence retire routines which do not work with Vulkan |
| 318 | // handles but ensure correct invariants (for example, Fence::Retire sets its std::promise) |
| 319 | if (!device_state_.is_device_lost) { |
| 320 | for (auto& item : sub_states_) { |
| 321 | item.second->Retire(submission); |
| 322 | } |
| 323 | } |
| 324 | |
| 325 | for (auto& signal : submission.signal_semaphores) { |
| 326 | signal.semaphore->RetireSignal(signal.payload); |
| 327 | } |
| 328 | } |
| 329 | |
| 330 | void vvl::Queue::ThreadFunc() { |
| 331 | VVL_TracySetThreadName(__FUNCTION__); |
no test coverage detected