diff options
author | Chris Adams <chris.adams@jollamobile.com> | 2012-11-02 03:50:58 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-30 03:34:38 (GMT) |
commit | 8736de61dc30d70e05ad1be4ef456e8eedbe51b8 (patch) | |
tree | 455851f547d06814664eca47e54cde90382b16d6 | |
parent | a1bc10b76fd4496cf148375eb7a1ca5145e06971 (diff) | |
download | Qt-8736de61dc30d70e05ad1be4ef456e8eedbe51b8.zip Qt-8736de61dc30d70e05ad1be4ef456e8eedbe51b8.tar.gz Qt-8736de61dc30d70e05ad1be4ef456e8eedbe51b8.tar.bz2 |
Observe GL context loss in ShaderEffectItem
This is a backport of commit: 01928c91ff0ae76cdb02f50af3c62368e28cafb6
with change id: I8281e77f7285ea0046bdf092ab827cae3b00a6d2
from qt5/qtquick1 to qt4.
Task-number: QTBUG-28136
Change-Id: Idbeffce919d85f55df5184f8a8c9a89649687f93
Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
-rw-r--r-- | src/imports/shaders/shadereffectitem.cpp | 43 | ||||
-rw-r--r-- | src/imports/shaders/shadereffectitem.h | 2 |
2 files changed, 7 insertions, 38 deletions
diff --git a/src/imports/shaders/shadereffectitem.cpp b/src/imports/shaders/shadereffectitem.cpp index 330cc85..ab2698b 100644 --- a/src/imports/shaders/shadereffectitem.cpp +++ b/src/imports/shaders/shadereffectitem.cpp @@ -199,10 +199,6 @@ Rectangle { */ -#ifdef Q_OS_SYMBIAN -#define OBSERVE_GL_CONTEXT_LOSS 1 -#endif - ShaderEffectItem::ShaderEffectItem(QDeclarativeItem *parent) : QDeclarativeItem(parent) , m_program(0) @@ -219,21 +215,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; } @@ -413,30 +403,15 @@ void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix) if (!painter || !painter->device()) return; -#ifdef OBSERVE_GL_CONTEXT_LOSS - QGLContext *context = const_cast <QGLContext*> (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; @@ -683,14 +658,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 5260cdc..a32e7dc 100644 --- a/src/imports/shaders/shadereffectitem.h +++ b/src/imports/shaders/shadereffectitem.h @@ -143,8 +143,6 @@ private: bool m_hasShaderPrograms : 1; bool m_mirrored : 1; bool m_defaultVertexShader : 1; - - QGLFramebufferObject* m_contextObserver; }; QT_END_HEADER |