| 20 | } |
| 21 | |
| 22 | void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 signalSemaphoresCount, const VkSemaphore* signalSemaphores) |
| 23 | { |
| 24 | PROFILE_CPU_NAMED("vkQueueSubmit"); |
| 25 | ASSERT(cmdBuffer->HasEnded()); |
| 26 | auto fence = cmdBuffer->GetFence(); |
| 27 | ASSERT(!fence->IsSignaled); |
| 28 | |
| 29 | const VkCommandBuffer cmdBuffers[] = { cmdBuffer->GetHandle() }; |
| 30 | |
| 31 | VkSubmitInfo submitInfo; |
| 32 | RenderToolsVulkan::ZeroStruct(submitInfo, VK_STRUCTURE_TYPE_SUBMIT_INFO); |
| 33 | submitInfo.commandBufferCount = 1; |
| 34 | submitInfo.pCommandBuffers = cmdBuffers; |
| 35 | submitInfo.signalSemaphoreCount = signalSemaphoresCount; |
| 36 | submitInfo.pSignalSemaphores = signalSemaphores; |
| 37 | |
| 38 | Array<VkSemaphore, InlinedAllocation<8>> waitSemaphores; |
| 39 | if (cmdBuffer->_waitSemaphores.HasItems()) |
| 40 | { |
| 41 | waitSemaphores.EnsureCapacity((uint32)cmdBuffer->_waitSemaphores.Count()); |
| 42 | for (auto semaphore : cmdBuffer->_waitSemaphores) |
| 43 | { |
| 44 | waitSemaphores.Add(semaphore->GetHandle()); |
| 45 | } |
| 46 | submitInfo.waitSemaphoreCount = (uint32)cmdBuffer->_waitSemaphores.Count(); |
| 47 | submitInfo.pWaitSemaphores = waitSemaphores.Get(); |
| 48 | submitInfo.pWaitDstStageMask = cmdBuffer->_waitFlags.Get(); |
| 49 | } |
| 50 | |
| 51 | VALIDATE_VULKAN_RESULT(vkQueueSubmit(_queue, 1, &submitInfo, fence->Handle)); |
| 52 | |
| 53 | // Mark semaphores as submitted |
| 54 | cmdBuffer->_state = CmdBufferVulkan::State::Submitted; |
| 55 | cmdBuffer->_waitFlags.Clear(); |
| 56 | cmdBuffer->_submittedWaitSemaphores = cmdBuffer->_waitSemaphores; |
| 57 | cmdBuffer->_waitSemaphores.Clear(); |
| 58 | cmdBuffer->_submittedFenceCounter = cmdBuffer->_fenceSignaledCounter; |
| 59 | |
| 60 | #if 0 |
| 61 | // Wait for the GPU to be idle on every submit (useful for tracking GPU hangs) |
| 62 | const bool WaitForIdleOnSubmit = false; |
| 63 | if (WaitForIdleOnSubmit) |
| 64 | { |
| 65 | cmdBuffer->Wait(); |
| 66 | } |
| 67 | #endif |
| 68 | |
| 69 | UpdateLastSubmittedCommandBuffer(cmdBuffer); |
| 70 | |
| 71 | cmdBuffer->GetOwner()->RefreshFenceStatus(cmdBuffer); |
| 72 | } |
| 73 | |
| 74 | void QueueVulkan::GetLastSubmittedInfo(CmdBufferVulkan*& cmdBuffer, uint64& fenceCounter) const |
| 75 | { |
no test coverage detected