diff --git a/app/src/display.c b/app/src/display.c index c4127022..e7795c76 100644 --- a/app/src/display.c +++ b/app/src/display.c @@ -40,31 +40,9 @@ sc_display_init(struct sc_display *display, SDL_Renderer *renderer, display->mipmaps = false; -#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE - display->gl_context = NULL; -#endif - // starts with "opengl" bool use_opengl = renderer_name && !strncmp(renderer_name, "opengl", 6); if (use_opengl) { - -#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE - // Persuade macOS to give us something better than OpenGL 2.1. - // If we create a Core Profile context, we get the best OpenGL version. - bool ok = SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, - SDL_GL_CONTEXT_PROFILE_CORE); - if (!ok) { - LOGW("Could not set a GL Core Profile Context"); - } - - LOGD("Creating OpenGL Core Profile context"); - display->gl_context = SDL_GL_CreateContext(window); - if (!display->gl_context) { - LOGE("Could not create OpenGL context: %s", SDL_GetError()); - return false; - } -#endif - struct sc_opengl *gl = &display->gl; sc_opengl_init(gl); @@ -107,9 +85,6 @@ sc_display_init(struct sc_display *display, SDL_Renderer *renderer, void sc_display_destroy(struct sc_display *display) { -#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE - SDL_GL_DestroyContext(display->gl_context); -#endif if (display->texture) { SDL_DestroyTexture(display->texture); } diff --git a/app/src/display.h b/app/src/display.h index 71ee2f20..a8d0141b 100644 --- a/app/src/display.h +++ b/app/src/display.h @@ -12,18 +12,11 @@ #include "opengl.h" #include "options.h" -#ifdef __APPLE__ -# define SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE -#endif - struct sc_display { SDL_Renderer *renderer; // owned by the caller SDL_Texture *texture; struct sc_opengl gl; -#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE - SDL_GLContext gl_context; -#endif bool mipmaps; uint32_t texture_id; // only set if mipmaps is enabled diff --git a/app/src/screen.c b/app/src/screen.c index c5ab63de..dbf13dbd 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -395,6 +395,30 @@ sc_screen_init(struct sc_screen *screen, goto error_destroy_window; } +#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE + screen->gl_context = NULL; + + // starts with "opengl" + const char *renderer_name = SDL_GetRendererName(screen->renderer); + bool use_opengl = renderer_name && !strncmp(renderer_name, "opengl", 6); + if (use_opengl) { + // Persuade macOS to give us something better than OpenGL 2.1. + // If we create a Core Profile context, we get the best OpenGL version. + bool ok = SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_CONTEXT_PROFILE_CORE); + if (!ok) { + LOGW("Could not set a GL Core Profile Context"); + } + + LOGD("Creating OpenGL Core Profile context"); + screen->gl_context = SDL_GL_CreateContext(screen->window); + if (!screen->gl_context) { + LOGE("Could not create OpenGL context: %s", SDL_GetError()); + goto error_destroy_renderer; + } + } +#endif + SDL_Surface *icon_novideo = params->video ? NULL : icon; bool mipmaps = params->video && params->mipmaps; ok = sc_display_init(&screen->display, screen->renderer, icon_novideo, @@ -468,6 +492,11 @@ sc_screen_init(struct sc_screen *screen, error_destroy_display: sc_display_destroy(&screen->display); error_destroy_renderer: +#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE + if (screen->gl_context) { + SDL_GL_DestroyContext(screen->gl_context); + } +#endif SDL_DestroyRenderer(screen->renderer); error_destroy_window: SDL_DestroyWindow(screen->window); @@ -532,6 +561,9 @@ sc_screen_destroy(struct sc_screen *screen) { #endif sc_display_destroy(&screen->display); av_frame_free(&screen->frame); +#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE + SDL_GL_DestroyContext(screen->gl_context); +#endif SDL_DestroyRenderer(screen->renderer); SDL_DestroyWindow(screen->window); sc_fps_counter_destroy(&screen->fps_counter); diff --git a/app/src/screen.h b/app/src/screen.h index 9e81cea8..50634796 100644 --- a/app/src/screen.h +++ b/app/src/screen.h @@ -22,6 +22,10 @@ #include "trait/frame_sink.h" #include "trait/mouse_processor.h" +#ifdef __APPLE__ +# define SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE +#endif + struct sc_screen { struct sc_frame_sink frame_sink; // frame sink trait @@ -50,6 +54,10 @@ struct sc_screen { SDL_Window *window; SDL_Renderer *renderer; +#ifdef SC_DISPLAY_FORCE_OPENGL_CORE_PROFILE + SDL_GLContext gl_context; +#endif + struct sc_size frame_size; struct sc_size content_size; // rotated frame_size