Search
SailfishOS Open Build Service
>
Projects
>
home:kaltsi
:
tnhlbug
>
qt
> 0013-Observe-GL-context-loss-in-ShaderEffectItem.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File 0013-Observe-GL-context-loss-in-ShaderEffectItem.patch of Package qt
From 9e79e82a2e363a8f7fcdfd34c9e64a15dd097d79 Mon Sep 17 00:00:00 2001 From: Chris Adams <chris.adams@jollamobile.com> Date: Fri, 2 Nov 2012 13:50:58 +1000 Subject: [PATCH 13/29] 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. Signed-off-by: Chris Adams <chris.adams@jollamobile.com> --- src/imports/shaders/shadereffectitem.cpp | 43 +++++------------------------- 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 ac5a985..5c5aaeb 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 79af43b..5ef57da 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 -- 1.7.10.3