mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-06 09:56:26 +00:00
Fix vulkan gpu resize lag on windows
This commit is contained in:
@@ -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,17 +4495,20 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain(
|
||||
|
||||
windowData->frameCounter = 0;
|
||||
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
SDL_assert(_this && _this->Vulkan_CreateSurface);
|
||||
// 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);
|
||||
|
||||
// Each swapchain must have its own surface.
|
||||
if (!_this->Vulkan_CreateSurface(
|
||||
_this,
|
||||
windowData->window,
|
||||
renderer->instance,
|
||||
NULL, // FIXME: VAllocationCallbacks
|
||||
&windowData->surface)) {
|
||||
return false;
|
||||
// Each swapchain must have its own surface.
|
||||
if (!_this->Vulkan_CreateSurface(
|
||||
_this,
|
||||
windowData->window,
|
||||
renderer->instance,
|
||||
NULL, // FIXME: VAllocationCallbacks
|
||||
&windowData->surface)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
SDL_assert(windowData->surface);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user