From 928eb3dee17f43d54262d1f3dfc5212f183e6ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 28 Jul 2009 14:46:21 +0200 Subject: Improve GL filter performance by caching custom shader programs. This brings performance back up to where it was pre-merge. --- .../gl2paintengineex/qglengineshadermanager.cpp | 26 +++++++++++++--------- .../gl2paintengineex/qglengineshadermanager_p.h | 3 +++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp index dab1257..0692277 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp +++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp @@ -320,6 +320,19 @@ void QGLEngineShaderManager::setCustomStage(QGLCustomShaderStage* stage) shaderProgNeedsChanging = true; } +void QGLEngineShaderManager::shaderDestroyed(QObject *shader) +{ + // Remove any shader programs which has this as the srcPixel shader: + for (int i = 0; i < cachedPrograms.size(); ++i) { + if (cachedPrograms.at(i).srcPixelFragShader == shader) { + delete cachedPrograms.at(i).program; + cachedPrograms.removeAt(i--); + } + } + + shaderProgNeedsChanging = true; +} + void QGLEngineShaderManager::removeCustomStage(QGLCustomShaderStage* stage) { Q_UNUSED(stage); // Currently we only support one at a time... @@ -329,16 +342,6 @@ void QGLEngineShaderManager::removeCustomStage(QGLCustomShaderStage* stage) if (!compiledShader) return; - // Remove any shader programs which has this as the srcPixel shader: - for (int i = 0; i < cachedPrograms.size(); ++i) { - QGLEngineShaderProg &prog = cachedPrograms[i]; - if (prog.srcPixelFragShader == compiledShader) { - delete prog.program; - cachedPrograms.removeOne(prog); - break; - } - } - compiledShaders[CustomImageSrcFragmentShader] = 0; customSrcStage = 0; shaderProgNeedsChanging = true; @@ -618,6 +621,9 @@ void QGLEngineShaderManager::compileNamedShader(QGLEngineShaderManager::ShaderNa newShader = new QGLShader(type, ctx, this); newShader->compile(source); customShaderCache.insert(source, newShader); + + connect(newShader, SIGNAL(destroyed(QObject *)), + this, SLOT(shaderDestroyed(QObject *))); } } else { source = qglEngineShaderSourceCode[name]; diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h index 69574ba..8122a08 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h @@ -408,6 +408,9 @@ public: Q_ENUMS(ShaderName) #endif +private slots: + void shaderDestroyed(QObject *shader); + private: QGLContext* ctx; bool shaderProgNeedsChanging; -- cgit v0.12