From 6d47d8dff12ac20cffa530c74595c70e9acc38fc Mon Sep 17 00:00:00 2001
From: Adrian <[EMAIL REDACTED]>
Date: Sun, 5 Oct 2025 18:59:24 +0200
Subject: [PATCH] Always convert window to Vulkan window on
SDL_Vulkan_CreateSurface (#14143)
---
src/video/SDL_video.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 6f6f8f9ef9c1a..03318420c93f8 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -2674,7 +2674,7 @@ static bool SDL_ReconfigureWindowInternal(SDL_Window *window, SDL_WindowFlags fl
return false;
}
} else if (graphics_flags & SDL_WINDOW_VULKAN) {
- loaded_vulkan = SDL_GL_LoadLibrary(NULL);
+ loaded_vulkan = SDL_Vulkan_LoadLibrary(NULL);
if (!loaded_vulkan) {
return false;
}
@@ -6176,8 +6176,9 @@ bool SDL_Vulkan_CreateSurface(SDL_Window *window,
{
CHECK_WINDOW_MAGIC(window, false);
- if (!(window->flags & SDL_WINDOW_VULKAN)) {
- return SDL_SetError(NOT_A_VULKAN_WINDOW);
+ if (!_this->Vulkan_CreateSurface) {
+ SDL_Unsupported();
+ return false;
}
CHECK_PARAM(!instance) {
@@ -6188,6 +6189,23 @@ bool SDL_Vulkan_CreateSurface(SDL_Window *window,
return SDL_InvalidParamError("surface");
}
+ if (!(window->flags & SDL_WINDOW_VULKAN)) {
+ // No problem, we can convert to Vulkan
+ if (window->flags & SDL_WINDOW_OPENGL) {
+ window->flags &= ~SDL_WINDOW_OPENGL;
+ SDL_GL_UnloadLibrary();
+ }
+ if (window->flags & SDL_WINDOW_METAL) {
+ window->flags &= ~SDL_WINDOW_METAL;
+ // Nothing more to do for Metal.
+ }
+ if (SDL_Vulkan_LoadLibrary(NULL)) {
+ window->flags |= SDL_WINDOW_VULKAN;
+ } else {
+ return SDL_SetError("failed to load Vulkan library");
+ }
+ }
+
return _this->Vulkan_CreateSurface(_this, window, instance, allocator, surface);
}