@@ -1562,6 +1562,7 @@ void GPUDisplayBackendVulkan::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
15621562 if (!mCommandBufferUpToDate [mCurrentImageIndex ]) {
15631563 startFillCommandBuffer (mCurrentCommandBuffer , mCurrentImageIndex , toMixBuffer);
15641564 }
1565+ mSubmitQueue .clear ();
15651566}
15661567
15671568void GPUDisplayBackendVulkan::finishDraw (bool doScreenshot, bool toMixBuffer, float includeMixImage)
@@ -1577,7 +1578,6 @@ void GPUDisplayBackendVulkan::finishDraw(bool doScreenshot, bool toMixBuffer, fl
15771578void GPUDisplayBackendVulkan::finishFrame (bool doScreenshot, bool toMixBuffer, float includeMixImage)
15781579{
15791580 vk::Semaphore* stageFinishedSemaphore = &mRenderFinishedSemaphore [mCurrentFrame ];
1580- const vk::Fence noFence = VkFence (VK_NULL_HANDLE );
15811581
15821582 vk::SubmitInfo submitInfo{};
15831583 vk::PipelineStageFlags waitStages[] = {vk::PipelineStageFlagBits::eColorAttachmentOutput};
@@ -1588,7 +1588,8 @@ void GPUDisplayBackendVulkan::finishFrame(bool doScreenshot, bool toMixBuffer, f
15881588 submitInfo.pCommandBuffers = &mCurrentCommandBuffer ;
15891589 submitInfo.signalSemaphoreCount = 1 ;
15901590 submitInfo.pSignalSemaphores = stageFinishedSemaphore;
1591- CHKERR (mGraphicsQueue .submit (1 , &submitInfo, noFence));
1591+ mSubmitQueue .emplace_back (submitInfo);
1592+
15921593 if (!toMixBuffer) {
15931594 if (includeMixImage > 0 .f ) {
15941595 mixImages (mCommandBuffersTexture [mCurrentImageIndex ], includeMixImage);
@@ -1598,7 +1599,7 @@ void GPUDisplayBackendVulkan::finishFrame(bool doScreenshot, bool toMixBuffer, f
15981599 submitInfo.pCommandBuffers = &mCommandBuffersTexture [mCurrentImageIndex ];
15991600 stageFinishedSemaphore = &mMixFinishedSemaphore [mCurrentFrame ];
16001601 submitInfo.pSignalSemaphores = stageFinishedSemaphore;
1601- CHKERR ( mGraphicsQueue . submit ( 1 , & submitInfo, noFence) );
1602+ mSubmitQueue . emplace_back ( submitInfo);
16021603 }
16031604
16041605 if (mDownsampleFSAA ) {
@@ -1609,16 +1610,18 @@ void GPUDisplayBackendVulkan::finishFrame(bool doScreenshot, bool toMixBuffer, f
16091610 submitInfo.waitSemaphoreCount = 1 ;
16101611 stageFinishedSemaphore = &mDownsampleFinishedSemaphore [mCurrentFrame ];
16111612 submitInfo.pSignalSemaphores = stageFinishedSemaphore;
1612- CHKERR ( mGraphicsQueue . submit ( 1 , & submitInfo, noFence) );
1613+ mSubmitQueue . emplace_back ( submitInfo);
16131614 }
16141615
16151616 if (doScreenshot) {
1617+ CHKERR (mGraphicsQueue .submit (mSubmitQueue .size (), mSubmitQueue .data (), VkFence (VK_NULL_HANDLE )));
16161618 mDevice .waitIdle ();
16171619 if (mDisplay ->cfgR ().screenshotScaleFactor != 1 ) {
16181620 readImageToPixels (mDownsampleImages [mCurrentImageIndex ].image , vk::ImageLayout::eColorAttachmentOptimal, mScreenshotPixels );
16191621 } else {
16201622 readImageToPixels (mSwapChainImages [mCurrentImageIndex ], vk::ImageLayout::ePresentSrcKHR, mScreenshotPixels );
16211623 }
1624+ mSubmitQueue .clear ();
16221625 }
16231626
16241627 if (mHasDrawnText ) {
@@ -1628,20 +1631,19 @@ void GPUDisplayBackendVulkan::finishFrame(bool doScreenshot, bool toMixBuffer, f
16281631 submitInfo.pCommandBuffers = &mCommandBuffersText [mCurrentImageIndex ];
16291632 stageFinishedSemaphore = &mTextFinishedSemaphore [mCurrentFrame ];
16301633 submitInfo.pSignalSemaphores = stageFinishedSemaphore;
1631- CHKERR ( mGraphicsQueue . submit ( 1 , & submitInfo, noFence) );
1634+ mSubmitQueue . emplace_back ( submitInfo);
16321635 }
16331636
1634- vk::PipelineStageFlags presentWaitStage = vk::PipelineStageFlagBits::eAllCommands;
1635- submitInfo.commandBufferCount = 0 ;
1636- submitInfo.waitSemaphoreCount = 1 ;
1637- submitInfo.pWaitSemaphores = stageFinishedSemaphore;
1638- submitInfo.pWaitDstStageMask = &presentWaitStage;
1639- submitInfo.signalSemaphoreCount = 1 ;
1640- submitInfo.pSignalSemaphores = &mPresentSemaphore [mCurrentImageIndex ];
1641- CHKERR (mGraphicsQueue .submit (1 , &submitInfo, mInFlightFence [mCurrentFrame ])); // Empty submit to signal InFlightFence and PresentSemaphore
1637+ if (mSubmitQueue .size ()) {
1638+ vk::SubmitInfo& submitInfoLast = mSubmitQueue .back ();
1639+ vk::PipelineStageFlags presentWaitStage = vk::PipelineStageFlagBits::eAllCommands; // Last commit signals to present
1640+ submitInfoLast.pWaitDstStageMask = &presentWaitStage;
1641+ submitInfoLast.pSignalSemaphores = &mPresentSemaphore [mCurrentImageIndex ];
1642+ CHKERR (mGraphicsQueue .submit (mSubmitQueue .size (), mSubmitQueue .data (), mInFlightFence [mCurrentFrame ]));
1643+ }
16421644
16431645 vk::PresentInfoKHR presentInfo{};
1644- presentInfo.waitSemaphoreCount = 1 ;
1646+ presentInfo.waitSemaphoreCount = mSubmitQueue . size () ? 1 : 0 ;
16451647 presentInfo.pWaitSemaphores = &mPresentSemaphore [mCurrentImageIndex ];
16461648 presentInfo.swapchainCount = 1 ;
16471649 presentInfo.pSwapchains = &mSwapChain ;
0 commit comments