From b073d2753d0ca737e2d75e6b679acdfa5e1c4c8e Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Tue, 17 Aug 2021 16:52:49 +0300 Subject: [PATCH] test/vulkan: fix/workaround validation errors --- test/testvulkan.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/testvulkan.c b/test/testvulkan.c index 88707e206..9b3bb39ff 100644 --- a/test/testvulkan.c +++ b/test/testvulkan.c @@ -206,12 +206,12 @@ static SDLTest_CommonState *state; static VulkanContext *vulkanContexts = NULL; // an array of state->num_windows items static VulkanContext *vulkanContext = NULL; // for the currently-rendering window -static void shutdownVulkan(void); +static void shutdownVulkan(SDL_bool doDestroySwapchain); /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ static void quit(int rc) { - shutdownVulkan(); + shutdownVulkan(SDL_TRUE); SDLTest_CommonQuit(state); exit(rc); } @@ -735,6 +735,8 @@ static SDL_bool createSwapchain(void) if(w == 0 || h == 0) return SDL_FALSE; + getSurfaceCaps(); + createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; createInfo.surface = vulkanContext->surface; createInfo.minImageCount = vulkanContext->swapchainDesiredImageCount; @@ -975,6 +977,7 @@ static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColorValue * static void destroySwapchainAndSwapchainSpecificStuff(SDL_bool doDestroySwapchain) { + vkDeviceWaitIdle(vulkanContext->device); destroyFences(); destroyCommandBuffers(); destroyCommandPool(); @@ -1023,7 +1026,7 @@ static void initVulkan(void) } } -static void shutdownVulkan(void) +static void shutdownVulkan(SDL_bool doDestroySwapchain) { if (vulkanContexts) { int i; @@ -1031,7 +1034,7 @@ static void shutdownVulkan(void) vulkanContext = &vulkanContexts[i]; if(vulkanContext->device && vkDeviceWaitIdle) vkDeviceWaitIdle(vulkanContext->device); - destroySwapchainAndSwapchainSpecificStuff(SDL_TRUE); + destroySwapchainAndSwapchainSpecificStuff(doDestroySwapchain); if(vulkanContext->imageAvailableSemaphore && vkDestroySemaphore) vkDestroySemaphore(vulkanContext->device, vulkanContext->imageAvailableSemaphore, NULL); if(vulkanContext->renderingFinishedSemaphore && vkDestroySemaphore) @@ -1194,6 +1197,11 @@ int main(int argc, char *argv[]) ++frames; while(SDL_PollEvent(&event)) /* !!! FIXME: fix coding conventions with braces and spaces */ { + /* Need to destroy the swapchain before the window created + * by SDL. + */ + if (event.type == SDL_WINDOWEVENT_CLOSE) + destroySwapchainAndSwapchainSpecificStuff(SDL_TRUE); SDLTest_CommonEvent(state, &event, &done); } @@ -1214,7 +1222,8 @@ int main(int argc, char *argv[]) { SDL_Log("%2.2f frames per second\n", ((double)frames * 1000) / (now - then)); } - quit(0); + shutdownVulkan(SDL_TRUE); + SDLTest_CommonQuit(state); return 0; }