all repos — mgba @ eafd265ab6b0b025279dea5d6a485ecaa6b724a9

mGBA Game Boy Advance Emulator

SDL: Fix changing screen size when using OpenGL ES 2
Cameron Cawley ccawley2011@gmail.com
Mon, 29 Jan 2018 17:29:19 +0000
commit

eafd265ab6b0b025279dea5d6a485ecaa6b724a9

parent

4f8fe384b3255b0df373ab949451313e657c77c0

M src/platform/sdl/gl-common.csrc/platform/sdl/gl-common.c

@@ -7,6 +7,13 @@ #include "main.h"

#include <mgba/core/version.h> +void mSDLGLDoViewport(int w, int h, struct VideoBackend* v) { + v->resized(v, w, h); + v->clear(v); + v->swap(v); + v->clear(v); +} + void mSDLGLCommonSwap(struct VideoBackend* context) { struct mSDLRenderer* renderer = (struct mSDLRenderer*) context->user; #if SDL_VERSION_ATLEAST(2, 0, 0)
M src/platform/sdl/gl-common.hsrc/platform/sdl/gl-common.h

@@ -12,6 +12,7 @@ CXX_GUARD_START

#include "main.h" +void mSDLGLDoViewport(int w, int h, struct VideoBackend* v); void mSDLGLCommonSwap(struct VideoBackend* context); void mSDLGLCommonInit(struct mSDLRenderer* renderer);
M src/platform/sdl/gl-sdl.csrc/platform/sdl/gl-sdl.c

@@ -13,13 +13,6 @@ #include <mgba-util/math.h>

#include "platform/opengl/gl.h" -static void _doViewport(int w, int h, struct VideoBackend* v) { - v->resized(v, w, h); - v->clear(v); - v->swap(v); - v->clear(v); -} - static bool mSDLGLInit(struct mSDLRenderer* renderer); static void mSDLGLRunloop(struct mSDLRenderer* renderer, void* user); static void mSDLGLDeinit(struct mSDLRenderer* renderer);

@@ -47,7 +40,7 @@ renderer->gl.d.swap = mSDLGLCommonSwap;

renderer->gl.d.init(&renderer->gl.d, 0); renderer->gl.d.setDimensions(&renderer->gl.d, renderer->width, renderer->height); - _doViewport(renderer->viewportWidth, renderer->viewportHeight, &renderer->gl.d); + mSDLGLDoViewport(renderer->viewportWidth, renderer->viewportHeight, &renderer->gl.d); return true; }

@@ -63,7 +56,7 @@ #if SDL_VERSION_ATLEAST(2, 0, 0)

// Event handling can change the size of the screen if (renderer->player.windowUpdated) { SDL_GetWindowSize(renderer->window, &renderer->viewportWidth, &renderer->viewportHeight); - _doViewport(renderer->viewportWidth, renderer->viewportHeight, v); + mSDLGLDoViewport(renderer->viewportWidth, renderer->viewportHeight, v); renderer->player.windowUpdated = 0; } #endif
M src/platform/sdl/gles2-sdl.csrc/platform/sdl/gles2-sdl.c

@@ -115,6 +115,8 @@ renderer->gl2.d.filter = renderer->filter;

renderer->gl2.d.swap = mSDLGLCommonSwap; renderer->gl2.d.init(&renderer->gl2.d, 0); renderer->gl2.d.setDimensions(&renderer->gl2.d, renderer->width, renderer->height); + + mSDLGLDoViewport(renderer->viewportWidth, renderer->viewportHeight, &renderer->gl2.d); return true; }

@@ -126,6 +128,14 @@

while (mCoreThreadIsActive(context)) { while (SDL_PollEvent(&event)) { mSDLHandleEvent(context, &renderer->player, &event); +#if SDL_VERSION_ATLEAST(2, 0, 0) + // Event handling can change the size of the screen + if (renderer->player.windowUpdated) { + SDL_GetWindowSize(renderer->window, &renderer->viewportWidth, &renderer->viewportHeight); + mSDLGLDoViewport(renderer->viewportWidth, renderer->viewportHeight, v); + renderer->player.windowUpdated = 0; + } +#endif } if (mCoreSyncWaitFrameStart(&context->impl->sync)) {