From 19e7ebe1d8508cfe5f931542c0d4e5c0178672f7 Mon Sep 17 00:00:00 2001 From: Rivo Laks Date: Fri, 16 Mar 2007 13:00:01 +0000 Subject: [PATCH] Add shader support. Effects can use setShader() method to set a custom shader for window rendering. svn path=/branches/work/kwin_composite/; revision=643131 --- scene_opengl.cpp | 38 ++++++++++++++++++++++++++++++++++++-- scene_opengl.h | 6 ++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/scene_opengl.cpp b/scene_opengl.cpp index 6465a42f0c..2016a53ce5 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -811,6 +811,9 @@ void SceneOpenGL::Window::prepareVertices() // Reset requests for the next painting requestedXResolution = 0; requestedYResolution = 0; + + // Reset shader. If effect wants to use shader, it has to set it in paint pass + shader = 0; } void SceneOpenGL::Window::prepareForPainting() @@ -1177,7 +1180,10 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat if(( mask & PAINT_WINDOW_TRANSFORMED ) && ( data.xScale != 1 || data.yScale != 1 )) glScalef( data.xScale, data.yScale, 1 ); - prepareRenderStates( mask, data ); + if(shader) + prepareShaderRenderStates( mask, data ); + else + prepareRenderStates( mask, data ); enableTexture(); // update texture matrix to handle GL_TEXTURE_2D and GL_TEXTURE_RECTANGLE @@ -1202,12 +1208,32 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat glMatrixMode( GL_MODELVIEW ); glPopMatrix(); - restoreRenderStates( mask, data ); + if(shader) + restoreShaderRenderStates( mask, data ); + else + restoreRenderStates( mask, data ); disableTexture(); } +void SceneOpenGL::Window::prepareShaderRenderStates( int mask, WindowPaintData data ) + { + Q_UNUSED( mask ); + // setup blending of transparent windows + glPushAttrib( GL_ENABLE_BIT ); + bool opaque = isOpaque() && data.opacity == 1.0; + if( !opaque ) + { + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + } + shader->setUniform("opacity", (float)data.opacity); + shader->setUniform("saturation", (float)data.saturation); + shader->setUniform("brightness", (float)data.brightness); + } + void SceneOpenGL::Window::prepareRenderStates( int mask, WindowPaintData data ) { + Q_UNUSED( mask ); // setup blending of transparent windows glPushAttrib( GL_ENABLE_BIT ); bool opaque = isOpaque() && data.opacity == 1.0; @@ -1364,8 +1390,16 @@ void SceneOpenGL::Window::renderGeometry( int mask, QRegion region ) glDisableClientState( GL_TEXTURE_COORD_ARRAY ); } +void SceneOpenGL::Window::restoreShaderRenderStates( int mask, WindowPaintData data ) + { + Q_UNUSED( mask ); + Q_UNUSED( data ); + glPopAttrib(); // ENABLE_BIT + } + void SceneOpenGL::Window::restoreRenderStates( int mask, WindowPaintData data ) { + Q_UNUSED( mask ); if( data.opacity != 1.0 || data.saturation != 1.0 || data.brightness != 1.0f ) { if( data.saturation != 1.0 && supports_saturation ) diff --git a/scene_opengl.h b/scene_opengl.h index 514dcf0482..fe673bdef7 100644 --- a/scene_opengl.h +++ b/scene_opengl.h @@ -130,6 +130,9 @@ class SceneOpenGL::Window // Marks vertices of the window as dirty. Call this if you change // position of the vertices void markVerticesDirty() { verticesDirty = true; } + + void setShader( GLShader* s ) { shader = s; } + protected: // Makes sure that vertex grid requests are fulfilled and that vertices // aren't dirty. Call this before paint pass @@ -138,8 +141,10 @@ class SceneOpenGL::Window void resetVertices(); // Resets positions of vertices void prepareRenderStates( int mask, WindowPaintData data ); + void prepareShaderRenderStates( int mask, WindowPaintData data ); void renderGeometry( int mask, QRegion region ); void restoreRenderStates( int mask, WindowPaintData data ); + void restoreShaderRenderStates( int mask, WindowPaintData data ); private: QRegion optimizeBindDamage( const QRegion& reg, int limit ); @@ -161,6 +166,7 @@ class SceneOpenGL::Window int requestedXResolution; int requestedYResolution; bool verticesDirty; // vertices have been modified in some way + GLShader* shader; // shader to be used for rendering, if any }; } // namespace