@@ -617,7 +617,7 @@ void GPUDisplayBackendVulkan::clearDevice()
617617
618618// ---------------------------- VULKAN COMMAND BUFFERS ----------------------------
619619
620- void GPUDisplayBackendVulkan::createCommandBuffers ()
620+ void GPUDisplayBackendVulkan::createCommandBuffersForImages ()
621621{
622622 vk::CommandBufferAllocateInfo allocInfo{};
623623 allocInfo.commandPool = mCommandPool ;
@@ -632,7 +632,7 @@ void GPUDisplayBackendVulkan::createCommandBuffers()
632632 mCommandBuffersPresent = mDevice .allocateCommandBuffers (allocInfo);
633633}
634634
635- void GPUDisplayBackendVulkan::clearCommandBuffers ()
635+ void GPUDisplayBackendVulkan::clearCommandBuffersForImages ()
636636{
637637 mDevice .freeCommandBuffers (mCommandPool , mCommandBuffers .size (), mCommandBuffers .data ());
638638 mDevice .freeCommandBuffers (mCommandPool , mCommandBuffersText .size (), mCommandBuffersText .data ());
@@ -648,18 +648,22 @@ void GPUDisplayBackendVulkan::createSemaphores()
648648{
649649 vk::SemaphoreCreateInfo semaphoreInfo{};
650650 mImageAvailableSemaphore .resize (mFramesInFlight );
651- mPresentSemaphore .resize (mImageCount );
652651 for (uint32_t i = 0 ; i < mFramesInFlight ; i++) {
653652 mImageAvailableSemaphore [i] = mDevice .createSemaphore (semaphoreInfo, nullptr );
654653 }
655- for (uint32_t i = 0 ; i < mImageCount ; i++) {
656- mPresentSemaphore [i] = mDevice .createSemaphore (semaphoreInfo, nullptr );
657- }
658654 vk::SemaphoreTypeCreateInfo timelineTypeInfo{vk::SemaphoreType::eTimeline, 0 };
659655 semaphoreInfo.pNext = &timelineTypeInfo;
660656 mTimelineSemaphore = mDevice .createSemaphore (semaphoreInfo, nullptr );
661657 mTimelineValue = 0 ;
662658 mFrameTimelineValue .assign (mFramesInFlight , 0 );
659+ }
660+
661+ void GPUDisplayBackendVulkan::createSemaphoresForImages ()
662+ {
663+ mPresentSemaphore .resize (mImageCount );
664+ for (uint32_t i = 0 ; i < mImageCount ; i++) {
665+ mPresentSemaphore [i] = mDevice .createSemaphore (vk::SemaphoreCreateInfo{}, nullptr );
666+ }
663667 mImageTimelineValue .assign (mImageCount , 0 );
664668 for (uint32_t i = 0 ; i < mImageCount ; i++) {
665669 mPresentFences .emplace_back (mDevice .createFence (vk::FenceCreateInfo{vk::FenceCreateFlagBits::eSignaled}, nullptr ));
@@ -679,22 +683,19 @@ void GPUDisplayBackendVulkan::waitPresentFences()
679683void GPUDisplayBackendVulkan::clearSemaphores ()
680684{
681685 clearVector (mImageAvailableSemaphore , [&](auto & x) { mDevice .destroySemaphore (x, nullptr ); });
682- clearVector (mPresentSemaphore , [&](auto & x) { mDevice .destroySemaphore (x, nullptr ); });
683686 mDevice .destroySemaphore (mTimelineSemaphore , nullptr );
687+ }
688+
689+ void GPUDisplayBackendVulkan::clearSemaphoresForImages ()
690+ {
691+ clearVector (mPresentSemaphore , [&](auto & x) { mDevice .destroySemaphore (x, nullptr ); });
684692 clearVector (mPresentFences , [&](auto & x) { mDevice .destroyFence (x, nullptr ); });
685693}
686694
687695// ---------------------------- VULKAN UNIFORM LAYOUTS AND BUFFERS ----------------------------
688696
689697void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffers ()
690698{
691- for (int32_t j = 0 ; j < 3 ; j++) {
692- mUniformBuffersMat [j].resize (mImageCount );
693- for (uint32_t i = 0 ; i < mImageCount ; i++) {
694- mUniformBuffersMat [j][i] = createBuffer (sizeof (hmm_mat4), nullptr , vk::BufferUsageFlagBits::eUniformBuffer, mDisplay ->cfg ().vulkan .uniformBuffersInDeviceMemory ? 2 : 0 );
695- }
696- }
697-
698699 vk::DescriptorSetLayoutBinding uboLayoutBindingMat{};
699700 uboLayoutBindingMat.binding = 0 ;
700701 uboLayoutBindingMat.descriptorType = vk::DescriptorType::eUniformBuffer;
@@ -714,14 +715,27 @@ void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffers()
714715 mUniformDescriptor = mDevice .createDescriptorSetLayout (layoutInfo, nullptr );
715716 layoutInfo.bindingCount = 2 ;
716717 mUniformDescriptorTexture = mDevice .createDescriptorSetLayout (layoutInfo, nullptr );
718+ }
717719
720+ void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffersForImages ()
721+ {
722+ for (int32_t j = 0 ; j < 3 ; j++) {
723+ mUniformBuffersMat [j].resize (mImageCount );
724+ for (uint32_t i = 0 ; i < mImageCount ; i++) {
725+ mUniformBuffersMat [j][i] = createBuffer (sizeof (hmm_mat4), nullptr , vk::BufferUsageFlagBits::eUniformBuffer, mDisplay ->cfg ().vulkan .uniformBuffersInDeviceMemory ? 2 : 0 );
726+ }
727+ }
718728 mUpdateUBOdrawMatrix = mUpdateUBOtextMatrix = mUpdateUBOmixMatrix = -1 ;
719729}
720730
721731void GPUDisplayBackendVulkan::clearUniformLayoutsAndBuffers ()
722732{
723733 mDevice .destroyDescriptorSetLayout (mUniformDescriptor , nullptr );
724734 mDevice .destroyDescriptorSetLayout (mUniformDescriptorTexture , nullptr );
735+ }
736+
737+ void GPUDisplayBackendVulkan::clearUniformLayoutsAndBuffersForImages ()
738+ {
725739 for (int32_t j = 0 ; j < 3 ; j++) {
726740 clearVector (mUniformBuffersMat [j], [&](auto & x) { clearBuffer (x); });
727741 }
@@ -818,22 +832,24 @@ void GPUDisplayBackendVulkan::createSwapChain(vk::SwapchainKHR oldSwapChain)
818832 }
819833
820834 mSwapChainImages = mDevice .getSwapchainImagesKHR (mSwapChain );
821- uint32_t oldFramesInFlight = mFramesInFlight , oldImageCount = mImageCount ;
822- mFramesInFlight = mDisplay ->cfg ().vulkan .nFramesInFlight ;
835+ uint32_t oldImageCount = mImageCount ;
823836 mImageCount = mSwapChainImages .size ();
824837 if (mImageCount > sizeof (mUpdateUBOdrawMatrix ) * 8 ) {
825838 throw std::runtime_error (" Too many swapchain images" );
826839 }
827840
828- if (mFramesInFlight != oldFramesInFlight || mImageCount != oldImageCount || !mCommandInfrastructureCreated ) {
841+ if (mImageCount != oldImageCount || !mCommandInfrastructureCreated ) {
829842 if (mCommandInfrastructureCreated ) {
830- clearUniformLayoutsAndBuffers (); // TODO: Check what must actually be cleaned up if frames in flight changes
831- clearCommandBuffers ();
832- clearSemaphores ();
843+ clearUniformLayoutsAndBuffersForImages ();
844+ clearCommandBuffersForImages ();
845+ clearSemaphoresForImages ();
846+ } else {
847+ createUniformLayoutsAndBuffers ();
848+ createSemaphores ();
833849 }
834- createUniformLayoutsAndBuffers ();
835- createCommandBuffers ();
836- createSemaphores ();
850+ createUniformLayoutsAndBuffersForImages ();
851+ createCommandBuffersForImages ();
852+ createSemaphoresForImages ();
837853 mCommandInfrastructureCreated = true ;
838854 }
839855
@@ -1397,8 +1413,10 @@ void GPUDisplayBackendVulkan::ExitBackendA()
13971413 clearOffscreenBuffers ();
13981414 clearSwapChain ();
13991415 if (mCommandInfrastructureCreated ) {
1416+ clearSemaphoresForImages ();
14001417 clearSemaphores ();
1401- clearCommandBuffers ();
1418+ clearCommandBuffersForImages ();
1419+ clearUniformLayoutsAndBuffersForImages ();
14021420 clearUniformLayoutsAndBuffers ();
14031421 }
14041422 clearTextureSampler ();
0 commit comments