mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-25 09:44:02 +00:00
Use refresh rate setting + attempt to improve window/fullscreen apply logic
This commit is contained in:
parent
b781b45789
commit
eb8ef1fdf7
4 changed files with 136 additions and 90 deletions
|
@ -777,6 +777,8 @@ void DSQ::setVersionLabelText()
|
|||
|
||||
static bool sdlVideoModeOK(int disp, const int w, const int h, const int bpp)
|
||||
{
|
||||
if(!w && !h)
|
||||
return true;
|
||||
#ifdef BBGE_BUILD_SDL2
|
||||
SDL_DisplayMode mode;
|
||||
const int modecount = SDL_GetNumDisplayModes(disp);
|
||||
|
@ -869,7 +871,6 @@ This build is not yet final, and as such there are a couple things lacking. They
|
|||
|
||||
this->setBaseTextureDirectory("gfx/");
|
||||
|
||||
bool fullscreen = true;
|
||||
voiceOversEnabled = true;
|
||||
|
||||
|
||||
|
@ -878,7 +879,7 @@ This build is not yet final, and as such there are a couple things lacking. They
|
|||
|
||||
particleManager->setSize(user.video.numParticles);
|
||||
|
||||
fullscreen = user.video.full;
|
||||
bool fullscreen = user.video.full;
|
||||
useFrameBuffer = user.video.fbuffer;
|
||||
|
||||
if (isDeveloperKeys())
|
||||
|
@ -898,6 +899,20 @@ This build is not yet final, and as such there are a couple things lacking. They
|
|||
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
if (fullscreen && !sdlVideoModeOK(user.video.displayindex, user.video.resx, user.video.resy, user.video.bits))
|
||||
{
|
||||
SDL_DisplayMode mode, closest;
|
||||
mode.format = 0;
|
||||
mode.driverdata = 0;
|
||||
mode.w = user.video.resx;
|
||||
mode.h = user.video.resy;
|
||||
mode.refresh_rate = user.video.hz;
|
||||
if(SDL_GetClosestDisplayMode(user.video.displayindex, &mode, &closest))
|
||||
{
|
||||
user.video.resx = closest.w;
|
||||
user.video.resy = closest.h;
|
||||
user.video.hz = closest.refresh_rate;
|
||||
}
|
||||
else
|
||||
{
|
||||
// maybe we can force a sane resolution if SetVideoMode is going to fail...
|
||||
user.video.resx = 800;
|
||||
|
@ -907,9 +922,10 @@ This build is not yet final, and as such there are a couple things lacking. They
|
|||
if (!sdlVideoModeOK(0, user.video.resx, user.video.resy, user.video.bits))
|
||||
fullscreen = false; // last chance.
|
||||
}
|
||||
}
|
||||
|
||||
debugLog("Init Graphics Library...");
|
||||
initGraphicsLibrary(user.video.resx, user.video.resy, fullscreen, user.video.vsync, user.video.bits, user.video.displayindex);
|
||||
initGraphicsLibrary(user.video.resx, user.video.resy, fullscreen, user.video.vsync, user.video.bits, user.video.displayindex, user.video.hz);
|
||||
debugLog("OK");
|
||||
|
||||
debugLog("Init Sound Library...");
|
||||
|
|
|
@ -3292,24 +3292,30 @@ void InGameMenu::onOptionsSave()
|
|||
|
||||
dsq->user.apply();
|
||||
|
||||
if (dsq->user.video.resx != dsq->user_backup.video.resx
|
||||
|| dsq->user.video.resy != dsq->user_backup.video.resy
|
||||
|| dsq->user.video.bits != dsq->user_backup.video.bits
|
||||
|| dsq->user.video.full != dsq->user_backup.video.full
|
||||
|| dsq->user.video.vsync != dsq->user_backup.video.vsync)
|
||||
const UserSettings::Video& bv = dsq->user_backup.video;
|
||||
UserSettings::Video& v = dsq->user.video;
|
||||
|
||||
if (v.resx != bv.resx
|
||||
|| v.resy != bv.resy
|
||||
|| v.bits != bv.bits
|
||||
|| v.full != bv.full
|
||||
|| v.vsync != bv.vsync
|
||||
|| v.hz != bv.hz
|
||||
)
|
||||
{
|
||||
dsq->initGraphics(dsq->user.video.resx, dsq->user.video.resy, dsq->user.video.full);
|
||||
dsq->initGraphics(v.resx, v.resy, v.full, v.vsync, v.bits, -1, v.hz);
|
||||
if (dsq->confirm("", "graphics", false, 10)) {
|
||||
} else {
|
||||
dsq->user.video.resx = dsq->user_backup.video.resx;
|
||||
dsq->user.video.resy = dsq->user_backup.video.resy;
|
||||
dsq->user.video.bits = dsq->user_backup.video.bits;
|
||||
dsq->user.video.full = dsq->user_backup.video.full;
|
||||
dsq->user.video.vsync = dsq->user_backup.video.vsync;
|
||||
v.resx = bv.resx;
|
||||
v.resy = bv.resy;
|
||||
v.bits = bv.bits;
|
||||
v.full = bv.full;
|
||||
v.vsync = bv.vsync;
|
||||
v.hz = bv.hz;
|
||||
|
||||
dsq->user.apply();
|
||||
|
||||
dsq->initGraphics(dsq->user.video.resx, dsq->user.video.resy, dsq->user.video.full);
|
||||
dsq->initGraphics(v.resx, v.resy, v.full);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3909,7 +3915,7 @@ void InGameMenu::toggleOptionsMenu(bool f, bool skipBackup, bool isKeyConfig)
|
|||
if (resBox)
|
||||
{
|
||||
// Note: This adds one past the original list (core->screenModes)
|
||||
ScreenMode m = core->isDesktopResolution() ? ScreenMode(0,0,0) : ScreenMode(core->width, core->height, 0);
|
||||
ScreenMode m = core->isDesktopResolution() ? ScreenMode(0,0,0) : ScreenMode(core->width, core->height, core->getRefreshRate());
|
||||
std::string mstr = screenModeStr(m);
|
||||
if (!resBox->setSelectedItem(mstr))
|
||||
{
|
||||
|
|
135
BBGE/Core.cpp
135
BBGE/Core.cpp
|
@ -146,37 +146,32 @@ void Core::setup_opengl()
|
|||
}
|
||||
|
||||
|
||||
void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int display)
|
||||
void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int display, int hz)
|
||||
{
|
||||
assert(lib_graphics);
|
||||
|
||||
const int oldDisplay = getDisplayIndex();
|
||||
assert(oldDisplay >= 0);
|
||||
if(display == -1)
|
||||
display = oldDisplay;
|
||||
|
||||
int screenw = 0, screenh = 0;
|
||||
if(display >= 0)
|
||||
SDL_DisplayMode displaymode;
|
||||
if(SDL_GetDesktopDisplayMode(display, &displaymode) != 0)
|
||||
{
|
||||
SDL_DisplayMode desktop;
|
||||
if(SDL_GetDesktopDisplayMode(display, &desktop) == 0)
|
||||
{
|
||||
screenw = desktop.w;
|
||||
screenh = desktop.h;
|
||||
}
|
||||
else // fail-safe
|
||||
{
|
||||
screenw = 800;
|
||||
screenh = 600;
|
||||
// fail-safe
|
||||
displaymode.w = 800;
|
||||
displaymode.h = 600;
|
||||
displaymode.driverdata = 0;
|
||||
displaymode.refresh_rate = 0;
|
||||
displaymode.format = 0;
|
||||
display = oldDisplay;
|
||||
}
|
||||
|
||||
// Move window to specified display if necessary
|
||||
if(display != oldDisplay)
|
||||
{
|
||||
SDL_Rect bounds;
|
||||
SDL_GetDisplayBounds(display,&bounds);
|
||||
SDL_SetWindowPosition(gScreen, bounds.x, bounds.y);
|
||||
}
|
||||
int center = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
|
||||
SDL_SetWindowPosition(gScreen, center, center);
|
||||
}
|
||||
|
||||
const int oldw = width;
|
||||
|
@ -186,6 +181,9 @@ void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int di
|
|||
const bool useDesktop = w == 0 || h == 0 || (oldw && w == -1 && oldh && h == -1 && _useDesktopResolution);
|
||||
const bool wasFullscreen = _fullscreen;
|
||||
|
||||
if(hz == -1)
|
||||
hz = _refreshRate;
|
||||
|
||||
if (fullscreen == -1)
|
||||
fullscreen = _fullscreen;
|
||||
|
||||
|
@ -194,8 +192,8 @@ void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int di
|
|||
|
||||
if(useDesktop)
|
||||
{
|
||||
w = screenw;
|
||||
h = screenh;
|
||||
w = displaymode.w;
|
||||
h = displaymode.h;
|
||||
}
|
||||
|
||||
if (w == -1)
|
||||
|
@ -210,6 +208,8 @@ void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int di
|
|||
_vsync = vsync;
|
||||
_fullscreen = fullscreen;
|
||||
_bpp = bpp;
|
||||
_refreshRate = hz;
|
||||
displaymode.refresh_rate = hz;
|
||||
|
||||
#ifdef BBGE_BUILD_SDL2
|
||||
if(vsync)
|
||||
|
@ -221,44 +221,54 @@ void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int di
|
|||
SDL_GL_SetSwapInterval(0);
|
||||
|
||||
// Record window position so we can properly restore it when leaving fullscreen
|
||||
if(fullscreen && !wasFullscreen)
|
||||
SDL_GetWindowPosition(gScreen, &winPosX, &winPosY);
|
||||
//if(fullscreen && !wasFullscreen)
|
||||
// SDL_GetWindowPosition(gScreen, &winPosX, &winPosY);
|
||||
|
||||
if(!!fullscreen != wasFullscreen)
|
||||
SDL_SetWindowFullscreen(gScreen, 0);
|
||||
|
||||
bool resize = true;
|
||||
bool reloadRes = false;
|
||||
bool maximize = true;
|
||||
if(useDesktop != _useDesktopResolution)
|
||||
{
|
||||
int screenflags = 0;
|
||||
if(fullscreen)
|
||||
int usew = 0, useh = 0;
|
||||
bool maximize = !fullscreen;
|
||||
if(!useDesktop)
|
||||
{
|
||||
screenflags |= useDesktop ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_FULLSCREEN;
|
||||
usew = w;
|
||||
useh = h;
|
||||
maximize = false;
|
||||
}
|
||||
if(useDesktop && !fullscreen && wasFullscreen)
|
||||
{
|
||||
usew = oldw;
|
||||
useh = oldh;
|
||||
maximize = false;
|
||||
}
|
||||
createWindow(usew, useh, useDesktop, false);
|
||||
|
||||
reloadRes = true;
|
||||
}
|
||||
|
||||
if(fullscreen)
|
||||
{
|
||||
int screenflags = useDesktop ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_FULLSCREEN;
|
||||
displaymode.w = w;
|
||||
displaymode.h = h;
|
||||
// must not be already in fullscreen here, otherwise new display mode doesn't apply properly
|
||||
SDL_SetWindowSize(gScreen, w, h);
|
||||
SDL_SetWindowDisplayMode(gScreen, &displaymode);
|
||||
SDL_SetWindowFullscreen(gScreen, screenflags);
|
||||
maximize = false;
|
||||
}
|
||||
|
||||
if(!fullscreen && wasFullscreen)
|
||||
{
|
||||
// Need to do this; else the window ends up at (0, 0) with the title bar outside the screen area
|
||||
SDL_SetWindowPosition(gScreen, winPosX, winPosY);
|
||||
int c = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
|
||||
SDL_SetWindowPosition(gScreen, c, c);
|
||||
}
|
||||
}
|
||||
|
||||
bool resize = true;
|
||||
bool reloadRes = false;
|
||||
if(useDesktop != _useDesktopResolution)
|
||||
{
|
||||
if(useDesktop)
|
||||
createWindow(oldw, oldh, true, fullscreen);
|
||||
else
|
||||
createWindow(w, h, false, fullscreen);
|
||||
|
||||
reloadRes = true;
|
||||
if(useDesktop)
|
||||
{
|
||||
SDL_MaximizeWindow(gScreen);
|
||||
resize = false;
|
||||
}
|
||||
}
|
||||
// First time called + windowed mode --> maximize window
|
||||
else if(!oldw && !oldh && useDesktop && !fullscreen)
|
||||
if(maximize)
|
||||
{
|
||||
SDL_MaximizeWindow(gScreen);
|
||||
resize = false;
|
||||
|
@ -282,6 +292,7 @@ void Core::initGraphics(int w, int h, int fullscreen, int vsync, int bpp, int di
|
|||
|
||||
_useDesktopResolution = useDesktop;
|
||||
|
||||
if(!resize)
|
||||
SDL_GetWindowSize(gScreen, &w, &h);
|
||||
|
||||
updateWindowDrawSize(w, h);
|
||||
|
@ -501,6 +512,8 @@ Core::Core(const std::string &filesystem, const std::string& extraDataDir, int n
|
|||
baseCullRadius = 1;
|
||||
width = height = 0;
|
||||
_fullscreen = false;
|
||||
_refreshRate = 0;
|
||||
_useDesktopResolution = false;
|
||||
afterEffectManagerLayer = 0;
|
||||
renderObjectLayers.resize(1);
|
||||
invGlobalScale = 1.0;
|
||||
|
@ -655,12 +668,18 @@ bool Core::isDesktopResolution()
|
|||
int Core::getDisplayIndex()
|
||||
{
|
||||
#ifdef BBGE_BUILD_SDL2
|
||||
return SDL_GetWindowDisplayIndex(gScreen);
|
||||
int display = SDL_GetWindowDisplayIndex(gScreen);
|
||||
return display < 0 ? 0 : display; // if there's an error, assume primary display
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int Core::getRefreshRate()
|
||||
{
|
||||
return _refreshRate;
|
||||
}
|
||||
|
||||
bool Core::isShuttingDown()
|
||||
{
|
||||
return shuttingDown;
|
||||
|
@ -827,7 +846,7 @@ void Core::setClearColor(const Vector &c)
|
|||
|
||||
}
|
||||
|
||||
bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, bool vsync, int bpp, int display)
|
||||
bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, bool vsync, int bpp, int display, int hz)
|
||||
{
|
||||
assert(!gScreen);
|
||||
|
||||
|
@ -886,7 +905,7 @@ bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, bool vsyn
|
|||
|
||||
enumerateScreenModes();
|
||||
|
||||
initGraphics(width, height, fullscreen, vsync, bpp, display);
|
||||
initGraphics(width, height, fullscreen, vsync, bpp, display, hz);
|
||||
|
||||
_hasFocus = true;
|
||||
|
||||
|
@ -896,11 +915,6 @@ bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, bool vsyn
|
|||
|
||||
void Core::createWindow(int w, int h, bool resizable, bool fullscreen)
|
||||
{
|
||||
if(w <= 0)
|
||||
w = 640;
|
||||
if(h <= 0)
|
||||
h = 480;
|
||||
|
||||
#ifdef BBGE_BUILD_SDL2
|
||||
if(gScreen)
|
||||
{
|
||||
|
@ -916,8 +930,17 @@ void Core::createWindow(int w, int h, bool resizable, bool fullscreen)
|
|||
Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
|
||||
if(resizable)
|
||||
flags |= SDL_WINDOW_RESIZABLE;
|
||||
//if(fullscreen) // Ignore fullscreen setting here, it's applied later
|
||||
// flags |= SDL_WINDOW_FULLSCREEN;
|
||||
if(fullscreen)
|
||||
{
|
||||
if(!w && !h)
|
||||
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||
else
|
||||
flags |= SDL_WINDOW_FULLSCREEN;
|
||||
}
|
||||
if(w <= 0)
|
||||
w = 640;
|
||||
if(h <= 0)
|
||||
h = 480;
|
||||
gScreen = SDL_CreateWindow(appName.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, flags);
|
||||
if (gScreen == NULL)
|
||||
{
|
||||
|
|
|
@ -278,7 +278,7 @@ public:
|
|||
|
||||
unsigned getTicks();
|
||||
|
||||
void initGraphics(int w, int h, int fullscreen=-1, int vsync=-1, int bpp=-1, int display=-1); // pass 0x0 for desktop resolution
|
||||
void initGraphics(int w, int h, int fullscreen=-1, int vsync=-1, int bpp=-1, int display=-1, int hz=-1); // pass 0x0 for desktop resolution
|
||||
void updateWindowDrawSize(int w, int h);
|
||||
|
||||
Vector getGameCursorPosition();
|
||||
|
@ -416,6 +416,7 @@ public:
|
|||
bool isFullscreen();
|
||||
bool isDesktopResolution();
|
||||
int getDisplayIndex();
|
||||
int getRefreshRate();
|
||||
|
||||
int getVirtualOffX();
|
||||
int getVirtualOffY();
|
||||
|
@ -483,7 +484,7 @@ protected:
|
|||
bool initSoundLibrary(const std::string &defaultDevice);
|
||||
bool initInputLibrary();
|
||||
void initJoystickLibrary();
|
||||
bool initGraphicsLibrary(int w, int h, bool fullscreen, bool vsync, int bpp, int display);
|
||||
bool initGraphicsLibrary(int w, int h, bool fullscreen, bool vsync, int bpp, int display, int hz);
|
||||
void createWindow(int w, int h, bool resizable, bool fullscreen);
|
||||
void shutdownInputLibrary();
|
||||
void shutdownJoystickLibrary();
|
||||
|
@ -513,7 +514,7 @@ protected:
|
|||
|
||||
int nowTicks, thenTicks;
|
||||
|
||||
int _vsync, _bpp;
|
||||
int _vsync, _bpp, _refreshRate;
|
||||
bool _fullscreen, _useDesktopResolution;
|
||||
int winPosX, winPosY; // pre-fullscreen
|
||||
|
||||
|
|
Loading…
Reference in a new issue