Skip to content

Commit

Permalink
SDL_ReCreateWindow: allow to unload METAL window and switch back to O…
Browse files Browse the repository at this point in the history
…penGL.

On older mac, where METAL Renderer METAL fails to create, it allows to switch back to OpenGL SDL_Renderer
by re-creating the window (METAL flags was previously persistent).
  • Loading branch information
1bsyl committed Dec 2, 2020
1 parent 9d40a0f commit 93fbab0
Showing 1 changed file with 30 additions and 19 deletions.
49 changes: 30 additions & 19 deletions src/video/SDL_video.c
Expand Up @@ -1672,6 +1672,8 @@ int
SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
{
SDL_bool loaded_opengl = SDL_FALSE;
SDL_bool need_gl_unload = SDL_FALSE;
SDL_bool need_gl_load = SDL_FALSE;

if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
return SDL_SetError("OpenGL support is either not configured in SDL "
Expand Down Expand Up @@ -1705,48 +1707,57 @@ SDL_RecreateWindow(SDL_Window * window, Uint32 flags)

if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {
if (flags & SDL_WINDOW_OPENGL) {
if (SDL_GL_LoadLibrary(NULL) < 0) {
return -1;
}
loaded_opengl = SDL_TRUE;
need_gl_load = SDL_TRUE;
} else {
SDL_GL_UnloadLibrary();
need_gl_unload = SDL_TRUE;
}
} else if (window->flags & SDL_WINDOW_OPENGL) {
SDL_GL_UnloadLibrary();
if (SDL_GL_LoadLibrary(NULL) < 0) {
return -1;
need_gl_unload = SDL_TRUE;
need_gl_load = SDL_TRUE;
}

if ((window->flags & SDL_WINDOW_METAL) != (flags & SDL_WINDOW_METAL)) {
if (flags & SDL_WINDOW_METAL) {
need_gl_load = SDL_TRUE;
} else {
need_gl_unload = SDL_TRUE;
}
loaded_opengl = SDL_TRUE;
} else if (window->flags & SDL_WINDOW_METAL) {
need_gl_unload = SDL_TRUE;
need_gl_load = SDL_TRUE;
}

if ((window->flags & SDL_WINDOW_VULKAN) != (flags & SDL_WINDOW_VULKAN)) {
SDL_SetError("Can't change SDL_WINDOW_VULKAN window flag");
return -1;
}

/*
if ((window->flags & SDL_WINDOW_METAL) != (flags & SDL_WINDOW_METAL)) {
SDL_SetError("Can't change SDL_WINDOW_METAL window flag");
return -1;
}
*/

if ((window->flags & SDL_WINDOW_VULKAN) && (flags & SDL_WINDOW_OPENGL)) {
if ((flags & SDL_WINDOW_VULKAN) && (flags & SDL_WINDOW_OPENGL)) {
SDL_SetError("Vulkan and OpenGL not supported on same window");
return -1;
}

if ((window->flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_OPENGL)) {
if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_OPENGL)) {
SDL_SetError("Metal and OpenGL not supported on same window");
return -1;
}

if ((window->flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_VULKAN)) {
if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_VULKAN)) {
SDL_SetError("Metal and Vulkan not supported on same window");
return -1;
}

if (need_gl_unload) {
SDL_GL_UnloadLibrary();
}

if (need_gl_load) {
if (SDL_GL_LoadLibrary(NULL) < 0) {
return -1;
}
loaded_opengl = SDL_TRUE;
}

window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);
window->last_fullscreen_flags = window->flags;
window->is_destroying = SDL_FALSE;
Expand Down

0 comments on commit 93fbab0

Please sign in to comment.