Change the location where LIBGL_ALWAYS_INDIRECT is set and add some

useful documentation about when it is used and why it is required.

svn path=/trunk/KDE/kdebase/workspace/; revision=1082246
This commit is contained in:
Lucas Murray 2010-01-30 08:27:24 +00:00
parent 12efb634f0
commit 2a34e440f5
3 changed files with 41 additions and 8 deletions

View file

@ -276,6 +276,8 @@ void CompositingPrefs::applyDriverSpecificOptions()
mRecommendCompositing = true;
// Known driver specific options
// NOTE: GLX has already been loaded so we cannot change direct rendering mode here if the
// driver uses the LIBGL_ALWAYS_INDIRECT environment variable.
if( mXgl )
{
mStrictBinding = false;
@ -286,6 +288,7 @@ void CompositingPrefs::applyDriverSpecificOptions()
}
else if( mDriver == "nvidia" )
{
mEnableDirectRendering = true; // Driver doesn't use LIBGL_ALWAYS_INDIRECT
mStrictBinding = false;
}
//else if( mDriver == "fglrx" )

View file

@ -496,10 +496,6 @@ KDE_EXPORT int kdemain( int argc, char * argv[] )
if( KDE_signal( SIGHUP, KWin::sighandler ) == SIG_IGN )
KDE_signal( SIGHUP, SIG_IGN );
// HACK: This is needed for AIGLX
if( qstrcmp( qgetenv( "KWIN_DIRECT_GL" ), "1" ) != 0 )
setenv( "LIBGL_ALWAYS_INDIRECT","1", true );
// HACK: this is needed to work around a Qt4.4.0RC1 bug (#157659)
setenv( "QT_SLOW_TOPLEVEL_RESIZE", "1", true );
@ -508,10 +504,6 @@ KDE_EXPORT int kdemain( int argc, char * argv[] )
KWin::SessionSaveDoneHelper helper;
KGlobal::locale()->insertCatalog( "kwin_effects" );
// Announce when KWIN_DIRECT_GL is set for above HACK
if( qstrcmp( qgetenv( "KWIN_DIRECT_GL" ), "1" ) == 0 )
kDebug( 1212 ) << "KWIN_DIRECT_GL set, not forcing LIBGL_ALWAYS_INDIRECT=1";
fcntl( XConnectionNumber( KWin::display() ), F_SETFD, 1 );
QString appname;

View file

@ -113,6 +113,7 @@ bool SceneOpenGL::shm_mode;
XShmSegmentInfo SceneOpenGL::shm;
#endif
//static int firstWasDirect = -1;
SceneOpenGL::SceneOpenGL( Workspace* ws )
: Scene( ws )
@ -124,6 +125,43 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
kDebug( 1212 ) << "No glx extensions available";
return; // error
}
// LIBGL_ALWAYS_INDIRECT:
// This environment variable causes the Mesa libGL to not load any DRI driver on the client's
// side at all. This has the side-effect of making the library behave differently when creating
// indirect rendering contexts for compositing.
// When a Mesa driver is using DRI1 compositing will only work in indirect rendering mode
// while when using DRI2 it's possible to use compositing with direct rendering. When running
// with direct rendering we have more OpenGL features available to us therefore it's the
// prefered mode to be running in.
// If AIGLX is enabled when we create an indirect rendering context without this variable set
// the context doesn't seem to be usable for compositing for some reason. Needs more research.
// In Mesa this variable is only read during the first call to glXQueryVersion() so it cannot
// be changed after GLX has already been used by KWin.
// Fglrx also uses this variable but I have yet to research how it acts under various
// conditions and what the optimal usage of it by KWin would be.
// -- lmurray (30th Jan, 2010)
// TODO: Set this variable only when explicitly running in indirect rendering mode.
//const int isDirect = options->glDirect ? 1 : 0;
//if( firstWasDirect == -1 )
// firstWasDirect = isDirect;
//else
// if( isDirect != firstWasDirect )
// // Switching indirect => direct won't take effect and direct => indirect will cause
// // compositing to not work at all on AIGLX systems.
// kWarning( 1212 ) << "Switched direct rendering mode while KWin was running. THIS IS UNSAFE!";
//if( !options->glDirect )
// {
// HACK: This is required for compositing to work on AIGLX
if( qstrcmp( qgetenv( "KWIN_DIRECT_GL" ), "1" ) != 0 )
{
kDebug( 1212 ) << "Forcing LIBGL_ALWAYS_INDIRECT=1";
setenv( "LIBGL_ALWAYS_INDIRECT", "1", true );
}
else
kDebug( 1212 ) << "KWIN_DIRECT_GL set, not forcing LIBGL_ALWAYS_INDIRECT=1";
// }
initGLX();
// check for FBConfig support
if( !hasGLExtension( "GLX_SGIX_fbconfig" ) || !glXGetFBConfigAttrib || !glXGetFBConfigs ||