Move the shader used for painting to WindowPaintData, as it's
more related to one painting than to a window. svn path=/trunk/KDE/kdebase/workspace/; revision=698576
This commit is contained in:
parent
d3f83ad297
commit
5a50381e1f
10 changed files with 24 additions and 42 deletions
|
@ -1073,15 +1073,6 @@ EffectWindowList EffectWindowImpl::mainWindows() const
|
||||||
return EffectWindowList();
|
return EffectWindowList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EffectWindowImpl::setShader(GLShader* shader)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_OPENGL
|
|
||||||
if( SceneOpenGL::Window* w = dynamic_cast< SceneOpenGL::Window* >( sceneWindow()))
|
|
||||||
return w->setShader(shader);
|
|
||||||
#endif
|
|
||||||
abort(); // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
WindowQuadList EffectWindowImpl::buildQuads() const
|
WindowQuadList EffectWindowImpl::buildQuads() const
|
||||||
{
|
{
|
||||||
return sceneWindow()->buildQuads();
|
return sceneWindow()->buildQuads();
|
||||||
|
|
|
@ -190,7 +190,6 @@ class EffectWindowImpl : public EffectWindow
|
||||||
virtual EffectWindow* findModal();
|
virtual EffectWindow* findModal();
|
||||||
virtual EffectWindowList mainWindows() const;
|
virtual EffectWindowList mainWindows() const;
|
||||||
|
|
||||||
virtual void setShader(GLShader* shader);
|
|
||||||
virtual WindowQuadList buildQuads() const;
|
virtual WindowQuadList buildQuads() const;
|
||||||
|
|
||||||
const Toplevel* window() const;
|
const Toplevel* window() const;
|
||||||
|
|
|
@ -175,7 +175,7 @@ void BlurEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP
|
||||||
|
|
||||||
// Set custom shader to render the window with
|
// Set custom shader to render the window with
|
||||||
mWindowShader->bind();
|
mWindowShader->bind();
|
||||||
w->setShader(mWindowShader);
|
data.shader = mWindowShader;
|
||||||
// Put the blur texture to tex unit 4
|
// Put the blur texture to tex unit 4
|
||||||
glActiveTexture(GL_TEXTURE4);
|
glActiveTexture(GL_TEXTURE4);
|
||||||
mBlurTexture->bind();
|
mBlurTexture->bind();
|
||||||
|
|
|
@ -159,7 +159,7 @@ void ExplosionEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Wi
|
||||||
glActiveTexture(GL_TEXTURE5);
|
glActiveTexture(GL_TEXTURE5);
|
||||||
mEndOffsetTex->bind();
|
mEndOffsetTex->bind();
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
w->setShader(mShader);
|
data.shader = mShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the next effect.
|
// Call the next effect.
|
||||||
|
|
|
@ -45,6 +45,7 @@ WindowPaintData::WindowPaintData( EffectWindow* w )
|
||||||
, yTranslate( 0 )
|
, yTranslate( 0 )
|
||||||
, saturation( 1 )
|
, saturation( 1 )
|
||||||
, brightness( 1 )
|
, brightness( 1 )
|
||||||
|
, shader( NULL )
|
||||||
{
|
{
|
||||||
quads = w->buildQuads();
|
quads = w->buildQuads();
|
||||||
}
|
}
|
||||||
|
|
|
@ -345,8 +345,6 @@ class KWIN_EXPORT EffectWindow
|
||||||
virtual EffectWindow* findModal() = 0;
|
virtual EffectWindow* findModal() = 0;
|
||||||
virtual EffectWindowList mainWindows() const = 0;
|
virtual EffectWindowList mainWindows() const = 0;
|
||||||
|
|
||||||
virtual void setShader(GLShader* shader) = 0;
|
|
||||||
|
|
||||||
// TODO internal?
|
// TODO internal?
|
||||||
virtual WindowQuadList buildQuads() const = 0;
|
virtual WindowQuadList buildQuads() const = 0;
|
||||||
};
|
};
|
||||||
|
@ -480,6 +478,10 @@ class KWIN_EXPORT WindowPaintData
|
||||||
**/
|
**/
|
||||||
float brightness;
|
float brightness;
|
||||||
WindowQuadList quads;
|
WindowQuadList quads;
|
||||||
|
/**
|
||||||
|
* Shader to be used for rendering, if any.
|
||||||
|
*/
|
||||||
|
GLShader* shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
class KWIN_EXPORT ScreenPaintData
|
class KWIN_EXPORT ScreenPaintData
|
||||||
|
|
|
@ -269,7 +269,6 @@ void Scene::paintWindow( Window* w, int mask, QRegion region, WindowQuadList qua
|
||||||
{
|
{
|
||||||
WindowPaintData data( w->window()->effectWindow());
|
WindowPaintData data( w->window()->effectWindow());
|
||||||
data.quads = quads;
|
data.quads = quads;
|
||||||
w->prepareForPainting();
|
|
||||||
effects->paintWindow( effectWindow( w ), mask, region, data );
|
effects->paintWindow( effectWindow( w ), mask, region, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
scene.h
1
scene.h
|
@ -132,7 +132,6 @@ class Scene::Window
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
// perform the actual painting of the window
|
// perform the actual painting of the window
|
||||||
virtual void performPaint( int mask, QRegion region, WindowPaintData data ) = 0;
|
virtual void performPaint( int mask, QRegion region, WindowPaintData data ) = 0;
|
||||||
virtual void prepareForPainting() {}
|
|
||||||
// do any cleanup needed when the window's composite pixmap is discarded
|
// do any cleanup needed when the window's composite pixmap is discarded
|
||||||
virtual void pixmapDiscarded() {}
|
virtual void pixmapDiscarded() {}
|
||||||
int x() const;
|
int x() const;
|
||||||
|
|
|
@ -1027,13 +1027,6 @@ SceneOpenGL::Window::~Window()
|
||||||
discardTexture();
|
discardTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::Window::prepareForPainting()
|
|
||||||
{
|
|
||||||
shader = NULL; // TODO
|
|
||||||
// We should also bind texture here so that effects could access it in the
|
|
||||||
// paint pass
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind the window pixmap to an OpenGL texture.
|
// Bind the window pixmap to an OpenGL texture.
|
||||||
bool SceneOpenGL::Window::bindTexture()
|
bool SceneOpenGL::Window::bindTexture()
|
||||||
{
|
{
|
||||||
|
@ -1141,19 +1134,19 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat
|
||||||
WindowQuadList decoration = data.quads.select( WindowQuadDecoration );
|
WindowQuadList decoration = data.quads.select( WindowQuadDecoration );
|
||||||
if( data.contents_opacity != data.decoration_opacity && !decoration.isEmpty())
|
if( data.contents_opacity != data.decoration_opacity && !decoration.isEmpty())
|
||||||
{
|
{
|
||||||
prepareStates( data.opacity * data.contents_opacity, data.brightness, data.saturation );
|
prepareStates( data.opacity * data.contents_opacity, data.brightness, data.saturation, data.shader );
|
||||||
renderQuads( mask, region, data.quads.select( WindowQuadContents ));
|
renderQuads( mask, region, data.quads.select( WindowQuadContents ));
|
||||||
restoreStates( data.opacity * data.contents_opacity, data.brightness, data.saturation );
|
restoreStates( data.opacity * data.contents_opacity, data.brightness, data.saturation, data.shader );
|
||||||
prepareStates( data.opacity * data.decoration_opacity, data.brightness, data.saturation );
|
prepareStates( data.opacity * data.decoration_opacity, data.brightness, data.saturation, data.shader );
|
||||||
renderQuads( mask, region, decoration );
|
renderQuads( mask, region, decoration );
|
||||||
restoreStates( data.opacity * data.decoration_opacity, data.brightness, data.saturation );
|
restoreStates( data.opacity * data.decoration_opacity, data.brightness, data.saturation, data.shader );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
prepareStates( data.opacity * data.contents_opacity, data.brightness, data.saturation );
|
prepareStates( data.opacity * data.contents_opacity, data.brightness, data.saturation, data.shader );
|
||||||
renderQuads( mask, region, data.quads.select( WindowQuadContents ));
|
renderQuads( mask, region, data.quads.select( WindowQuadContents ));
|
||||||
renderQuads( mask, region, data.quads.select( WindowQuadDecoration ));
|
renderQuads( mask, region, data.quads.select( WindowQuadDecoration ));
|
||||||
restoreStates( data.opacity * data.contents_opacity, data.brightness, data.saturation );
|
restoreStates( data.opacity * data.contents_opacity, data.brightness, data.saturation, data.shader );
|
||||||
}
|
}
|
||||||
|
|
||||||
texture.disableUnnormalizedTexCoords();
|
texture.disableUnnormalizedTexCoords();
|
||||||
|
@ -1175,15 +1168,15 @@ void SceneOpenGL::Window::renderQuads( int mask, const QRegion& region, const Wi
|
||||||
delete[] texcoords;
|
delete[] texcoords;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::Window::prepareStates( double opacity, double brightness, double saturation )
|
void SceneOpenGL::Window::prepareStates( double opacity, double brightness, double saturation, GLShader* shader )
|
||||||
{
|
{
|
||||||
if(shader)
|
if(shader)
|
||||||
prepareShaderRenderStates( opacity, brightness, saturation );
|
prepareShaderRenderStates( opacity, brightness, saturation, shader );
|
||||||
else
|
else
|
||||||
prepareRenderStates( opacity, brightness, saturation );
|
prepareRenderStates( opacity, brightness, saturation );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::Window::prepareShaderRenderStates( double opacity, double brightness, double saturation )
|
void SceneOpenGL::Window::prepareShaderRenderStates( double opacity, double brightness, double saturation, GLShader* shader )
|
||||||
{
|
{
|
||||||
// setup blending of transparent windows
|
// setup blending of transparent windows
|
||||||
glPushAttrib( GL_ENABLE_BIT );
|
glPushAttrib( GL_ENABLE_BIT );
|
||||||
|
@ -1323,19 +1316,20 @@ void SceneOpenGL::Window::prepareRenderStates( double opacity, double brightness
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::Window::restoreStates( double opacity, double brightness, double saturation )
|
void SceneOpenGL::Window::restoreStates( double opacity, double brightness, double saturation, GLShader* shader )
|
||||||
{
|
{
|
||||||
if(shader)
|
if(shader)
|
||||||
restoreShaderRenderStates( opacity, brightness, saturation );
|
restoreShaderRenderStates( opacity, brightness, saturation, shader );
|
||||||
else
|
else
|
||||||
restoreRenderStates( opacity, brightness, saturation );
|
restoreRenderStates( opacity, brightness, saturation );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::Window::restoreShaderRenderStates( double opacity, double brightness, double saturation )
|
void SceneOpenGL::Window::restoreShaderRenderStates( double opacity, double brightness, double saturation, GLShader* shader )
|
||||||
{
|
{
|
||||||
Q_UNUSED( opacity );
|
Q_UNUSED( opacity );
|
||||||
Q_UNUSED( brightness );
|
Q_UNUSED( brightness );
|
||||||
Q_UNUSED( saturation );
|
Q_UNUSED( saturation );
|
||||||
|
Q_UNUSED( shader );
|
||||||
glPopAttrib(); // ENABLE_BIT
|
glPopAttrib(); // ENABLE_BIT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,24 +118,21 @@ class SceneOpenGL::Window
|
||||||
Window( Toplevel* c );
|
Window( Toplevel* c );
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
virtual void performPaint( int mask, QRegion region, WindowPaintData data );
|
virtual void performPaint( int mask, QRegion region, WindowPaintData data );
|
||||||
virtual void prepareForPainting();
|
|
||||||
virtual void pixmapDiscarded();
|
virtual void pixmapDiscarded();
|
||||||
bool bindTexture();
|
bool bindTexture();
|
||||||
void discardTexture();
|
void discardTexture();
|
||||||
void setShader( GLShader* s ) { shader = s; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void renderQuads( int mask, const QRegion& region, const WindowQuadList& quads );
|
void renderQuads( int mask, const QRegion& region, const WindowQuadList& quads );
|
||||||
void prepareStates( double opacity, double brightness, double saturation );
|
void prepareStates( double opacity, double brightness, double saturation, GLShader* shader );
|
||||||
void prepareRenderStates( double opacity, double brightness, double saturation );
|
void prepareRenderStates( double opacity, double brightness, double saturation );
|
||||||
void prepareShaderRenderStates( double opacity, double brightness, double saturation );
|
void prepareShaderRenderStates( double opacity, double brightness, double saturation, GLShader* shader );
|
||||||
void restoreStates( double opacity, double brightness, double saturation );
|
void restoreStates( double opacity, double brightness, double saturation, GLShader* shader );
|
||||||
void restoreRenderStates( double opacity, double brightness, double saturation );
|
void restoreRenderStates( double opacity, double brightness, double saturation );
|
||||||
void restoreShaderRenderStates( double opacity, double brightness, double saturation );
|
void restoreShaderRenderStates( double opacity, double brightness, double saturation, GLShader* shader );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Texture texture;
|
Texture texture;
|
||||||
GLShader* shader; // shader to be used for rendering, if any
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
Loading…
Reference in a new issue