From f70ebeb2b3a1a6f2654020d3d2ca29ccfd0f1d97 Mon Sep 17 00:00:00 2001 From: vanfanel Date: Sun, 10 May 2020 15:41:46 +0200 Subject: [PATCH 1/4] Use the system video mode in GLES platforms instead of setting a new one. --- src/pc/gfx/gfx_sdl2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index fb7f6a0..e85412f 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -113,8 +113,10 @@ static void gfx_sdl_init(void) { wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); #else + /* GLES platforms generally run without a window server like Xorg. Just use the system video mode, + instead of trying to set a new video mode, which does not make any sense in modern displays. */ wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL_ES2)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); + 0, 0, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP); #endif gfx_sdl_set_fullscreen(configFullscreen); From fd02d88b5938a83075ed38f60c458917d3838e05 Mon Sep 17 00:00:00 2001 From: vanfanel Date: Sun, 10 May 2020 17:52:01 +0200 Subject: [PATCH 2/4] Fix for GLES on windowed rendering contexts (X11) --- src/pc/gfx/gfx_sdl2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index e85412f..824c20a 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -115,8 +115,10 @@ static void gfx_sdl_init(void) { #else /* GLES platforms generally run without a window server like Xorg. Just use the system video mode, instead of trying to set a new video mode, which does not make any sense in modern displays. */ + SDL_DisplayMode sdl_displaymode; + SDL_GetCurrentDisplayMode(0, &sdl_displaymode); wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL_ES2)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - 0, 0, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP); + sdl_displaymode.w, sdl_displaymode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN_DESKTOP); #endif gfx_sdl_set_fullscreen(configFullscreen); From 16a4495bf2e054a7038066f837c8847b546ef988 Mon Sep 17 00:00:00 2001 From: vanfanel Date: Sun, 10 May 2020 18:07:26 +0200 Subject: [PATCH 3/4] Do not call gfx_sdl_set_fullscreen() just after creating the game window: create window fullscreen or not directly. --- src/pc/gfx/gfx_sdl2.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index 824c20a..3f75ed2 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -95,6 +95,8 @@ static void gfx_sdl_set_fullscreen(bool fullscreen) } static void gfx_sdl_init(void) { + Uint32 window_flags = 0; + SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); @@ -108,21 +110,27 @@ static void gfx_sdl_init(void) { //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); - + + window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE; + + if (configFullscreen) { + window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; + } + + #ifndef USE_GLES wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); + DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags); #else /* GLES platforms generally run without a window server like Xorg. Just use the system video mode, instead of trying to set a new video mode, which does not make any sense in modern displays. */ SDL_DisplayMode sdl_displaymode; SDL_GetCurrentDisplayMode(0, &sdl_displaymode); + wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL_ES2)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - sdl_displaymode.w, sdl_displaymode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN_DESKTOP); + sdl_displaymode.w, sdl_displaymode.h, window_flags); #endif - gfx_sdl_set_fullscreen(configFullscreen); - SDL_GL_CreateContext(wnd); SDL_GL_SetSwapInterval(1); // We have a double buffered GL context, it makes no sense to want tearing. From f24d44c9c73adb8361d1a7f74981adf84f64cfd7 Mon Sep 17 00:00:00 2001 From: vanfanel Date: Sun, 10 May 2020 18:23:34 +0200 Subject: [PATCH 4/4] Remove redundant code. Make GLES and GL modes respect DESIRED_WIDTH and DESIRED_HEIGHT in windowed mode, but in fullscreen mode just use the system video mode. --- src/pc/gfx/gfx_sdl2.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index 3f75ed2..80a539a 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -117,19 +117,23 @@ static void gfx_sdl_init(void) { window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; } - - #ifndef USE_GLES - wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags); - #else - /* GLES platforms generally run without a window server like Xorg. Just use the system video mode, - instead of trying to set a new video mode, which does not make any sense in modern displays. */ SDL_DisplayMode sdl_displaymode; SDL_GetCurrentDisplayMode(0, &sdl_displaymode); - wnd = SDL_CreateWindow("Super Mario 64 PC port (OpenGL_ES2)", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - sdl_displaymode.w, sdl_displaymode.h, window_flags); + const char* window_title = + #ifndef USE_GLES + "Super Mario 64 PC port (OpenGL)"; + #else + "Super Mario 64 PC port (OpenGL_ES2)"; #endif + + if (configFullscreen) { + wnd = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + sdl_displaymode.w, sdl_displaymode.h, window_flags); + } else { + wnd = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags); + } SDL_GL_CreateContext(wnd); SDL_GL_SetSwapInterval(1); // We have a double buffered GL context, it makes no sense to want tearing.