Skip to content

Commit 34045c1

Browse files
committed
GPU Vulkan Backend: Merge all commands to a single commit, remove empty commit for fence at the end
1 parent 1761568 commit 34045c1

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.cxx‎

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

15671568
void GPUDisplayBackendVulkan::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage)
@@ -1577,7 +1578,6 @@ void GPUDisplayBackendVulkan::finishDraw(bool doScreenshot, bool toMixBuffer, fl
15771578
void 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;

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
175175
std::vector<vk::CommandBuffer> mCommandBuffersText;
176176
std::vector<vk::CommandBuffer> mCommandBuffersTexture;
177177
std::vector<vk::CommandBuffer> mCommandBuffersMix;
178+
std::vector<vk::SubmitInfo> mSubmitQueue;
178179
std::vector<bool> mCommandBufferUpToDate;
179180
std::vector<vk::Semaphore> mImageAvailableSemaphore;
180181
std::vector<vk::Semaphore> mRenderFinishedSemaphore;

0 commit comments

Comments
 (0)