Fix vulkan gpu resize lag on windows

This commit is contained in:
HTuanPhong
2025-10-02 16:34:58 +07:00
committed by Sam Lantinga
parent 134b47730b
commit 2638537f92

View File

@@ -3164,7 +3164,7 @@ static void VULKAN_INTERNAL_DestroySampler(
SDL_free(vulkanSampler);
}
static void VULKAN_INTERNAL_DestroySwapchain(
static void VULKAN_INTERNAL_DestroySwapchainImage(
VulkanRenderer *renderer,
WindowData *windowData)
{
@@ -3190,22 +3190,6 @@ static void VULKAN_INTERNAL_DestroySwapchain(
SDL_free(windowData->textureContainers);
windowData->textureContainers = NULL;
if (windowData->swapchain) {
renderer->vkDestroySwapchainKHR(
renderer->logicalDevice,
windowData->swapchain,
NULL);
windowData->swapchain = VK_NULL_HANDLE;
}
if (windowData->surface) {
renderer->vkDestroySurfaceKHR(
renderer->instance,
windowData->surface,
NULL);
windowData->surface = VK_NULL_HANDLE;
}
for (i = 0; i < MAX_FRAMES_IN_FLIGHT; i += 1) {
if (windowData->imageAvailableSemaphore[i]) {
renderer->vkDestroySemaphore(
@@ -3230,6 +3214,33 @@ static void VULKAN_INTERNAL_DestroySwapchain(
windowData->imageCount = 0;
}
static void VULKAN_INTERNAL_DestroySwapchain(
VulkanRenderer *renderer,
WindowData *windowData)
{
if (windowData == NULL) {
return;
}
VULKAN_INTERNAL_DestroySwapchainImage(renderer, windowData);
if (windowData->swapchain) {
renderer->vkDestroySwapchainKHR(
renderer->logicalDevice,
windowData->swapchain,
NULL);
windowData->swapchain = VK_NULL_HANDLE;
}
if (windowData->surface) {
renderer->vkDestroySurfaceKHR(
renderer->instance,
windowData->surface,
NULL);
windowData->surface = VK_NULL_HANDLE;
}
}
static void VULKAN_INTERNAL_DestroyGraphicsPipelineResourceLayout(
VulkanRenderer *renderer,
VulkanGraphicsPipelineResourceLayout *resourceLayout)
@@ -4484,6 +4495,8 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
windowData->frameCounter = 0;
// We dont have to create surface again on recreate swapchain
if (windowData->surface == VK_NULL_HANDLE) {
SDL_VideoDevice *_this = SDL_GetVideoDevice();
SDL_assert(_this && _this->Vulkan_CreateSurface);
@@ -4496,6 +4509,7 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
&windowData->surface)) {
return false;
}
}
SDL_assert(windowData->surface);
if (!VULKAN_INTERNAL_QuerySwapchainSupport(
@@ -4663,14 +4677,17 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
swapchainCreateInfo.compositeAlpha = compositeAlphaFlag;
swapchainCreateInfo.presentMode = SDLToVK_PresentMode[windowData->presentMode];
swapchainCreateInfo.clipped = VK_TRUE;
swapchainCreateInfo.oldSwapchain = VK_NULL_HANDLE;
swapchainCreateInfo.oldSwapchain = windowData->swapchain;
vulkanResult = renderer->vkCreateSwapchainKHR(
renderer->logicalDevice,
&swapchainCreateInfo,
NULL,
&windowData->swapchain);
if (swapchainCreateInfo.oldSwapchain != VK_NULL_HANDLE) {
renderer->vkDestroySwapchainKHR(renderer->logicalDevice, swapchainCreateInfo.oldSwapchain, NULL);
}
if (swapchainSupportDetails.formatsLength > 0) {
SDL_free(swapchainSupportDetails.formats);
}
@@ -4684,6 +4701,7 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
windowData->surface,
NULL);
windowData->surface = VK_NULL_HANDLE;
windowData->swapchain = VK_NULL_HANDLE;
CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateSwapchainKHR, false);
}
@@ -9890,7 +9908,7 @@ static Uint32 VULKAN_INTERNAL_RecreateSwapchain(
}
}
VULKAN_INTERNAL_DestroySwapchain(renderer, windowData);
VULKAN_INTERNAL_DestroySwapchainImage(renderer, windowData);
return VULKAN_INTERNAL_CreateSwapchain(renderer, windowData);
}