From c24efb9241080a043193b67c6a9718312fed8d07 Mon Sep 17 00:00:00 2001 From: Sven Panne Date: Mon, 3 Jan 2005 16:49:37 +0000 Subject: [PATCH] (234) Fixed part of bug #926883 (Video mode matching code, memory leaks, fullscreen): Now we first try to get an exact mode match, ignoring the refresh rate if none could be found. This way the X11 part and the WinDoze behave similarly. NOTE: We still don't behave like GLUT, because it has a wider notion of "best" match. We have to refactor and extend freeglut quite a bit to do that. git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@558 7f0cb862-5218-0410-a997-914c9d46530a --- ChangeLog | 7 +++++++ src/freeglut_gamemode.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index c385ac4..e947cad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -895,3 +895,10 @@ default. (233) Fixed part of bug #926883 (Video mode matching code, memory leaks, fullscreen), i.e. memory leak caused by not freeing the mode lines returned by XF86VidModeGetAllModeLines + +(234) Fixed part of bug #926883 (Video mode matching code, memory leaks, +fullscreen): Now we first try to get an exact mode match, ignoring the +refresh rate if none could be found. This way the X11 part and the WinDoze +behave similarly. NOTE: We still don't behave like GLUT, because it has a +wider notion of "best" match. We have to refactor and extend freeglut quite +a bit to do that. diff --git a/src/freeglut_gamemode.c b/src/freeglut_gamemode.c index 404b6c1..7d5a1ef 100644 --- a/src/freeglut_gamemode.c +++ b/src/freeglut_gamemode.c @@ -234,7 +234,7 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) if( haveToTest || fgDisplay.DisplayModeValid ) { XF86VidModeModeInfo** displayModes; - int i, displayModesCount; + int i, ignoreRefreshRate, displayModesCount; XF86VidModeGetAllModeLines( fgDisplay.Display, @@ -243,26 +243,33 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) &displayModes ); - /* Check every of the modes looking for one that matches our demands */ - for( i = 0; i < displayModesCount; i++ ) + /* + * Check every of the modes looking for one that matches our demands, + * ignoring the refresh rate if no exact match could be found. + */ + for( ignoreRefreshRate = 0; + !success && ( ignoreRefreshRate <= 1 ); + ignoreRefreshRate++) { - if( fghCheckDisplayMode( displayModes[ i ]->hdisplay, - displayModes[ i ]->vdisplay, - fgState.GameModeDepth, - fgState.GameModeRefresh ) ) + for( i = 0; + !success && ( i < displayModesCount ); + i++ ) { - /* OKi, this is the display mode we have been looking for... */ - if( !haveToTest ) { - XF86VidModeSwitchToMode( - fgDisplay.Display, - fgDisplay.Screen, - displayModes[ i ] - ); - } - success = GL_TRUE; - break; + /* Compute the displays refresh rate, dotclock comes in kHz. */ + int refresh = ( displayModes[ i ]->dotclock * 1000 ) / + ( displayModes[ i ]->htotal * displayModes[ i ]->vtotal ); + + success = fghCheckDisplayMode( displayModes[ i ]->hdisplay, + displayModes[ i ]->vdisplay, + fgState.GameModeDepth, + ( ignoreRefreshRate ? fgState.GameModeRefresh : refresh ) ); } } + + if( !haveToTest && success ) { + XF86VidModeSwitchToMode( fgDisplay.Display, fgDisplay.Screen, displayModes[ i ] ); + } + XFree( displayModes ); } -- 1.7.10.4