From 01928c91ff0ae76cdb02f50af3c62368e28cafb6 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Tue, 27 Nov 2012 11:05:48 +1000 Subject: Observe GL context loss in ShaderEffectItem Recreate the shader program as required when the GL context changes. Also delete the shader program when the ShaderEffectItem is deactivated, to save graphics memory. Previously, this was done only for Symbian platforms, and in a suboptimal fashion. This patch implements the behaviour for all platforms in a more optimal manner. Task-number: QTBUG-28136 Change-Id: I8281e77f7285ea0046bdf092ab827cae3b00a6d2 Reviewed-by: Robin Burchell Reviewed-by: Alan Alpert --- src/imports/shaders/shadereffectitem.cpp | 39 ++++++-------------------------- src/imports/shaders/shadereffectitem.h | 2 -- 2 files changed, 7 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/imports/shaders/shadereffectitem.cpp b/src/imports/shaders/shadereffectitem.cpp index 85a4076a..7d4ca497 100644 --- a/src/imports/shaders/shadereffectitem.cpp +++ b/src/imports/shaders/shadereffectitem.cpp @@ -218,21 +218,15 @@ ShaderEffectItem::ShaderEffectItem(QDeclarativeItem *parent) , m_hasShaderPrograms(false) , m_mirrored(false) , m_defaultVertexShader(true) - , m_contextObserver(0) { setFlag(QGraphicsItem::ItemHasNoContents, false); connect(this, SIGNAL(visibleChanged()), this, SLOT(handleVisibilityChange())); m_active = isVisible(); - -#ifndef OBSERVE_GL_CONTEXT_LOSS - m_program = new QGLShaderProgram(this); -#endif } ShaderEffectItem::~ShaderEffectItem() { reset(); - delete m_contextObserver; } @@ -412,30 +406,15 @@ void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix) if (!painter || !painter->device()) return; -#ifdef OBSERVE_GL_CONTEXT_LOSS - QGLContext *context = const_cast (QGLContext::currentContext()); - if (!m_program || !m_contextObserver || !m_contextObserver->isValid()) { - // Context has changed, re-create QGLShaderProgram - if (context) { - delete m_program; - m_program = 0; - - delete m_contextObserver; - m_contextObserver = 0; - + if (!m_program || !m_program->programId()) { + // Deleted due to deactivation, to save GPU memory, + // or invalidated due to GL context change. + delete m_program; + if (QGLContext::currentContext()) m_program = new QGLShaderProgram(this); - m_contextObserver = new QGLFramebufferObject(QSize(2,2)); - - if (!m_contextObserver || !m_program) { - delete m_program; - m_program = 0; - delete m_contextObserver; - m_contextObserver = 0; - qWarning() << "ShaderEffectItem::renderEffect - Creating QGLShaderProgram or QGLFrameBufferObject failed!"; - } - } + if (!m_program) + qWarning() << "ShaderEffectItem::renderEffect - Creating QGLShaderProgram failed!"; } -#endif if (!m_program) return; @@ -682,14 +661,10 @@ void ShaderEffectItem::setActive(bool enable) } // QGLShaderProgram is deleted when not active (to minimize GPU memory usage). -#ifdef OBSERVE_GL_CONTEXT_LOSS if (!m_active && m_program) { delete m_program; m_program = 0; - delete m_contextObserver; - m_contextObserver = 0; } -#endif emit activeChanged(); markDirty(); diff --git a/src/imports/shaders/shadereffectitem.h b/src/imports/shaders/shadereffectitem.h index ea390625..29dd799b 100644 --- a/src/imports/shaders/shadereffectitem.h +++ b/src/imports/shaders/shadereffectitem.h @@ -146,8 +146,6 @@ private: bool m_hasShaderPrograms : 1; bool m_mirrored : 1; bool m_defaultVertexShader : 1; - - QGLFramebufferObject* m_contextObserver; }; QT_END_HEADER -- cgit v1.2.3