GPU Vulkan: fix for Swapchain Semaphore Reuse

This commit is contained in:
dbolin
2025-05-09 18:14:48 -07:00
committed by Sam Lantinga
parent 3f2226a917
commit 6344712b04

View File

@@ -703,7 +703,7 @@ typedef struct WindowData
// Synchronization primitives // Synchronization primitives
VkSemaphore imageAvailableSemaphore[MAX_FRAMES_IN_FLIGHT]; VkSemaphore imageAvailableSemaphore[MAX_FRAMES_IN_FLIGHT];
VkSemaphore renderFinishedSemaphore[MAX_FRAMES_IN_FLIGHT]; VkSemaphore *renderFinishedSemaphore;
SDL_GPUFence *inFlightFences[MAX_FRAMES_IN_FLIGHT]; SDL_GPUFence *inFlightFences[MAX_FRAMES_IN_FLIGHT];
Uint32 frameCounter; Uint32 frameCounter;
@@ -3164,7 +3164,6 @@ static void VULKAN_INTERNAL_DestroySwapchain(
SDL_free(windowData->textureContainers[i].activeTexture->subresources); SDL_free(windowData->textureContainers[i].activeTexture->subresources);
SDL_free(windowData->textureContainers[i].activeTexture); SDL_free(windowData->textureContainers[i].activeTexture);
} }
windowData->imageCount = 0;
SDL_free(windowData->textureContainers); SDL_free(windowData->textureContainers);
windowData->textureContainers = NULL; windowData->textureContainers = NULL;
@@ -3193,7 +3192,8 @@ static void VULKAN_INTERNAL_DestroySwapchain(
NULL); NULL);
windowData->imageAvailableSemaphore[i] = VK_NULL_HANDLE; windowData->imageAvailableSemaphore[i] = VK_NULL_HANDLE;
} }
}
for (i = 0; i < windowData->imageCount; i += 1) {
if (windowData->renderFinishedSemaphore[i]) { if (windowData->renderFinishedSemaphore[i]) {
renderer->vkDestroySemaphore( renderer->vkDestroySemaphore(
renderer->logicalDevice, renderer->logicalDevice,
@@ -3202,6 +3202,10 @@ static void VULKAN_INTERNAL_DestroySwapchain(
windowData->renderFinishedSemaphore[i] = VK_NULL_HANDLE; windowData->renderFinishedSemaphore[i] = VK_NULL_HANDLE;
} }
} }
SDL_free(windowData->renderFinishedSemaphore);
windowData->renderFinishedSemaphore = NULL;
windowData->imageCount = 0;
} }
static void VULKAN_INTERNAL_DestroyGraphicsPipelineResourceLayout( static void VULKAN_INTERNAL_DestroyGraphicsPipelineResourceLayout(
@@ -4779,6 +4783,12 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateSemaphore, false); CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateSemaphore, false);
} }
windowData->inFlightFences[i] = NULL;
}
windowData->renderFinishedSemaphore = SDL_malloc(
sizeof(VkSemaphore) * windowData->imageCount);
for (i = 0; i < windowData->imageCount; i += 1) {
vulkanResult = renderer->vkCreateSemaphore( vulkanResult = renderer->vkCreateSemaphore(
renderer->logicalDevice, renderer->logicalDevice,
&semaphoreCreateInfo, &semaphoreCreateInfo,
@@ -4798,8 +4808,6 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
windowData->swapchain = VK_NULL_HANDLE; windowData->swapchain = VK_NULL_HANDLE;
CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateSemaphore, false); CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateSemaphore, false);
} }
windowData->inFlightFences[i] = NULL;
} }
windowData->needsSwapchainRecreate = false; windowData->needsSwapchainRecreate = false;
@@ -10020,7 +10028,7 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture(
} }
vulkanCommandBuffer->signalSemaphores[vulkanCommandBuffer->signalSemaphoreCount] = vulkanCommandBuffer->signalSemaphores[vulkanCommandBuffer->signalSemaphoreCount] =
windowData->renderFinishedSemaphore[windowData->frameCounter]; windowData->renderFinishedSemaphore[swapchainImageIndex];
vulkanCommandBuffer->signalSemaphoreCount += 1; vulkanCommandBuffer->signalSemaphoreCount += 1;
*swapchainTexture = (SDL_GPUTexture *)swapchainTextureContainer; *swapchainTexture = (SDL_GPUTexture *)swapchainTextureContainer;
@@ -10561,7 +10569,7 @@ static bool VULKAN_Submit(
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.pNext = NULL; presentInfo.pNext = NULL;
presentInfo.pWaitSemaphores = presentInfo.pWaitSemaphores =
&presentData->windowData->renderFinishedSemaphore[presentData->windowData->frameCounter]; &presentData->windowData->renderFinishedSemaphore[presentData->swapchainImageIndex];
presentInfo.waitSemaphoreCount = 1; presentInfo.waitSemaphoreCount = 1;
presentInfo.pSwapchains = &presentData->windowData->swapchain; presentInfo.pSwapchains = &presentData->windowData->swapchain;
presentInfo.swapchainCount = 1; presentInfo.swapchainCount = 1;