@@ -763,11 +763,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
763
763
764
764
resize_swapchain ();
765
765
766
- VkSemaphore sem_acquire = VK_NULL_HANDLE;
767
- VkSemaphore sem_present = VK_NULL_HANDLE;
768
- { VkSemaphoreCreateInfo create_info { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO };
769
- VK_CHECK (VK_CALL_DEVICE (vkCreateSemaphore, device, &create_info, nullptr , &sem_acquire));
770
- VK_CHECK (VK_CALL_DEVICE (vkCreateSemaphore, device, &create_info, nullptr , &sem_present));
766
+ uint32_t sem_index = 0 ;
767
+ VkSemaphore sem_acquire[4 ] = {};
768
+ VkSemaphore sem_present[4 ] = {};
769
+ for (size_t i = 0 ; i < ARRAYSIZE (sem_acquire); ++i)
770
+ {
771
+ VkSemaphoreCreateInfo create_info { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO };
772
+ VK_CHECK (VK_CALL_DEVICE (vkCreateSemaphore, device, &create_info, nullptr , &sem_acquire[i]));
773
+ VK_CHECK (VK_CALL_DEVICE (vkCreateSemaphore, device, &create_info, nullptr , &sem_present[i]));
771
774
}
772
775
773
776
while (true )
@@ -785,25 +788,26 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
785
788
}
786
789
787
790
uint32_t swapchain_image_index = 0 ;
791
+ sem_index = (sem_index + 1 ) % ARRAYSIZE (sem_acquire);
788
792
789
- VkResult present_res = VK_CALL_DEVICE (vkAcquireNextImageKHR, device, swapchain, UINT64_MAX, sem_acquire, VK_NULL_HANDLE, &swapchain_image_index);
793
+ VkResult present_res = VK_CALL_DEVICE (vkAcquireNextImageKHR, device, swapchain, UINT64_MAX, sem_acquire[sem_index] , VK_NULL_HANDLE, &swapchain_image_index);
790
794
if (present_res == VK_SUCCESS)
791
795
{
792
796
VkSubmitInfo submit_info { VK_STRUCTURE_TYPE_SUBMIT_INFO };
793
797
submit_info.waitSemaphoreCount = 1 ;
794
- VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TRANSFER_BIT;
798
+ submit_info.pWaitSemaphores = &sem_acquire[sem_index];
799
+ const VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TRANSFER_BIT;
795
800
submit_info.pWaitDstStageMask = &wait_stage;
796
- submit_info.pWaitSemaphores = &sem_acquire;
797
801
submit_info.commandBufferCount = 1 ;
798
802
submit_info.pCommandBuffers = &cmd_list[swapchain_image_index];
799
803
submit_info.signalSemaphoreCount = 1 ;
800
- submit_info.pSignalSemaphores = &sem_present;
804
+ submit_info.pSignalSemaphores = &sem_present[sem_index] ;
801
805
802
806
VK_CHECK (VK_CALL_CMD (vkQueueSubmit, device, queue, 1 , &submit_info, VK_NULL_HANDLE));
803
807
804
808
VkPresentInfoKHR present_info { VK_STRUCTURE_TYPE_PRESENT_INFO_KHR };
805
809
present_info.waitSemaphoreCount = 1 ;
806
- present_info.pWaitSemaphores = &sem_present;
810
+ present_info.pWaitSemaphores = &sem_present[sem_index] ;
807
811
present_info.swapchainCount = 1 ;
808
812
present_info.pSwapchains = &swapchain;
809
813
present_info.pImageIndices = &swapchain_image_index;
@@ -819,8 +823,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
819
823
// Wait for all GPU work to finish before destroying objects
820
824
VK_CALL_DEVICE (vkDeviceWaitIdle, device);
821
825
822
- VK_CALL_DEVICE (vkDestroySemaphore, device, sem_acquire, nullptr );
823
- VK_CALL_DEVICE (vkDestroySemaphore, device, sem_present, nullptr );
826
+ for (size_t i = 0 ; i < ARRAYSIZE (sem_acquire); ++i)
827
+ {
828
+ VK_CALL_DEVICE (vkDestroySemaphore, device, sem_acquire[i], nullptr );
829
+ VK_CALL_DEVICE (vkDestroySemaphore, device, sem_present[i], nullptr );
830
+ }
824
831
VK_CALL_DEVICE (vkFreeCommandBuffers, device, cmd_alloc, uint32_t (cmd_list.size ()), cmd_list.data ());
825
832
VK_CALL_DEVICE (vkDestroyCommandPool, device, cmd_alloc, nullptr );
826
833
VK_CALL_DEVICE (vkDestroySwapchainKHR, device, swapchain, nullptr );
0 commit comments