diff --git a/engines/grim/gfx_base.cpp b/engines/grim/gfx_base.cpp index e9972929b43..f035bd0a925 100644 --- a/engines/grim/gfx_base.cpp +++ b/engines/grim/gfx_base.cpp @@ -48,7 +48,7 @@ namespace Grim { GfxBase::GfxBase() : _renderBitmaps(true), _renderZBitmaps(true), _shadowModeActive(false), _currentPos(0, 0, 0), _dimLevel(0.0f), - _screenWidth(0), _screenHeight(0), _isFullscreen(false), + _screenWidth(0), _screenHeight(0), _scaleW(1.0f), _scaleH(1.0f), _currentShadowArray(nullptr), _shadowColorR(255), _shadowColorG(255), _shadowColorB(255) { for (unsigned int i = 0; i < _numSpecialtyTextures; i++) { diff --git a/engines/grim/gfx_base.h b/engines/grim/gfx_base.h index a809e21451e..cf813ad8c95 100644 --- a/engines/grim/gfx_base.h +++ b/engines/grim/gfx_base.h @@ -93,12 +93,7 @@ public: * @return true if supports shaders, false otherwise */ virtual bool supportsShaders() = 0; - /** - * Query whether the current context is fullscreen. - * - * @return true if fullscreen, false otherwise - */ - virtual bool isFullscreen() { return _isFullscreen; } + virtual uint getScreenWidth() { return _screenWidth; } virtual uint getScreenHeight() { return _screenHeight; } @@ -285,7 +280,6 @@ protected: static const int _gameWidth = 640; float _scaleW, _scaleH; int _screenWidth, _screenHeight; - bool _isFullscreen; Shadow *_currentShadowArray; unsigned char _shadowColorR; unsigned char _shadowColorG; diff --git a/engines/grim/gfx_opengl.cpp b/engines/grim/gfx_opengl.cpp index fc77e9532c9..02f07b109b0 100644 --- a/engines/grim/gfx_opengl.cpp +++ b/engines/grim/gfx_opengl.cpp @@ -134,7 +134,6 @@ byte *GfxOpenGL::setupScreen(int screenW, int screenH, bool fullscreen) { _scaleW = _screenWidth / (float)_gameWidth; _scaleH = _screenHeight / (float)_gameHeight; - _isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode); _useDepthShader = false; _useDimShader = false; diff --git a/engines/grim/gfx_opengl_shaders.cpp b/engines/grim/gfx_opengl_shaders.cpp index f71a04ee5f7..219fa3efff3 100644 --- a/engines/grim/gfx_opengl_shaders.cpp +++ b/engines/grim/gfx_opengl_shaders.cpp @@ -411,7 +411,6 @@ byte *GfxOpenGLS::setupScreen(int screenW, int screenH, bool fullscreen) { _scaleW = _screenWidth / (float)_gameWidth; _scaleH = _screenHeight / (float)_gameHeight; - _isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode); #ifdef USE_GLES2 g_system->setFeatureState(OSystem::kFeatureVirtControls, true); #endif diff --git a/engines/grim/gfx_tinygl.cpp b/engines/grim/gfx_tinygl.cpp index 72c75113505..25702806659 100644 --- a/engines/grim/gfx_tinygl.cpp +++ b/engines/grim/gfx_tinygl.cpp @@ -86,8 +86,6 @@ byte *GfxTinyGL::setupScreen(int screenW, int screenH, bool fullscreen) { _scaleW = _screenWidth / (float)_gameWidth; _scaleH = _screenHeight / (float)_gameHeight; - _isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode); - g_system->showMouse(!fullscreen); g_system->setWindowCaption("ResidualVM: Software 3D Renderer"); diff --git a/engines/grim/grim.cpp b/engines/grim/grim.cpp index ce3a601928d..4a8d2c37e75 100644 --- a/engines/grim/grim.cpp +++ b/engines/grim/grim.cpp @@ -232,12 +232,11 @@ LuaBase *GrimEngine::createLua() { return new Lua_V1(); } -GfxBase *GrimEngine::createRenderer(int screenW, int screenH) { +GfxBase *GrimEngine::createRenderer(int screenW, int screenH, bool fullscreen) { Common::String rendererConfig = ConfMan.get("renderer"); Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig); Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType); - bool fullscreen = ConfMan.getBool("fullscreen"); _softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL; _system->setupScreen(screenW, screenH, fullscreen, !_softRenderer); @@ -346,7 +345,8 @@ Common::Error GrimEngine::run() { } g_sound = new SoundPlayer(); - g_driver = createRenderer(640, 480); + bool fullscreen = ConfMan.getBool("fullscreen"); + g_driver = createRenderer(640, 480, fullscreen); if (getGameType() == GType_MONKEY4 && SearchMan.hasFile("AMWI.m4b")) { // Play EMI Mac Aspyr logo @@ -772,15 +772,24 @@ void GrimEngine::mainLoop() { savegameSave(); } + // If the backend can keep the OpenGL context when switching to fullscreen, + // just toggle the fullscreen feature (SDL2 path). + if (_changeFullscreenState && + _system->hasFeature(OSystem::kFeatureFullscreenToggleKeepsContext)) { + bool fullscreen = _system->getFeatureState(OSystem::kFeatureFullscreenMode); + _system->setFeatureState(OSystem::kFeatureFullscreenMode, !fullscreen); + _changeFullscreenState = false; + } + + // If the backend destroys the OpenGL context or the user switched to a different + // renderer, the GFX driver needs to be recreated (SDL1 path). if (_changeHardwareState || _changeFullscreenState) { _changeHardwareState = false; - bool fullscreen = g_driver->isFullscreen(); + bool fullscreen = _system->getFeatureState(OSystem::kFeatureFullscreenMode); if (_changeFullscreenState) { fullscreen = !fullscreen; } - g_system->setFeatureState(OSystem::kFeatureFullscreenMode, fullscreen); - ConfMan.setBool("fullscreen", fullscreen); uint screenWidth = g_driver->getScreenWidth(); uint screenHeight = g_driver->getScreenHeight(); @@ -792,7 +801,7 @@ void GrimEngine::mainLoop() { clearPools(); delete g_driver; - g_driver = createRenderer(screenWidth, screenHeight); + g_driver = createRenderer(screenWidth, screenHeight, fullscreen); savegameRestore(); if (mode == DrawMode) { diff --git a/engines/grim/grim.h b/engines/grim/grim.h index 386ade515f0..a728b8148c9 100644 --- a/engines/grim/grim.h +++ b/engines/grim/grim.h @@ -197,7 +197,7 @@ protected: void cameraPostChangeHandle(int num); void buildActiveActorsList(); void savegameCallback(); - GfxBase *createRenderer(int screenW, int screenH); + GfxBase *createRenderer(int screenW, int screenH, bool fullscreen); void playAspyrLogo(); virtual LuaBase *createLua(); virtual void updateNormalMode();