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