From d2cfeef8ae3fa1440e7aa5e4a0e8c2f0193a205b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Sat, 11 Dec 2010 10:57:29 +0100 Subject: [PATCH] Scene uses ShaderManager --- scene_opengl.cpp | 97 ++++++-------------------------------------- scene_opengl.h | 8 ---- scene_opengl_egl.cpp | 24 ++++++----- scene_opengl_glx.cpp | 8 ++-- 4 files changed, 28 insertions(+), 109 deletions(-) diff --git a/scene_opengl.cpp b/scene_opengl.cpp index 7ed965a042..1e0aa10c17 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -116,75 +116,6 @@ XShmSegmentInfo SceneOpenGL::shm; #include "scene_opengl_glx.cpp" #endif - -bool SceneOpenGL::setupSceneShaders() -{ - m_sceneShader = new GLShader(":/resources/scene-vertex.glsl", ":/resources/scene-fragment.glsl"); - if (m_sceneShader->isValid()) { - m_sceneShader->bind(); - m_sceneShader->setUniform("sample", 0); - m_sceneShader->setUniform("displaySize", QVector2D(displayWidth(), displayHeight())); - m_sceneShader->setUniform("debug", debug ? 1 : 0); - m_sceneShader->unbind(); - kDebug(1212) << "Scene Shader is valid"; - } - else { - delete m_sceneShader; - m_sceneShader = NULL; - kDebug(1212) << "Scene Shader is not valid"; - return false; - } - m_genericSceneShader = new GLShader( ":/resources/scene-generic-vertex.glsl", ":/resources/scene-fragment.glsl" ); - if (m_genericSceneShader->isValid()) { - m_genericSceneShader->bind(); - m_genericSceneShader->setUniform("sample", 0); - m_genericSceneShader->setUniform("debug", debug ? 1 : 0); - QMatrix4x4 projection; - float fovy = 60.0f; - float aspect = 1.0f; - float zNear = 0.1f; - float zFar = 100.0f; - float ymax = zNear * tan(fovy * M_PI / 360.0f); - float ymin = -ymax; - float xmin = ymin * aspect; - float xmax = ymax * aspect; - projection.frustum(xmin, xmax, ymin, ymax, zNear, zFar); - m_genericSceneShader->setUniform("projection", projection); - QMatrix4x4 modelview; - float scaleFactor = 1.1 * tan( fovy * M_PI / 360.0f )/ymax; - modelview.translate(xmin*scaleFactor, ymax*scaleFactor, -1.1); - modelview.scale((xmax-xmin)*scaleFactor/displayWidth(), -(ymax-ymin)*scaleFactor/displayHeight(), 0.001); - m_genericSceneShader->setUniform("modelview", modelview); - m_genericSceneShader->unbind(); - kDebug(1212) << "Generic Scene Shader is valid"; - } - else { - delete m_genericSceneShader; - m_genericSceneShader = NULL; - delete m_sceneShader; - m_sceneShader = NULL; - kDebug(1212) << "Generic Scene Shader is not valid"; - return false; - } - m_colorShader = new GLShader(":/resources/scene-color-vertex.glsl", ":/resources/scene-color-fragment.glsl"); - if (m_colorShader->isValid()) { - m_colorShader->bind(); - m_colorShader->setUniform("displaySize", QVector2D(displayWidth(), displayHeight())); - m_colorShader->unbind(); - kDebug(1212) << "Color Shader is valid"; - } else { - delete m_genericSceneShader; - m_genericSceneShader = NULL; - delete m_sceneShader; - m_sceneShader = NULL; - delete m_colorShader; - m_colorShader = NULL; - kDebug(1212) << "Color Scene Shader is not valid"; - return false; - } - return true; -} - bool SceneOpenGL::initFailed() const { return !init_ok; @@ -338,11 +269,6 @@ void SceneOpenGL::windowOpacityChanged( Toplevel* ) #endif } -GLShader* SceneOpenGL::sceneShader() const - { - return m_sceneShader; - } - //**************************************** // SceneOpenGL::Texture //**************************************** @@ -528,14 +454,12 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat int y = toplevel->y(); double z = 0.0; bool sceneShader = false; - if (!data.shader && static_cast(scene)->hasSceneShader()) { + if (!data.shader && ShaderManager::instance()->isValid()) { // set the shader for uniform initialising in paint decoration if ((mask & PAINT_WINDOW_TRANSFORMED) || (mask & PAINT_SCREEN_TRANSFORMED)) { - data.shader = static_cast(scene)->m_genericSceneShader; - data.shader->bind(); + data.shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader); } else { - data.shader = static_cast(scene)->m_sceneShader; - data.shader->bind(); + data.shader = ShaderManager::instance()->pushShader(ShaderManager::SimpleShader); data.shader->setUniform("geometry", QVector4D(x, y, toplevel->width(), toplevel->height())); } sceneShader = true; @@ -705,7 +629,7 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat if( sceneShader ) { - data.shader->unbind(); + ShaderManager::instance()->popShader(); data.shader = NULL; } #ifndef KWIN_HAVE_OPENGLES @@ -1212,14 +1136,16 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr GLShader* shader = m_effectFrame->shader(); bool sceneShader = false; - if( !shader && static_cast(scene)->hasSceneShader() ) + if( !shader && ShaderManager::instance()->isValid() ) { - shader = static_cast(scene)->m_sceneShader; + shader = ShaderManager::instance()->pushShader(ShaderManager::SimpleShader); sceneShader = true; } if( shader ) { - shader->bind(); + if (shader != ShaderManager::instance()->getBoundShader()) { + ShaderManager::instance()->pushShader(shader); + } if( sceneShader ) shader->setUniform("geometry", QVector4D(0, 0, 0, 0)); shader->setUniform("saturation", 1.0f); @@ -1495,8 +1421,9 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr m_textTexture->unbind(); } - if( shader ) - shader->unbind(); + if (shader) { + ShaderManager::instance()->popShader(); + } glDisable( GL_BLEND ); #ifndef KWIN_HAVE_OPENGLES glPopMatrix(); diff --git a/scene_opengl.h b/scene_opengl.h index 3481dfe1db..ed14ae78bb 100644 --- a/scene_opengl.h +++ b/scene_opengl.h @@ -51,10 +51,6 @@ class SceneOpenGL virtual void windowAdded( Toplevel* ); virtual void windowClosed( Toplevel*, Deleted* ); virtual void windowDeleted( Deleted* ); - GLShader* sceneShader() const; - bool hasSceneShader() const { - return m_sceneShader != NULL && m_genericSceneShader != NULL && m_colorShader != NULL; - } protected: virtual void paintGenericScreen( int mask, ScreenPaintData data ); virtual void paintBackground( QRegion region ); @@ -72,7 +68,6 @@ class SceneOpenGL bool selfCheck(); void selfCheckSetup(); bool selfCheckFinish(); - bool setupSceneShaders(); GC gcroot; class FBConfigInfo { @@ -107,9 +102,6 @@ class SceneOpenGL #endif bool init_ok; bool selfCheckDone; - GLShader* m_sceneShader; - GLShader* m_genericSceneShader; - GLShader* m_colorShader; bool debug; }; diff --git a/scene_opengl_egl.cpp b/scene_opengl_egl.cpp index a3c26d18dd..fef1937ca1 100644 --- a/scene_opengl_egl.cpp +++ b/scene_opengl_egl.cpp @@ -31,9 +31,6 @@ SceneOpenGL::SceneOpenGL( Workspace* ws ) : Scene( ws ) , init_ok( false ) , selfCheckDone( true ) - , m_sceneShader( NULL ) - , m_genericSceneShader( NULL ) - , m_colorShader( NULL ) { if( !initRenderingContext() ) return; @@ -49,11 +46,11 @@ SceneOpenGL::SceneOpenGL( Workspace* ws ) return; } debug = qstrcmp( qgetenv( "KWIN_GL_DEBUG" ), "1" ) == 0; - if (!setupSceneShaders()) { + if (!ShaderManager::instance()->isValid()) { kError( 1212 ) << "Shaders not valid, ES compositing not possible"; return; } - + ShaderManager::instance()->pushShader(ShaderManager::SimpleShader); if( checkGLError( "Init" )) { @@ -73,7 +70,6 @@ SceneOpenGL::~SceneOpenGL() eglDestroySurface( dpy, surface ); eglTerminate( dpy ); eglReleaseThread(); - delete m_sceneShader; SceneOpenGL::EffectFrame::cleanup(); checkGLError( "Cleanup" ); } @@ -245,13 +241,18 @@ void SceneOpenGL::paintGenericScreen(int mask, ScreenPaintData data) screenTransformation.translate(-data.rotation->xRotationPoint, -data.rotation->yRotationPoint, -data.rotation->zRotationPoint); } screenTransformation.scale(data.xScale, data.yScale, data.zScale); - m_genericSceneShader->bind(); - m_genericSceneShader->setUniform("screenTransformation", screenTransformation); + GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader); + shader->setUniform("screenTransformation", screenTransformation); } else if ((mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS)) { - m_genericSceneShader->bind(); - m_genericSceneShader->setUniform("screenTransformation", QMatrix4x4()); + GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader); + shader->setUniform("screenTransformation", QMatrix4x4()); } Scene::paintGenericScreen(mask, data); + if ((mask & PAINT_SCREEN_TRANSFORMED) || + (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) || + (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS)) { + ShaderManager::instance()->popShader(); + } } void SceneOpenGL::paintBackground(QRegion region) @@ -278,8 +279,9 @@ void SceneOpenGL::paintBackground(QRegion region) vbo.setUseColor(true); vbo.setUseShader(true); vbo.setData(verts.count() / 2, 2, verts.data(), NULL); - m_colorShader->bind(); + ShaderManager::instance()->pushShader(ShaderManager::ColorShader); vbo.render(GL_TRIANGLES); + ShaderManager::instance()->popShader(); } //**************************************** diff --git a/scene_opengl_glx.cpp b/scene_opengl_glx.cpp index 5deb58108e..333911844b 100644 --- a/scene_opengl_glx.cpp +++ b/scene_opengl_glx.cpp @@ -39,9 +39,6 @@ SceneOpenGL::SceneOpenGL( Workspace* ws ) : Scene( ws ) , init_ok( false ) , selfCheckDone( false ) - , m_sceneShader( NULL ) - , m_genericSceneShader( NULL ) - , m_colorShader( NULL ) { if( !Extensions::glxAvailable()) { @@ -101,7 +98,9 @@ SceneOpenGL::SceneOpenGL( Workspace* ws ) GLPlatform::instance()->detect(); if( GLPlatform::instance()->supports( GLSL ) ) { - setupSceneShaders(); + if (!ShaderManager::instance()->isValid()) { + kDebug(1212) << "No Scene Shaders available"; + } } // OpenGL scene setup @@ -179,7 +178,6 @@ SceneOpenGL::~SceneOpenGL() glXDestroyPixmap( display(), last_pixmap ); glXDestroyContext( display(), ctxdrawable ); } - delete m_sceneShader; SceneOpenGL::EffectFrame::cleanup(); checkGLError( "Cleanup" ); }