GRIM: Take adventage of kFeatureFullscreenToggleKeepsContext

This commit is contained in:
Bastien Bouclet 2017-08-26 22:24:18 +02:00
parent be5a139ce5
commit f4e3bd0424
7 changed files with 19 additions and 20 deletions

View file

@ -48,7 +48,7 @@ namespace Grim {
GfxBase::GfxBase() : GfxBase::GfxBase() :
_renderBitmaps(true), _renderZBitmaps(true), _shadowModeActive(false), _renderBitmaps(true), _renderZBitmaps(true), _shadowModeActive(false),
_currentPos(0, 0, 0), _dimLevel(0.0f), _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), _scaleW(1.0f), _scaleH(1.0f), _currentShadowArray(nullptr),
_shadowColorR(255), _shadowColorG(255), _shadowColorB(255) { _shadowColorR(255), _shadowColorG(255), _shadowColorB(255) {
for (unsigned int i = 0; i < _numSpecialtyTextures; i++) { for (unsigned int i = 0; i < _numSpecialtyTextures; i++) {

View file

@ -93,12 +93,7 @@ public:
* @return true if supports shaders, false otherwise * @return true if supports shaders, false otherwise
*/ */
virtual bool supportsShaders() = 0; 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 getScreenWidth() { return _screenWidth; }
virtual uint getScreenHeight() { return _screenHeight; } virtual uint getScreenHeight() { return _screenHeight; }
@ -285,7 +280,6 @@ protected:
static const int _gameWidth = 640; static const int _gameWidth = 640;
float _scaleW, _scaleH; float _scaleW, _scaleH;
int _screenWidth, _screenHeight; int _screenWidth, _screenHeight;
bool _isFullscreen;
Shadow *_currentShadowArray; Shadow *_currentShadowArray;
unsigned char _shadowColorR; unsigned char _shadowColorR;
unsigned char _shadowColorG; unsigned char _shadowColorG;

View file

@ -134,7 +134,6 @@ byte *GfxOpenGL::setupScreen(int screenW, int screenH, bool fullscreen) {
_scaleW = _screenWidth / (float)_gameWidth; _scaleW = _screenWidth / (float)_gameWidth;
_scaleH = _screenHeight / (float)_gameHeight; _scaleH = _screenHeight / (float)_gameHeight;
_isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode);
_useDepthShader = false; _useDepthShader = false;
_useDimShader = false; _useDimShader = false;

View file

@ -411,7 +411,6 @@ byte *GfxOpenGLS::setupScreen(int screenW, int screenH, bool fullscreen) {
_scaleW = _screenWidth / (float)_gameWidth; _scaleW = _screenWidth / (float)_gameWidth;
_scaleH = _screenHeight / (float)_gameHeight; _scaleH = _screenHeight / (float)_gameHeight;
_isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode);
#ifdef USE_GLES2 #ifdef USE_GLES2
g_system->setFeatureState(OSystem::kFeatureVirtControls, true); g_system->setFeatureState(OSystem::kFeatureVirtControls, true);
#endif #endif

View file

@ -86,8 +86,6 @@ byte *GfxTinyGL::setupScreen(int screenW, int screenH, bool fullscreen) {
_scaleW = _screenWidth / (float)_gameWidth; _scaleW = _screenWidth / (float)_gameWidth;
_scaleH = _screenHeight / (float)_gameHeight; _scaleH = _screenHeight / (float)_gameHeight;
_isFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode);
g_system->showMouse(!fullscreen); g_system->showMouse(!fullscreen);
g_system->setWindowCaption("ResidualVM: Software 3D Renderer"); g_system->setWindowCaption("ResidualVM: Software 3D Renderer");

View file

@ -232,12 +232,11 @@ LuaBase *GrimEngine::createLua() {
return new Lua_V1(); 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"); Common::String rendererConfig = ConfMan.get("renderer");
Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig); Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig);
Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType); Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType);
bool fullscreen = ConfMan.getBool("fullscreen");
_softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL; _softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL;
_system->setupScreen(screenW, screenH, fullscreen, !_softRenderer); _system->setupScreen(screenW, screenH, fullscreen, !_softRenderer);
@ -346,7 +345,8 @@ Common::Error GrimEngine::run() {
} }
g_sound = new SoundPlayer(); 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")) { if (getGameType() == GType_MONKEY4 && SearchMan.hasFile("AMWI.m4b")) {
// Play EMI Mac Aspyr logo // Play EMI Mac Aspyr logo
@ -772,15 +772,24 @@ void GrimEngine::mainLoop() {
savegameSave(); 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) { if (_changeHardwareState || _changeFullscreenState) {
_changeHardwareState = false; _changeHardwareState = false;
bool fullscreen = g_driver->isFullscreen(); bool fullscreen = _system->getFeatureState(OSystem::kFeatureFullscreenMode);
if (_changeFullscreenState) { if (_changeFullscreenState) {
fullscreen = !fullscreen; fullscreen = !fullscreen;
} }
g_system->setFeatureState(OSystem::kFeatureFullscreenMode, fullscreen);
ConfMan.setBool("fullscreen", fullscreen);
uint screenWidth = g_driver->getScreenWidth(); uint screenWidth = g_driver->getScreenWidth();
uint screenHeight = g_driver->getScreenHeight(); uint screenHeight = g_driver->getScreenHeight();
@ -792,7 +801,7 @@ void GrimEngine::mainLoop() {
clearPools(); clearPools();
delete g_driver; delete g_driver;
g_driver = createRenderer(screenWidth, screenHeight); g_driver = createRenderer(screenWidth, screenHeight, fullscreen);
savegameRestore(); savegameRestore();
if (mode == DrawMode) { if (mode == DrawMode) {

View file

@ -197,7 +197,7 @@ protected:
void cameraPostChangeHandle(int num); void cameraPostChangeHandle(int num);
void buildActiveActorsList(); void buildActiveActorsList();
void savegameCallback(); void savegameCallback();
GfxBase *createRenderer(int screenW, int screenH); GfxBase *createRenderer(int screenW, int screenH, bool fullscreen);
void playAspyrLogo(); void playAspyrLogo();
virtual LuaBase *createLua(); virtual LuaBase *createLua();
virtual void updateNormalMode(); virtual void updateNormalMode();