Make some aspects affecting performance configurable in kwinrc,

group [Translucency]:
GLMode=TFP|SHM|Fallback - select rendering mode
GLAlwaysRebind=<bool> - force rebinding a texture
GLDirect=<bool> - direct rendering
CCMAIL: kwin@kde.org


svn path=/branches/work/kwin_composite/; revision=606268
This commit is contained in:
Luboš Luňák 2006-11-19 20:13:49 +00:00
parent 6e54bae328
commit b956650b2d
4 changed files with 56 additions and 24 deletions

View file

@ -174,9 +174,8 @@ unsigned long Options::updateSettings()
CmdAllWheel = mouseWheelCommand(config->readEntry("CommandAllWheel","Nothing")); CmdAllWheel = mouseWheelCommand(config->readEntry("CommandAllWheel","Nothing"));
//translucency settings - TODO //translucency settings - TODO
config->setGroup( "Notification Messages" );
useTranslucency = config->readEntry("UseTranslucency", QVariant(false)).toBool();
config->setGroup( "Translucency"); config->setGroup( "Translucency");
useTranslucency = config->readEntry("UseTranslucency", QVariant(true)).toBool();
translucentActiveWindows = config->readEntry("TranslucentActiveWindows", QVariant(false)).toBool(); translucentActiveWindows = config->readEntry("TranslucentActiveWindows", QVariant(false)).toBool();
activeWindowOpacity = uint((config->readEntry("ActiveWindowOpacity", 100)/100.0)*0xFFFFFFFF); activeWindowOpacity = uint((config->readEntry("ActiveWindowOpacity", 100)/100.0)*0xFFFFFFFF);
translucentInactiveWindows = config->readEntry("TranslucentInactiveWindows", QVariant(false)).toBool(); translucentInactiveWindows = config->readEntry("TranslucentInactiveWindows", QVariant(false)).toBool();
@ -195,6 +194,16 @@ unsigned long Options::updateSettings()
removeShadowsOnResize = config->readEntry("RemoveShadowsOnResize", QVariant(true)).toBool(); removeShadowsOnResize = config->readEntry("RemoveShadowsOnResize", QVariant(true)).toBool();
onlyDecoTranslucent = config->readEntry("OnlyDecoTranslucent", QVariant(false)).toBool(); onlyDecoTranslucent = config->readEntry("OnlyDecoTranslucent", QVariant(false)).toBool();
QString glmode = config->readEntry("GLMode", "TFP" ).upper();
if( glmode == "TFP" )
glMode = GLTFP;
else if( glmode == "SHM" )
glMode = GLSHM;
else
glMode = GLFallback;
glAlwaysRebind = config->readEntry("GLAlwaysRebind", false );
glDirect = config->readEntry("GLDirect", true );
// Read button tooltip animation effect from kdeglobals // Read button tooltip animation effect from kdeglobals
// Since we want to allow users to enable window decoration tooltips // Since we want to allow users to enable window decoration tooltips
// and not kstyle tooltips and vise-versa, we don't read the // and not kstyle tooltips and vise-versa, we don't read the

View file

@ -299,6 +299,11 @@ class Options : public KDecorationOptions
uint inactiveWindowShadowSize; uint inactiveWindowShadowSize;
uint dockShadowSize; uint dockShadowSize;
bool onlyDecoTranslucent; bool onlyDecoTranslucent;
enum GLMode { GLTFP, GLSHM, GLFallback };
GLMode glMode;
bool glAlwaysRebind;
bool glDirect;
private: private:
WindowOperation OpTitlebarDblClick; WindowOperation OpTitlebarDblClick;

View file

