Add shader support.
Effects can use setShader() method to set a custom shader for window rendering. svn path=/branches/work/kwin_composite/; revision=643131
This commit is contained in:
parent
d4fbab83d1
commit
19e7ebe1d8
2 changed files with 42 additions and 2 deletions
|
@ -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,6 +1180,9 @@ 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 );
|
||||
|
||||
if(shader)
|
||||
prepareShaderRenderStates( mask, data );
|
||||
else
|
||||
prepareRenderStates( mask, data );
|
||||
enableTexture();
|
||||
|
||||
|
@ -1202,12 +1208,32 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat
|
|||
glMatrixMode( GL_MODELVIEW );
|
||||
glPopMatrix();
|
||||
|
||||
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 )
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue