diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-01-24 14:19:13 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-24 15:48:32 +0100 |
commit | 7bf752b2b76c3c8f289d03801f2716b27480be67 (patch) | |
tree | 625276dfa01338aa3baa4388447748fb2ef48653 | |
parent | 4fb6fb6612f1615729965f0515032d86695a86ba (diff) | |
download | qtwayland-7bf752b2b76c3c8f289d03801f2716b27480be67.tar.gz qtwayland-7bf752b2b76c3c8f289d03801f2716b27480be67.tar.bz2 qtwayland-7bf752b2b76c3c8f289d03801f2716b27480be67.zip |
Don't clobber the m_damaged state during rendering.
If the QWaylandSurfaceNode had m_damage during preprocess()
(which it could get if the GUI thread got a surfaceDamaged)
it would call into the item, update its texture and clear its
m_damaged state. This resulted in that the next time we
advanced the buffer queue, the item would not have m_damaged
set and as a result, the texture would not be updated.
Also, the call from preprocess() to updateTexture, though protected by
a mutex in preprocess(), touched a number of variables on the GUI
thread which were not being protected there, such as m_damaged and
smooth().
The QWaylandSurfaceNode was doing this primarily to deal with direct
rendering which has been removed pending a better solution, so we
replace its use with the built-in QSGSimpleTextureNode.
Change-Id: Ifccb6b1149980b4796a182fa8525446a00bbe57f
Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
5 files changed, 7 insertions, 193 deletions
diff --git a/src/compositor/compositor_api/compositor_api.pri b/src/compositor/compositor_api/compositor_api.pri index 06d89554..87d28003 100644 --- a/src/compositor/compositor_api/compositor_api.pri +++ b/src/compositor/compositor_api/compositor_api.pri @@ -18,12 +18,10 @@ QT += core-private qtHaveModule(quick) { SOURCES += \ - compositor_api/qwaylandsurfaceitem.cpp \ - compositor_api/qwaylandsurfacenode.cpp + compositor_api/qwaylandsurfaceitem.cpp HEADERS += \ - compositor_api/qwaylandsurfaceitem.h \ - compositor_api/qwaylandsurfacenode_p.h + compositor_api/qwaylandsurfaceitem.h DEFINES += QT_COMPOSITOR_QUICK diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp index ddb44c48..b4191e21 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp @@ -39,7 +39,6 @@ ****************************************************************************/ #include "qwaylandsurfaceitem.h" -#include "qwaylandsurfacenode_p.h" #include "qwaylandsurface.h" #include "qwaylandcompositor.h" #include "qwaylandinput.h" @@ -51,7 +50,7 @@ #include <QtGui/QGuiApplication> #include <QtGui/QScreen> -#include <QtQuick/QSGSimpleRectNode> +#include <QtQuick/QSGSimpleTextureNode> #include <QtQuick/QQuickWindow> #include <QtCore/QMutexLocker> @@ -90,7 +89,6 @@ QWaylandSurfaceItem::QWaylandSurfaceItem(QQuickItem *parent) : QQuickItem(parent) , m_surface(0) , m_provider(0) - , m_node(0) , m_paintEnabled(true) , m_mapped(false) , m_useTextureAlpha(false) @@ -106,7 +104,6 @@ QWaylandSurfaceItem::QWaylandSurfaceItem(QWaylandSurface *surface, QQuickItem *p : QQuickItem(parent) , m_surface(0) , m_provider(0) - , m_node(0) , m_paintEnabled(true) , m_mapped(false) , m_useTextureAlpha(false) @@ -164,8 +161,6 @@ void QWaylandSurfaceItem::init(QWaylandSurface *surface) QWaylandSurfaceItem::~QWaylandSurfaceItem() { QMutexLocker locker(mutex); - if (m_node) - m_node->setItem(0); if (m_surface) m_surface->setSurfaceItem(0); if (m_provider) @@ -405,22 +400,17 @@ QSGNode *QWaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeD return 0; } - QWaylandSurfaceNode *node = static_cast<QWaylandSurfaceNode *>(oldNode); - - if (!node) { - node = new QWaylandSurfaceNode(this); - } - - node->updateTexture(); + QSGSimpleTextureNode *node = static_cast<QSGSimpleTextureNode *>(oldNode); + if (!node) + node = new QSGSimpleTextureNode(); + node->setTexture(m_provider->t); if (surface()->isYInverted()) { node->setRect(0, height(), width(), -height()); } else { node->setRect(0, 0, width(), height()); } - node->setTextureUpdated(true); - return node; } diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h index b3b750e3..26288a7d 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.h +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h @@ -52,7 +52,6 @@ QT_BEGIN_NAMESPACE class QWaylandSurfaceTextureProvider; -class QWaylandSurfaceNode; class QMutex; Q_DECLARE_METATYPE(QWaylandSurface*) @@ -141,7 +140,6 @@ private: QWaylandSurface *m_surface; QWaylandSurfaceTextureProvider *m_provider; - QWaylandSurfaceNode *m_node; bool m_paintEnabled; bool m_mapped; bool m_useTextureAlpha; diff --git a/src/compositor/compositor_api/qwaylandsurfacenode.cpp b/src/compositor/compositor_api/qwaylandsurfacenode.cpp deleted file mode 100644 index d13b970d..00000000 --- a/src/compositor/compositor_api/qwaylandsurfacenode.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwaylandsurfacenode_p.h" -#include "qwaylandsurfaceitem.h" - -#include <QtCore/QMutexLocker> -#include <QtQuick/QSGTexture> -#include <QtQuick/QSGSimpleTextureNode> -#include <QtQuick/QSGFlatColorMaterial> - -QT_BEGIN_NAMESPACE - -QWaylandSurfaceNode::QWaylandSurfaceNode(QWaylandSurfaceItem *item) - : m_item(item) - , m_textureUpdated(false) -{ - if (m_item) - m_item->m_node = this; - setFlag(UsePreprocess,true); -} - - -QWaylandSurfaceNode::~QWaylandSurfaceNode() -{ - QMutexLocker locker(QWaylandSurfaceItem::mutex); - if (m_item) - m_item->m_node = 0; -} - -void QWaylandSurfaceNode::preprocess() -{ - QMutexLocker locker(QWaylandSurfaceItem::mutex); - - if (m_item && m_item->surface()) { - //Update if the item is dirty and we haven't done an updateTexture for this frame - if (m_item->m_damaged && !m_textureUpdated) { - m_item->updateTexture(); - updateTexture(); - } - } - //Reset value for next frame: we have not done updatePaintNode yet - m_textureUpdated = false; -} - -void QWaylandSurfaceNode::updateTexture() -{ - Q_ASSERT(m_item && m_item->textureProvider()); - QSGTexture *texture = m_item->textureProvider()->texture(); - setTexture(texture); -} - -void QWaylandSurfaceNode::setItem(QWaylandSurfaceItem *item) -{ - m_item = item; -} - -QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurfacenode_p.h b/src/compositor/compositor_api/qwaylandsurfacenode_p.h deleted file mode 100644 index 1c71acf1..00000000 --- a/src/compositor/compositor_api/qwaylandsurfacenode_p.h +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWAYLANDSURFACENODE_H -#define QWAYLANDSURFACENODE_H - -#include <QtQuick/QSGSimpleTextureNode> -#include <QtQuick/QSGOpaqueTextureMaterial> - -QT_BEGIN_NAMESPACE - -class QWaylandSurfaceItem; -class QSGTexture; - -class QWaylandSurfaceNode : public QSGSimpleTextureNode -{ -public: - QWaylandSurfaceNode(QWaylandSurfaceItem *item = 0); - ~QWaylandSurfaceNode(); - - void preprocess(); - void updateTexture(); - - bool isTextureUpdated() const { return m_textureUpdated; } - void setTextureUpdated(bool textureUpdated) { m_textureUpdated = textureUpdated; } - - QWaylandSurfaceItem *item() const { return m_item; } - void setItem(QWaylandSurfaceItem *item); - -private: - - QWaylandSurfaceItem *m_item; - bool m_textureUpdated; -}; - -QT_END_NAMESPACE - -#endif // QWAYLANDSURFACENODE_H |