Vulkan Renderer - handle dynamic resetting of vsync, requires swapchain recreation.

This commit is contained in:
danginsburg 2024-02-23 10:45:10 -05:00 committed by Sam Lantinga
parent b1431e6702
commit 97372b56e8

View file

@ -287,7 +287,7 @@ typedef struct
VkFence *fences; VkFence *fences;
VkSurfaceCapabilitiesKHR surfaceCapabilities; VkSurfaceCapabilitiesKHR surfaceCapabilities;
VkSurfaceFormatKHR *surfaceFormats; VkSurfaceFormatKHR *surfaceFormats;
SDL_bool pixelSizeChanged; SDL_bool recreateSwapchain;
VkFramebuffer *framebuffers; VkFramebuffer *framebuffers;
VkRenderPass renderPasses[SDL_VULKAN_NUM_RENDERPASSES]; VkRenderPass renderPasses[SDL_VULKAN_NUM_RENDERPASSES];
@ -2225,7 +2225,7 @@ static VkResult VULKAN_CreateWindowSizeDependentResources(SDL_Renderer *renderer
result = VULKAN_CreateSwapChain(renderer, w, h); result = VULKAN_CreateSwapChain(renderer, w, h);
if (result != VK_SUCCESS) { if (result != VK_SUCCESS) {
rendererData->pixelSizeChanged = VK_TRUE; rendererData->recreateSwapchain = VK_TRUE;
} }
rendererData->viewportDirty = SDL_TRUE; rendererData->viewportDirty = SDL_TRUE;
@ -2248,7 +2248,7 @@ static void VULKAN_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *ev
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->driverdata; VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->driverdata;
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
rendererData->pixelSizeChanged = SDL_TRUE; rendererData->recreateSwapchain = SDL_TRUE;
} }
} }
@ -3361,11 +3361,11 @@ static int VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
VULKAN_DrawStateCache stateCache; VULKAN_DrawStateCache stateCache;
SDL_memset(&stateCache, 0, sizeof(stateCache)); SDL_memset(&stateCache, 0, sizeof(stateCache));
if (rendererData->pixelSizeChanged) { if (rendererData->recreateSwapchain) {
if (VULKAN_UpdateForWindowSizeChange(renderer) != VK_SUCCESS) { if (VULKAN_UpdateForWindowSizeChange(renderer) != VK_SUCCESS) {
return -1; return -1;
} }
rendererData->pixelSizeChanged = SDL_FALSE; rendererData->recreateSwapchain = SDL_FALSE;
} }
if (VULKAN_UpdateVertexBuffer(renderer, vertices, vertsize, &stateCache) < 0) { if (VULKAN_UpdateVertexBuffer(renderer, vertices, vertsize, &stateCache) < 0) {
@ -3663,11 +3663,17 @@ static int VULKAN_RenderPresent(SDL_Renderer *renderer)
static int VULKAN_SetVSync(SDL_Renderer *renderer, const int vsync) static int VULKAN_SetVSync(SDL_Renderer *renderer, const int vsync)
{ {
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->driverdata;
Uint32 prevFlags = renderer->info.flags;
if (vsync) { if (vsync) {
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
} else { } else {
renderer->info.flags &= ~SDL_RENDERER_PRESENTVSYNC; renderer->info.flags &= ~SDL_RENDERER_PRESENTVSYNC;
} }
if (prevFlags != renderer->info.flags) {
rendererData->recreateSwapchain = SDL_TRUE;
}
return 0; return 0;
} }