svn path=/branches/work/kwin_composite/; revision=605278
icc-effect-5.14.5
Luboš Luňák 2006-11-16 07:57:55 +00:00
parent 9bfae71d45
commit f33683df3f
2 changed files with 18 additions and 4 deletions

View File

@ -71,8 +71,10 @@ namespace KWinInternal
GLXFBConfig SceneOpenGL::fbcdrawable; GLXFBConfig SceneOpenGL::fbcdrawable;
// GLX content // GLX content
GLXContext SceneOpenGL::ctxbuffer; GLXContext SceneOpenGL::ctxbuffer;
GLXContext SceneOpenGL::ctxdrawable;
// the destination drawable where the compositing is done // the destination drawable where the compositing is done
GLXDrawable SceneOpenGL::glxbuffer; GLXDrawable SceneOpenGL::glxbuffer;
GLXDrawable SceneOpenGL::last_pixmap;
bool SceneOpenGL::tfp_mode; // using glXBindTexImageEXT (texture_from_pixmap) bool SceneOpenGL::tfp_mode; // using glXBindTexImageEXT (texture_from_pixmap)
bool SceneOpenGL::strict_binding; // intended for AIGLX bool SceneOpenGL::strict_binding; // intended for AIGLX
bool SceneOpenGL::db; // destination drawable is double-buffered bool SceneOpenGL::db; // destination drawable is double-buffered
@ -177,6 +179,8 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
kDebug() << "Buffer visual: 0x" << QString::number( vis_buffer, 16 ) << ", drawable visual: 0x" kDebug() << "Buffer visual: 0x" << QString::number( vis_buffer, 16 ) << ", drawable visual: 0x"
<< QString::number( vis_drawable, 16 ) << endl; << QString::number( vis_drawable, 16 ) << endl;
ctxbuffer = glXCreateNewContext( display(), fbcbuffer, GLX_RGBA_TYPE, NULL, GL_FALSE ); ctxbuffer = glXCreateNewContext( display(), fbcbuffer, GLX_RGBA_TYPE, NULL, GL_FALSE );
if( !tfp_mode )
ctxdrawable = glXCreateNewContext( display(), fbcdrawable, GLX_RGBA_TYPE, ctxbuffer, GL_FALSE );
if( !glXMakeContextCurrent( display(), glxbuffer, glxbuffer, ctxbuffer ) ) if( !glXMakeContextCurrent( display(), glxbuffer, glxbuffer, ctxbuffer ) )
assert( false ); assert( false );
@ -221,6 +225,12 @@ SceneOpenGL::~SceneOpenGL()
XFreeGC( display(), gcroot ); XFreeGC( display(), gcroot );
XFreePixmap( display(), buffer ); XFreePixmap( display(), buffer );
} }
if( !tfp_mode )
{
if( last_pixmap != None )
glXDestroyPixmap( display(), last_pixmap );
glXDestroyContext( display(), ctxdrawable );
}
glXDestroyContext( display(), ctxbuffer ); glXDestroyContext( display(), ctxbuffer );
checkGLError( "Cleanup" ); checkGLError( "Cleanup" );
} }
@ -520,9 +530,13 @@ void SceneOpenGL::Window::bindTexture()
} }
else else
{ // non-tfp case, copy pixmap contents to a texture { // non-tfp case, copy pixmap contents to a texture
GLXContext ctxdrawable = glXCreateNewContext( display(), fbcdrawable, GLX_RGBA_TYPE, ctxbuffer, GL_FALSE );
GLXDrawable pixmap = glXCreatePixmap( display(), fbcdrawable, pix, NULL ); GLXDrawable pixmap = glXCreatePixmap( display(), fbcdrawable, pix, NULL );
glXMakeContextCurrent( display(), pixmap, pixmap, ctxdrawable ); glXMakeContextCurrent( display(), pixmap, pixmap, ctxdrawable );
if( last_pixmap != None )
glXDestroyPixmap( display(), last_pixmap );
// workaround for ATI - it leaks/crashes when the pixmap is destroyed immediately
// here (http://lists.kde.org/?l=kwin&m=116353772208535&w=2)
last_pixmap = pixmap;
glReadBuffer( GL_FRONT ); glReadBuffer( GL_FRONT );
glDrawBuffer( GL_FRONT ); glDrawBuffer( GL_FRONT );
if( texture == None ) if( texture == None )
@ -551,12 +565,10 @@ void SceneOpenGL::Window::bindTexture()
} }
} }
} }
glXWaitGL();
// the pixmap is no longer needed, the texture will be updated // the pixmap is no longer needed, the texture will be updated
// only when the window changes anyway, so no need to cache // only when the window changes anyway, so no need to cache
// the pixmap // the pixmap
glXWaitGL();
glXDestroyPixmap( display(), pixmap );
glXDestroyContext( display(), ctxdrawable );
XFreePixmap( display(), pix ); XFreePixmap( display(), pix );
if( db ) if( db )
glDrawBuffer( GL_BACK ); glDrawBuffer( GL_BACK );

View File

@ -46,6 +46,8 @@ class SceneOpenGL
static GLXFBConfig fbcdrawable; static GLXFBConfig fbcdrawable;
static GLXDrawable glxbuffer; static GLXDrawable glxbuffer;
static GLXContext ctxbuffer; static GLXContext ctxbuffer;
static GLXContext ctxdrawable;
static GLXDrawable last_pixmap; // for a workaround in bindTexture()
static bool tfp_mode; static bool tfp_mode;
static bool strict_binding; static bool strict_binding;
static bool copy_buffer_hack; static bool copy_buffer_hack;