diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 6f6f8f9ef9..03318420c9 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); }