diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-04-12 12:12:30 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-04-13 09:22:22 +0000 |
commit | b943809c41cda9c01f26ba02ece4b6690b528d48 (patch) | |
tree | 575f87d301c4300ed8d06da12f043e9d7749e129 | |
parent | 3d2b9ef7ecd86db032942cbd68d6b9c610a03d9b (diff) |
Add the skeleton for the new, more generic shader effect impl
which should route and place most of its work into the scenegraph.
And fix a test.
Change-Id: I04f29cba53c2bab62e41b3b524794d3c4d20a472
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
-rw-r--r-- | src/particles/qquickcustomparticle.cpp | 1 | ||||
-rw-r--r-- | src/quick/items/items.pri | 2 | ||||
-rw-r--r-- | src/quick/items/qquickgenericshadereffect.cpp | 127 | ||||
-rw-r--r-- | src/quick/items/qquickgenericshadereffect_p.h | 113 | ||||
-rw-r--r-- | src/quick/items/qquickopenglshadereffect.cpp | 41 | ||||
-rw-r--r-- | src/quick/items/qquickopenglshadereffect_p.h | 19 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffect.cpp | 101 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffect_p.h | 7 | ||||
-rw-r--r-- | tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp | 2 |
9 files changed, 333 insertions, 80 deletions
diff --git a/src/particles/qquickcustomparticle.cpp b/src/particles/qquickcustomparticle.cpp index ea8a25f5e6..38c0b855e8 100644 --- a/src/particles/qquickcustomparticle.cpp +++ b/src/particles/qquickcustomparticle.cpp @@ -94,6 +94,7 @@ struct PlainVertices { QQuickCustomParticle::QQuickCustomParticle(QQuickItem* parent) : QQuickParticlePainter(parent) + , m_common(this) , m_dirtyUniforms(true) , m_dirtyUniformValues(true) , m_dirtyTextureProviders(true) diff --git a/src/quick/items/items.pri b/src/quick/items/items.pri index baa59cb7fd..61d81f94be 100644 --- a/src/quick/items/items.pri +++ b/src/quick/items/items.pri @@ -75,6 +75,7 @@ HEADERS += \ $$PWD/qquickshadereffectsource_p.h \ $$PWD/qquickshadereffectmesh_p.h \ $$PWD/qquickshadereffect_p.h \ + $$PWD/qquickgenericshadereffect_p.h \ $$PWD/qquickrendercontrol.h \ $$PWD/qquickrendercontrol_p.h @@ -128,6 +129,7 @@ SOURCES += \ $$PWD/qquickshadereffectsource.cpp \ $$PWD/qquickshadereffectmesh.cpp \ $$PWD/qquickshadereffect.cpp \ + $$PWD/qquickgenericshadereffect.cpp \ $$PWD/qquickrendercontrol.cpp # Items that depend on OpenGL Renderer diff --git a/src/quick/items/qquickgenericshadereffect.cpp b/src/quick/items/qquickgenericshadereffect.cpp new file mode 100644 index 0000000000..419acaeb72 --- /dev/null +++ b/src/quick/items/qquickgenericshadereffect.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <private/qquickgenericshadereffect_p.h> + +QT_BEGIN_NAMESPACE + +// The generic shader effect is used when the scenegraph backend indicates +// SupportsShaderEffectV2. This, unlike the monolithic and interconnected (e.g. +// with particles) OpenGL variant, passes most of the work to a scenegraph node +// created via the adaptation layer, thus allowing different implementation in +// the backends. + +QQuickGenericShaderEffect::QQuickGenericShaderEffect(QQuickShaderEffect *item, QObject *parent) + : QObject(parent) + , m_item(item) + , m_meshResolution(1, 1) + , m_mesh(0) + , m_cullMode(QQuickShaderEffect::NoCulling) + , m_status(QQuickShaderEffect::Uncompiled) + , m_blending(true) + , m_supportsAtlasTextures(false) +{ +} + +QQuickGenericShaderEffect::~QQuickGenericShaderEffect() +{ +} + +void QQuickGenericShaderEffect::setFragmentShader(const QByteArray &code) +{ + Q_UNUSED(code); +} + +void QQuickGenericShaderEffect::setVertexShader(const QByteArray &code) +{ + Q_UNUSED(code); +} + +void QQuickGenericShaderEffect::setBlending(bool enable) +{ + Q_UNUSED(enable); +} + +QVariant QQuickGenericShaderEffect::mesh() const +{ + return m_mesh ? qVariantFromValue(static_cast<QObject *>(m_mesh)) + : qVariantFromValue(m_meshResolution); +} + +void QQuickGenericShaderEffect::setMesh(const QVariant &mesh) +{ + Q_UNUSED(mesh); +} + +void QQuickGenericShaderEffect::setCullMode(QQuickShaderEffect::CullMode face) +{ + Q_UNUSED(face); +} + +void QQuickGenericShaderEffect::setSupportsAtlasTextures(bool supports) +{ + Q_UNUSED(supports); +} + +void QQuickGenericShaderEffect::handleEvent(QEvent *event) +{ + Q_UNUSED(event); +} + +void QQuickGenericShaderEffect::handleGeometryChanged(const QRectF &, const QRectF &) +{ +} + +QSGNode *QQuickGenericShaderEffect::handleUpdatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) +{ + Q_UNUSED(oldNode); + return nullptr; +} + +void QQuickGenericShaderEffect::handleComponentComplete() +{ +} + +void QQuickGenericShaderEffect::handleItemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) +{ + Q_UNUSED(change); + Q_UNUSED(value); +} + +QT_END_NAMESPACE diff --git a/src/quick/items/qquickgenericshadereffect_p.h b/src/quick/items/qquickgenericshadereffect_p.h new file mode 100644 index 0000000000..6a31276a61 --- /dev/null +++ b/src/quick/items/qquickgenericshadereffect_p.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKGENERICSHADEREFFECT_P_H +#define QQUICKGENERICSHADEREFFECT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtQuick/qquickitem.h> +#include <private/qtquickglobal_p.h> +#include "qquickshadereffect_p.h" +#include "qquickshadereffectmesh_p.h" + +QT_BEGIN_NAMESPACE + +class Q_QUICK_PRIVATE_EXPORT QQuickGenericShaderEffect : public QObject +{ + Q_OBJECT + +public: + QQuickGenericShaderEffect(QQuickShaderEffect *item, QObject *parent = 0); + ~QQuickGenericShaderEffect(); + + QByteArray fragmentShader() const { return QByteArray(); } + void setFragmentShader(const QByteArray &code); + + QByteArray vertexShader() const { return QByteArray(); } + void setVertexShader(const QByteArray &code); + + bool blending() const { return m_blending; } + void setBlending(bool enable); + + QVariant mesh() const; + void setMesh(const QVariant &mesh); + + QQuickShaderEffect::CullMode cullMode() const { return m_cullMode; } + void setCullMode(QQuickShaderEffect::CullMode face); + + QString log() const { return m_log; } + QQuickShaderEffect::Status status() const { return m_status; } + + bool supportsAtlasTextures() const { return m_supportsAtlasTextures; } + void setSupportsAtlasTextures(bool supports); + + void handleEvent(QEvent *); + void handleGeometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); + QSGNode *handleUpdatePaintNode(QSGNode *, QQuickItem::UpdatePaintNodeData *); + void handleComponentComplete(); + void handleItemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value); + + QString parseLog() { return QString(); } + +private: + QQuickShaderEffect *m_item; + QSize m_meshResolution; + QQuickShaderEffectMesh *m_mesh; + QQuickGridMesh m_defaultMesh; + QQuickShaderEffect::CullMode m_cullMode; + QString m_log; + QQuickShaderEffect::Status m_status; + + uint m_blending : 1; + uint m_supportsAtlasTextures : 1; +}; + +QT_END_NAMESPACE + +#endif // QQUICKGENERICSHADEREFFECT_P_H diff --git a/src/quick/items/qquickopenglshadereffect.cpp b/src/quick/items/qquickopenglshadereffect.cpp index 354d7705e3..e3ac3600bc 100644 --- a/src/quick/items/qquickopenglshadereffect.cpp +++ b/src/quick/items/qquickopenglshadereffect.cpp @@ -193,13 +193,13 @@ void QQuickOpenGLShaderEffectCommon::disconnectPropertySignals(QQuickItem *item, const UniformData &d = uniformData[shaderType].at(i); QSignalMapper *mapper = signalMappers[shaderType].at(i); QObject::disconnect(item, 0, mapper, SLOT(map())); - QObject::disconnect(mapper, SIGNAL(mapped(int)), item, SLOT(propertyChanged(int))); + QObject::disconnect(mapper, SIGNAL(mapped(int)), host, SLOT(propertyChanged(int))); if (d.specialType == UniformData::Sampler) { QQuickItem *source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(d.value)); if (source) { if (item->window()) QQuickItemPrivate::get(source)->derefWindow(); - QObject::disconnect(source, SIGNAL(destroyed(QObject*)), item, SLOT(sourceDestroyed(QObject*))); + QObject::disconnect(source, SIGNAL(destroyed(QObject*)), host, SLOT(sourceDestroyed(QObject*))); } } } @@ -219,7 +219,7 @@ void QQuickOpenGLShaderEffectCommon::connectPropertySignals(QQuickItem *item, Ke const QByteArray signalName = '2' + mp.notifySignal().methodSignature(); QSignalMapper *mapper = signalMappers[shaderType].at(i); QObject::connect(item, signalName, mapper, SLOT(map())); - QObject::connect(mapper, SIGNAL(mapped(int)), item, SLOT(propertyChanged(int))); + QObject::connect(mapper, SIGNAL(mapped(int)), host, SLOT(propertyChanged(int))); } else { // If the source is set via a dynamic property, like the layer is, then we need this // check to disable the warning. @@ -232,7 +232,7 @@ void QQuickOpenGLShaderEffectCommon::connectPropertySignals(QQuickItem *item, Ke if (source) { if (item->window()) QQuickItemPrivate::get(source)->refWindow(item->window()); - QObject::connect(source, SIGNAL(destroyed(QObject*)), item, SLOT(sourceDestroyed(QObject*))); + QObject::connect(source, SIGNAL(destroyed(QObject*)), host, SLOT(sourceDestroyed(QObject*))); } } } @@ -499,7 +499,7 @@ void QQuickOpenGLShaderEffectCommon::propertyChanged(QQuickItem *item, int mappe // would trigger both to be disconnected. Without the connection we'll end up // with a dangling pointer in the uniformData. if (qquick_uniqueInUniformData(source, uniformData, shaderType, index)) - QObject::disconnect(source, SIGNAL(destroyed(QObject*)), item, SLOT(sourceDestroyed(QObject*))); + QObject::disconnect(source, SIGNAL(destroyed(QObject*)), host, SLOT(sourceDestroyed(QObject*))); } d.value = item->property(d.name.constData()); @@ -512,7 +512,7 @@ void QQuickOpenGLShaderEffectCommon::propertyChanged(QQuickItem *item, int mappe // will not get a parent. In those cases, 'source' should get the window from 'item'. if (item->window()) QQuickItemPrivate::get(source)->refWindow(item->window()); - QObject::connect(source, SIGNAL(destroyed(QObject*)), item, SLOT(sourceDestroyed(QObject*))); + QObject::connect(source, SIGNAL(destroyed(QObject*)), host, SLOT(sourceDestroyed(QObject*))); } if (textureProviderChanged) *textureProviderChanged = true; @@ -530,6 +530,7 @@ QQuickOpenGLShaderEffect::QQuickOpenGLShaderEffect(QQuickShaderEffect *item, QOb , m_mesh(0) , m_cullMode(QQuickShaderEffect::NoCulling) , m_status(QQuickShaderEffect::Uncompiled) + , m_common(this) , m_blending(true) , m_dirtyUniforms(true) , m_dirtyUniformValues(true) @@ -563,9 +564,9 @@ void QQuickOpenGLShaderEffect::setFragmentShader(const QByteArray &code) m_item->update(); if (m_status != QQuickShaderEffect::Uncompiled) { m_status = QQuickShaderEffect::Uncompiled; - emit statusChanged(); + emit m_item->statusChanged(); } - emit fragmentShaderChanged(); + emit m_item->fragmentShaderChanged(); } void QQuickOpenGLShaderEffect::setVertexShader(const QByteArray &code) @@ -583,9 +584,9 @@ void QQuickOpenGLShaderEffect::setVertexShader(const QByteArray &code) m_item->update(); if (m_status != QQuickShaderEffect::Uncompiled) { m_status = QQuickShaderEffect::Uncompiled; - emit statusChanged(); + emit m_item->statusChanged(); } - emit vertexShaderChanged(); + emit m_item->vertexShaderChanged(); } void QQuickOpenGLShaderEffect::setBlending(bool enable) @@ -596,7 +597,7 @@ void QQuickOpenGLShaderEffect::setBlending(bool enable) m_blending = enable; m_item->update(); - emit blendingChanged(); + emit m_item->blendingChanged(); } QVariant QQuickOpenGLShaderEffect::mesh() const @@ -638,7 +639,7 @@ void QQuickOpenGLShaderEffect::setMesh(const QVariant &mesh) m_dirtyMesh = true; m_dirtyParseLog = true; m_item->update(); - emit meshChanged(); + emit m_item->meshChanged(); } void QQuickOpenGLShaderEffect::setCullMode(QQuickShaderEffect::CullMode face) @@ -647,7 +648,7 @@ void QQuickOpenGLShaderEffect::setCullMode(QQuickShaderEffect::CullMode face) return; m_cullMode = face; m_item->update(); - emit cullModeChanged(); + emit m_item->cullModeChanged(); } void QQuickOpenGLShaderEffect::setSupportsAtlasTextures(bool supports) @@ -656,7 +657,7 @@ void QQuickOpenGLShaderEffect::setSupportsAtlasTextures(bool supports) return; m_supportsAtlasTextures = supports; updateGeometry(); - emit supportsAtlasTexturesChanged(); + emit m_item->supportsAtlasTexturesChanged(); } QString QQuickOpenGLShaderEffect::parseLog() @@ -702,16 +703,16 @@ void QQuickOpenGLShaderEffect::updateLogAndStatus(const QString &log, int status { m_log = parseLog() + log; m_status = QQuickShaderEffect::Status(status); - emit logChanged(); - emit statusChanged(); + emit m_item->logChanged(); + emit m_item->statusChanged(); } -void QQuickOpenGLShaderEffect::handleSourceDestroyed(QObject *object) +void QQuickOpenGLShaderEffect::sourceDestroyed(QObject *object) { m_common.sourceDestroyed(object); } -void QQuickOpenGLShaderEffect::handlePropertyChanged(int mappedId) +void QQuickOpenGLShaderEffect::propertyChanged(int mappedId) { bool textureProviderChanged; m_common.propertyChanged(m_item, mappedId, &textureProviderChanged); @@ -829,8 +830,8 @@ QSGNode *QQuickOpenGLShaderEffect::handleUpdatePaintNode(QSGNode *oldNode, QQuic m_log += QLatin1String("*** Mesh ***\n"); m_log += log; m_status = QQuickShaderEffect::Error; - emit logChanged(); - emit statusChanged(); + emit m_item->logChanged(); + emit m_item->statusChanged(); } delete node; return 0; diff --git a/src/quick/items/qquickopenglshadereffect_p.h b/src/quick/items/qquickopenglshadereffect_p.h index 80e1e5ee8e..0e54813443 100644 --- a/src/quick/items/qquickopenglshadereffect_p.h +++ b/src/quick/items/qquickopenglshadereffect_p.h @@ -74,6 +74,7 @@ struct Q_QUICK_PRIVATE_EXPORT QQuickOpenGLShaderEffectCommon typedef QQuickOpenGLShaderEffectMaterialKey Key; typedef QQuickOpenGLShaderEffectMaterial::UniformData UniformData; + QQuickOpenGLShaderEffectCommon(QObject *host) : host(host) { } ~QQuickOpenGLShaderEffectCommon(); void disconnectPropertySignals(QQuickItem *item, Key::ShaderType shaderType); void connectPropertySignals(QQuickItem *item, Key::ShaderType shaderType); @@ -88,6 +89,7 @@ struct Q_QUICK_PRIVATE_EXPORT QQuickOpenGLShaderEffectCommon void sourceDestroyed(QObject *object); void propertyChanged(QQuickItem *item, int mappedId, bool *textureProviderChanged); + QObject *host; Key source; QVector<QByteArray> attributes; QVector<UniformData> uniformData[Key::ShaderTypeCount]; @@ -127,29 +129,18 @@ public: QString parseLog(); -Q_SIGNALS: - void fragmentShaderChanged(); - void vertexShaderChanged(); - void blendingChanged(); - void meshChanged(); - void cullModeChanged(); - void logChanged(); - void statusChanged(); - void supportsAtlasTexturesChanged(); - -protected: void handleEvent(QEvent *); void handleGeometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); QSGNode *handleUpdatePaintNode(QSGNode *, QQuickItem::UpdatePaintNodeData *); void handleComponentComplete(); void handleItemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value); - void handleSourceDestroyed(QObject *object); - void handlePropertyChanged(int mappedId); private Q_SLOTS: void updateGeometry(); void updateGeometryIfAtlased(); void updateLogAndStatus(const QString &log, int status); + void sourceDestroyed(QObject *object); + void propertyChanged(int mappedId); private: friend class QQuickCustomMaterialShader; @@ -178,8 +169,6 @@ private: uint m_dirtyGeometry : 1; uint m_customVertexShader : 1; uint m_supportsAtlasTextures : 1; - - friend class QQuickShaderEffect; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp index 71f5e56e32..0f6f88f19b 100644 --- a/src/quick/items/qquickshadereffect.cpp +++ b/src/quick/items/qquickshadereffect.cpp @@ -42,6 +42,7 @@ #ifndef QT_NO_OPENGL #include <private/qquickopenglshadereffect_p.h> #endif +#include <private/qquickgenericshadereffect_p.h> QT_BEGIN_NAMESPACE @@ -196,16 +197,18 @@ QT_BEGIN_NAMESPACE QSGContextFactoryInterface::Flags qsg_backend_flags(); QQuickShaderEffect::QQuickShaderEffect(QQuickItem *parent) - : QQuickItem(parent) + : QQuickItem(parent), + m_glImpl(nullptr), + m_impl(nullptr) { setFlag(QQuickItem::ItemHasContents); #ifndef QT_NO_OPENGL if (!qsg_backend_flags().testFlag(QSGContextFactoryInterface::SupportsShaderEffectV2)) m_glImpl = new QQuickOpenGLShaderEffect(this, this); - else - m_glImpl = nullptr; #endif + if (!m_glImpl) + m_impl = new QQuickGenericShaderEffect(this, this); } /*! @@ -223,16 +226,18 @@ QByteArray QQuickShaderEffect::fragmentShader() const if (m_glImpl) return m_glImpl->fragmentShader(); #endif - return QByteArray(); + return m_impl->fragmentShader(); } void QQuickShaderEffect::setFragmentShader(const QByteArray &code) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setFragmentShader(code); + return; + } #endif - Q_UNUSED(code); + m_impl->setFragmentShader(code); } /*! @@ -249,16 +254,18 @@ QByteArray QQuickShaderEffect::vertexShader() const if (m_glImpl) return m_glImpl->vertexShader(); #endif - return QByteArray(); + return m_impl->vertexShader(); } void QQuickShaderEffect::setVertexShader(const QByteArray &code) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setVertexShader(code); + return; + } #endif - Q_UNUSED(code); + m_impl->setVertexShader(code); } /*! @@ -276,16 +283,18 @@ bool QQuickShaderEffect::blending() const if (m_glImpl) return m_glImpl->blending(); #endif - return true; + return m_impl->blending(); } void QQuickShaderEffect::setBlending(bool enable) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setBlending(enable); + return; + } #endif - Q_UNUSED(enable); + m_impl->setBlending(enable); } /*! @@ -307,16 +316,18 @@ QVariant QQuickShaderEffect::mesh() const if (m_glImpl) return m_glImpl->mesh(); #endif - return QVariant(); + return m_impl->mesh(); } void QQuickShaderEffect::setMesh(const QVariant &mesh) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setMesh(mesh); + return; + } #endif - Q_UNUSED(mesh); + m_impl->setMesh(mesh); } /*! @@ -339,16 +350,18 @@ QQuickShaderEffect::CullMode QQuickShaderEffect::cullMode() const if (m_glImpl) return m_glImpl->cullMode(); #endif - return NoCulling; + return m_impl->cullMode(); } void QQuickShaderEffect::setCullMode(CullMode face) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setCullMode(face); + return; + } #endif - Q_UNUSED(face); + return m_impl->setCullMode(face); } /*! @@ -378,16 +391,18 @@ bool QQuickShaderEffect::supportsAtlasTextures() const if (m_glImpl) return m_glImpl->supportsAtlasTextures(); #endif - return false; + return m_impl->supportsAtlasTextures(); } void QQuickShaderEffect::setSupportsAtlasTextures(bool supports) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->setSupportsAtlasTextures(supports); + return; + } #endif - Q_UNUSED(supports); + m_impl->setSupportsAtlasTextures(supports); } /*! @@ -424,7 +439,7 @@ QString QQuickShaderEffect::log() const if (m_glImpl) return m_glImpl->log(); #endif - return QString(); + return m_impl->log(); } QQuickShaderEffect::Status QQuickShaderEffect::status() const @@ -433,24 +448,31 @@ QQuickShaderEffect::Status QQuickShaderEffect::status() const if (m_glImpl) return m_glImpl->status(); #endif - return Uncompiled; + return m_impl->status(); } bool QQuickShaderEffect::event(QEvent *e) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->handleEvent(e); + return QQuickItem::event(e); + } #endif + m_impl->handleEvent(e); return QQuickItem::event(e); } void QQuickShaderEffect::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->handleGeometryChanged(newGeometry, oldGeometry); + QQuickItem::geometryChanged(newGeometry, oldGeometry); + return; + } #endif + m_impl->handleGeometryChanged(newGeometry, oldGeometry); QQuickItem::geometryChanged(newGeometry, oldGeometry); } @@ -460,24 +482,32 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa if (m_glImpl) return m_glImpl->handleUpdatePaintNode(oldNode, updatePaintNodeData); #endif - return nullptr; + return m_impl->handleUpdatePaintNode(oldNode, updatePaintNodeData); } void QQuickShaderEffect::componentComplete() { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->handleComponentComplete(); + QQuickItem::componentComplete(); + return; + } #endif + m_impl->handleComponentComplete(); QQuickItem::componentComplete(); } void QQuickShaderEffect::itemChange(ItemChange change, const ItemChangeData &value) { #ifndef QT_NO_OPENGL - if (m_glImpl) + if (m_glImpl) { m_glImpl->handleItemChange(change, value); + QQuickItem::itemChange(change, value); + return; + } #endif + m_impl->handleItemChange(change, value); QQuickItem::itemChange(change, value); } @@ -486,22 +516,13 @@ bool QQuickShaderEffect::isComponentComplete() const return QQuickItem::isComponentComplete(); } -void QQuickShaderEffect::sourceDestroyed(QObject *object) -{ -#ifndef QT_NO_OPENGL - if (m_glImpl) - m_glImpl->handleSourceDestroyed(object); -#endif - Q_UNUSED(object); -} - -void QQuickShaderEffect::propertyChanged(int mappedId) +QString QQuickShaderEffect::parseLog() { #ifndef QT_NO_OPENGL if (m_glImpl) - m_glImpl->handlePropertyChanged(mappedId); + return m_glImpl->parseLog(); #endif - Q_UNUSED(mappedId); + return m_impl->parseLog(); } QT_END_NAMESPACE diff --git a/src/quick/items/qquickshadereffect_p.h b/src/quick/items/qquickshadereffect_p.h index cabe657c3f..62d7e6fe5f 100644 --- a/src/quick/items/qquickshadereffect_p.h +++ b/src/quick/items/qquickshadereffect_p.h @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE class QQuickOpenGLShaderEffect; +class QQuickGenericShaderEffect; class Q_QUICK_PRIVATE_EXPORT QQuickShaderEffect : public QQuickItem { @@ -109,6 +110,7 @@ public: Status status() const; bool isComponentComplete() const; + QString parseLog(); Q_SIGNALS: void fragmentShaderChanged(); @@ -127,14 +129,11 @@ protected: void componentComplete() override; void itemChange(ItemChange change, const ItemChangeData &value) override; -private Q_SLOTS: - void sourceDestroyed(QObject *object); - void propertyChanged(int mappedId); - private: #ifndef QT_NO_OPENGL QQuickOpenGLShaderEffect *m_glImpl; #endif + QQuickGenericShaderEffect *m_impl; }; QT_END_NAMESPACE diff --git a/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp b/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp index 36c25ae78e..171e0800e1 100644 --- a/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp +++ b/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp @@ -35,7 +35,7 @@ #include <QtQuick/QQuickView> #include "../../shared/util.h" -class TestShaderEffect : public QQuickOpenGLShaderEffect +class TestShaderEffect : public QQuickShaderEffect { Q_OBJECT Q_PROPERTY(QVariant source READ dummyRead NOTIFY dummyChanged) |