@ -162,26 +162,7 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
if( !hasGLXVersion( 1, 3 ) && !hasGLExtension( "GLX_SGIX_fbconfig" )) if( !hasGLXVersion( 1, 3 ) && !hasGLExtension( "GLX_SGIX_fbconfig" ))
return; return;
strict_binding = false; // not needed now strict_binding = false; // not needed now
// select mode - try TFP first, then SHM, otherwise fallback mode selectMode();
shm_mode = false;
tfp_mode = ( glXBindTexImageEXT != NULL && glXReleaseTexImageEXT != NULL );
if( tfp_mode )
{
if( !findConfig( drawable_tfp_attrs, &fbcdrawable ))
{
tfp_mode = false;
if( !findConfig( drawable_attrs, &fbcdrawable ))
assert( false );
}
}
else
if( !findConfig( drawable_attrs, &fbcdrawable ))
assert( false );
if( !tfp_mode && initShm())
shm_mode = true;
// use copy buffer hack from glcompmgr (called COPY_BUFFER there) - nvidia drivers older than
// 1.0-9xxx don't update pixmaps properly, so do a copy first
copy_buffer_hack = !tfp_mode && !shm_mode; // TODO detect that it's nvidia < 1.0-9xxx driver
initBuffer(); // create destination buffer initBuffer(); // create destination buffer
int vis_buffer, vis_drawable; int vis_buffer, vis_drawable;
glXGetFBConfigAttrib( display(), fbcbuffer, GLX_VISUAL_ID, &vis_buffer ); glXGetFBConfigAttrib( display(), fbcbuffer, GLX_VISUAL_ID, &vis_buffer );
@ -243,6 +224,41 @@ SceneOpenGL::~SceneOpenGL()
checkGLError( "Cleanup" ); checkGLError( "Cleanup" );
} }
void SceneOpenGL::selectMode()
{
// select mode - try TFP first, then SHM, otherwise fallback mode
shm_mode = false;
tfp_mode = false;
if( options->glMode == Options::GLTFP )
{
if( initTfp())
tfp_mode = true;
else if( initShm())
shm_mode = true;
}
else if( options->glMode == Options::GLSHM )
{
if( initShm())
shm_mode = true;
else if( initTfp())
tfp_mode = true;
}
if( !tfp_mode && !findConfig( drawable_attrs, &fbcdrawable ))
assert( false );
// use copy buffer hack from glcompmgr (called COPY_BUFFER there) - nvidia drivers older than
// 1.0-9xxx don't update pixmaps properly, so do a copy first
copy_buffer_hack = !tfp_mode && !shm_mode; // TODO detect that it's nvidia < 1.0-9xxx driver
}
bool SceneOpenGL::initTfp()
{
if( glXBindTexImageEXT == NULL || glXReleaseTexImageEXT == NULL )
return false;
if( !findConfig( drawable_tfp_attrs, &fbcdrawable ))
return false;
return true;
}
bool SceneOpenGL::initShm() bool SceneOpenGL::initShm()
{ {
int major, minor; int major, minor;
@ -291,7 +307,7 @@ void SceneOpenGL::cleanupShm()
void SceneOpenGL::initRenderingContext() void SceneOpenGL::initRenderingContext()
{ {
bool direct_rendering = true; bool direct_rendering = options->glDirect;
KXErrorHandler errs; KXErrorHandler errs;
ctxbuffer = glXCreateNewContext( display(), fbcbuffer, GLX_RGBA_TYPE, NULL, ctxbuffer = glXCreateNewContext( display(), fbcbuffer, GLX_RGBA_TYPE, NULL,
direct_rendering ? GL_TRUE : GL_FALSE ); direct_rendering ? GL_TRUE : GL_FALSE );
@ -535,7 +551,7 @@ void SceneOpenGL::Window::free()
void SceneOpenGL::Window::bindTexture() void SceneOpenGL::Window::bindTexture()
{ {
if( texture != 0 && toplevel->damage().isEmpty() if( texture != 0 && toplevel->damage().isEmpty()
&& !tfp_mode ) // TODO interestingly this makes tfp slower with some gfx cards && !options->glAlwaysRebind ) // interestingly with some gfx cards always rebinding is faster
{ {
// texture doesn't need updating, just bind it // texture doesn't need updating, just bind it
glBindTexture( GL_TEXTURE_RECTANGLE_ARB, texture ); glBindTexture( GL_TEXTURE_RECTANGLE_ARB, texture );

View file

@ -38,6 +38,8 @@ class SceneOpenGL
virtual void paintSimpleScreen( int mask, QRegion region ); virtual void paintSimpleScreen( int mask, QRegion region );
virtual void paintBackground( QRegion region ); virtual void paintBackground( QRegion region );
private: private:
void selectMode();
bool initTfp();
bool initShm(); bool initShm();
void cleanupShm(); void cleanupShm();
void initBuffer(); void initBuffer();