Skip to content

Commit 2f4c5b0

Browse files
committed
Fix Vulkan validation layer errors about in-flight semaphore usage in test application
1 parent fb2ffc5 commit 2f4c5b0

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

source/dll_main_test_app.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -763,11 +763,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
763763

764764
resize_swapchain();
765765

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]));
771774
}
772775

773776
while (true)
@@ -785,25 +788,26 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
785788
}
786789

787790
uint32_t swapchain_image_index = 0;
791+
sem_index = (sem_index + 1) % ARRAYSIZE(sem_acquire);
788792

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);
790794
if (present_res == VK_SUCCESS)
791795
{
792796
VkSubmitInfo submit_info { VK_STRUCTURE_TYPE_SUBMIT_INFO };
793797
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;
795800
submit_info.pWaitDstStageMask = &wait_stage;
796-
submit_info.pWaitSemaphores = &sem_acquire;
797801
submit_info.commandBufferCount = 1;
798802
submit_info.pCommandBuffers = &cmd_list[swapchain_image_index];
799803
submit_info.signalSemaphoreCount = 1;
800-
submit_info.pSignalSemaphores = &sem_present;
804+
submit_info.pSignalSemaphores = &sem_present[sem_index];
801805

802806
VK_CHECK(VK_CALL_CMD(vkQueueSubmit, device, queue, 1, &submit_info, VK_NULL_HANDLE));
803807

804808
VkPresentInfoKHR present_info { VK_STRUCTURE_TYPE_PRESENT_INFO_KHR };
805809
present_info.waitSemaphoreCount = 1;
806-
present_info.pWaitSemaphores = &sem_present;
810+
present_info.pWaitSemaphores = &sem_present[sem_index];
807811
present_info.swapchainCount = 1;
808812
present_info.pSwapchains = &swapchain;
809813
present_info.pImageIndices = &swapchain_image_index;
@@ -819,8 +823,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
819823
// Wait for all GPU work to finish before destroying objects
820824
VK_CALL_DEVICE(vkDeviceWaitIdle, device);
821825

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+
}
824831
VK_CALL_DEVICE(vkFreeCommandBuffers, device, cmd_alloc, uint32_t(cmd_list.size()), cmd_list.data());
825832
VK_CALL_DEVICE(vkDestroyCommandPool, device, cmd_alloc, nullptr);
826833
VK_CALL_DEVICE(vkDestroySwapchainKHR, device, swapchain, nullptr);

0 commit comments

Comments
 (0)