diff options
author | Sergio Ahumada <sahumada@blackberry.com> | 2014-06-11 10:03:38 +0200 |
---|---|---|
committer | Sergio Ahumada <sahumada@blackberry.com> | 2014-06-11 10:03:38 +0200 |
commit | b4247d7c79af564b1213a9de17ff306747e17caa (patch) | |
tree | 20d32303488bb4b957d3e8b1bc9815332409fd68 | |
parent | bcabc0ad3d25e78cd158a59fef4e894b3ec58b72 (diff) | |
parent | 906cf6ce32604dc71d3e5b33f2de2f0046e252ff (diff) |
Merge remote-tracking branch 'origin/stable' into 5.3
Change-Id: I595002245ffee7aa739ce6ee9806cf509a5e7405
-rw-r--r-- | examples/quick/quickwidgets/quickwidget/main.cpp | 6 | ||||
-rw-r--r-- | src/3rdparty/masm/yarr/YarrJIT.cpp | 2 | ||||
-rw-r--r-- | src/qml/doc/src/cppintegration/exposecppattributes.qdoc | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 4 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 2 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 64 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 2 | ||||
-rw-r--r-- | tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp | 98 | ||||
-rw-r--r-- | tests/auto/quick/scenegraph/data/render_OpacityThroughBatchRoot.qml | 90 | ||||
-rw-r--r-- | tests/auto/quick/scenegraph/tst_scenegraph.cpp | 9 |
10 files changed, 204 insertions, 75 deletions
diff --git a/examples/quick/quickwidgets/quickwidget/main.cpp b/examples/quick/quickwidgets/quickwidget/main.cpp index 61c54735cf..3850dde157 100644 --- a/examples/quick/quickwidgets/quickwidget/main.cpp +++ b/examples/quick/quickwidgets/quickwidget/main.cpp @@ -58,12 +58,14 @@ private: MainWindow::MainWindow() : m_quickWidget(new QQuickWidget) { + QSurfaceFormat format; if (QCoreApplication::arguments().contains(QStringLiteral("--coreprofile"))) { - QSurfaceFormat format; format.setVersion(4, 4); format.setProfile(QSurfaceFormat::CoreProfile); - m_quickWidget->setFormat(format); } + if (QCoreApplication::arguments().contains(QStringLiteral("--multisample"))) + format.setSamples(4); + m_quickWidget->setFormat(format); QMdiArea *centralWidget = new QMdiArea; diff --git a/src/3rdparty/masm/yarr/YarrJIT.cpp b/src/3rdparty/masm/yarr/YarrJIT.cpp index 783a869b5a..94a72a57c7 100644 --- a/src/3rdparty/masm/yarr/YarrJIT.cpp +++ b/src/3rdparty/masm/yarr/YarrJIT.cpp @@ -2561,6 +2561,7 @@ class YarrGenerator : private MacroAssembler { #if CPU(ARM_TRADITIONAL) push(ARMRegisters::r8); // scratch register #endif + push(addressTempRegister); if (compileMode == IncludeSubpatterns) move(ARMRegisters::r3, output); #elif CPU(SH4) @@ -2588,6 +2589,7 @@ class YarrGenerator : private MacroAssembler { pop(X86Registers::ebx); pop(X86Registers::ebp); #elif CPU(ARM) + pop(addressTempRegister); #if CPU(ARM_TRADITIONAL) pop(ARMRegisters::r8); // scratch register #endif diff --git a/src/qml/doc/src/cppintegration/exposecppattributes.qdoc b/src/qml/doc/src/cppintegration/exposecppattributes.qdoc index f02c3da6af..8f883d9f42 100644 --- a/src/qml/doc/src/cppintegration/exposecppattributes.qdoc +++ b/src/qml/doc/src/cppintegration/exposecppattributes.qdoc @@ -106,6 +106,8 @@ public: QString author() const { return m_author; } +signals: + void authorChanged(); private: QString m_author; }; diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index e8f803f2a9..5c83528b82 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -417,7 +417,7 @@ void Updater::visitTransformNode(Node *n) // The only change in this subtree is ourselves and we are a batch root, so // only update subroots and return, saving tons of child-processing (flickable-panning) - if (!n->becameBatchRoot && m_added == 0 && m_force_update == 0 && dirty && (n->dirtyState & ~QSGNode::DirtyMatrix) == 0) { + if (!n->becameBatchRoot && m_added == 0 && m_force_update == 0 && m_opacityChange == 0 && dirty && (n->dirtyState & ~QSGNode::DirtyMatrix) == 0) { BatchRootInfo *info = renderer->batchRootInfo(n); for (QSet<Node *>::const_iterator it = info->subRoots.constBegin(); it != info->subRoots.constEnd(); ++it) { @@ -2015,6 +2015,8 @@ void Renderer::renderMergedBatch(const Batch *batch) << " root:" << batch->root; if (batch->drawSets.size() > 1) debug << "sets:" << batch->drawSets.size(); + if (!batch->isOpaque) + debug << "opacity:" << e->node->inheritedOpacity(); batch->uploadedThisFrame = false; } diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index 0aa30280e5..ae8d135d83 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -1233,6 +1233,8 @@ bool QSGThreadedRenderLoop::event(QEvent *e) } if (w) polishAndSync(w); + else + killTimer(te->timerId()); } return true; } diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 3993629672..3743a8cf1e 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -89,7 +89,6 @@ void QQuickWidgetPrivate::init(QQmlEngine* e) offscreenWindow = renderControl->createOffscreenWindow(); offscreenWindow->setTitle(QString::fromLatin1("Offscreen")); // Do not call create() on offscreenWindow. - createOffscreenSurface(); if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface)) setRenderToTexture(); @@ -144,6 +143,7 @@ QQuickWidgetPrivate::QQuickWidgetPrivate() , offscreenSurface(0) , renderControl(0) , fbo(0) + , resolvedFbo(0) , context(0) , resizeMode(QQuickWidget::SizeViewToRootObject) , initialSize(0,0) @@ -164,21 +164,12 @@ QQuickWidgetPrivate::~QQuickWidgetPrivate() Q_ASSERT(!context || (QOpenGLContext::currentContext() == context && context->surface() == offscreenSurface)); delete offscreenWindow; delete renderControl; + delete resolvedFbo; delete fbo; - delete offscreenSurface; destroyContext(); } -void QQuickWidgetPrivate::createOffscreenSurface() -{ - delete offscreenSurface; - offscreenSurface = 0; - offscreenSurface = new QOffscreenSurface; - offscreenSurface->setFormat(offscreenWindow->requestedFormat()); - offscreenSurface->create(); -} - void QQuickWidgetPrivate::execute() { Q_Q(QQuickWidget); @@ -237,6 +228,12 @@ void QQuickWidgetPrivate::renderSceneGraph() renderControl->sync(); renderControl->render(); glFlush(); + + if (resolvedFbo) { + QRect rect(QPoint(0, 0), fbo->size()); + QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect); + } + context->doneCurrent(); q->update(); } @@ -641,6 +638,13 @@ void QQuickWidgetPrivate::createContext() return; } + offscreenSurface = new QOffscreenSurface; + // Pass the context's format(), which, now that the underlying platform context is created, + // contains a QSurfaceFormat representing the _actual_ format of the underlying + // configuration. This is essential to get a surface that is compatible with the context. + offscreenSurface->setFormat(context->format()); + offscreenSurface->create(); + if (context->makeCurrent(offscreenSurface)) renderControl->initialize(context); else @@ -649,6 +653,8 @@ void QQuickWidgetPrivate::createContext() void QQuickWidgetPrivate::destroyContext() { + delete offscreenSurface; + offscreenSurface = 0; delete context; context = 0; } @@ -671,11 +677,23 @@ void QQuickWidget::createFramebufferObject() context->makeCurrent(d->offscreenSurface); + int samples = d->offscreenWindow->requestedFormat().samples(); + if (!QOpenGLExtensions(context).hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) + samples = 0; + + QOpenGLFramebufferObjectFormat format; + format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + format.setSamples(samples); + + QSize fboSize = size() * window()->devicePixelRatio(); + delete d->fbo; - d->fbo = new QOpenGLFramebufferObject(size() * window()->devicePixelRatio()); - d->fbo->setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + d->fbo = new QOpenGLFramebufferObject(fboSize, format); d->offscreenWindow->setRenderTarget(d->fbo); + if (samples > 0) + d->resolvedFbo = new QOpenGLFramebufferObject(fboSize); + // Sanity check: The window must not have an underlying platform window. // Having one would mean create() was called and platforms that only support // a single native window were in trouble. @@ -685,9 +703,10 @@ void QQuickWidget::createFramebufferObject() void QQuickWidget::destroyFramebufferObject() { Q_D(QQuickWidget); - if (d->fbo) - delete d->fbo; + delete d->fbo; d->fbo = 0; + delete d->resolvedFbo; + d->resolvedFbo = 0; } QQuickWidget::ResizeMode QQuickWidget::resizeMode() const @@ -772,7 +791,8 @@ GLuint QQuickWidgetPrivate::textureId() const << "Consider setting Qt::AA_DontCreateNativeWidgetSiblings"; return 0; } - return fbo ? fbo->texture() : 0; + return resolvedFbo ? resolvedFbo->texture() + : (fbo ? fbo->texture() : 0); } /*! @@ -986,13 +1006,18 @@ bool QQuickWidget::event(QEvent *e) switch (e->type()) { #ifndef QT_NO_DRAGANDDROP case QEvent::Drop: - case QEvent::DragEnter: case QEvent::DragMove: case QEvent::DragLeave: // Drag/drop events only have local pos, so no need to map, // but QQuickWindow::event() does not return true d->offscreenWindow->event(e); return e->isAccepted(); + case QEvent::DragEnter: + // Don't reject drag events for the entire widget when one + // item rejects the drag enter + d->offscreenWindow->event(e); + e->accept(); + return true; #endif case QEvent::TouchBegin: case QEvent::TouchEnd: @@ -1044,10 +1069,7 @@ void QQuickWidget::setFormat(const QSurfaceFormat &format) newFormat.setDepthBufferSize(qMax(newFormat.depthBufferSize(), currentFormat.depthBufferSize())); newFormat.setStencilBufferSize(qMax(newFormat.stencilBufferSize(), currentFormat.stencilBufferSize())); newFormat.setAlphaBufferSize(qMax(newFormat.alphaBufferSize(), currentFormat.alphaBufferSize())); - if (currentFormat != newFormat) { - d->offscreenWindow->setFormat(newFormat); - d->createOffscreenSurface(); - } + d->offscreenWindow->setFormat(newFormat); } /*! diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h index 8efe32b3ce..356c34e7f5 100644 --- a/src/quickwidgets/qquickwidget_p.h +++ b/src/quickwidgets/qquickwidget_p.h @@ -87,7 +87,6 @@ public: void createContext(); void destroyContext(); void handleContextCreationFailure(const QSurfaceFormat &format, bool isEs); - void createOffscreenSurface(); GLuint textureId() const Q_DECL_OVERRIDE; @@ -108,6 +107,7 @@ public: QOffscreenSurface *offscreenSurface; QQuickRenderControl *renderControl; QOpenGLFramebufferObject *fbo; + QOpenGLFramebufferObject *resolvedFbo; QOpenGLContext *context; QQuickWidget::ResizeMode resizeMode; diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp index 5fd985f6d5..b544427c08 100644 --- a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp +++ b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp @@ -136,7 +136,8 @@ public: { } - QList<QQmlProfilerData> synchronousMessages; + QList<QQmlProfilerData> qmlMessages; + QList<QQmlProfilerData> javascriptMessages; QList<QQmlProfilerData> asynchronousMessages; QList<QQmlProfilerData> pixmapMessages; @@ -311,14 +312,12 @@ void QQmlProfilerClient::messageReceived(const QByteArray &message) if (data.messageType == QQmlProfilerClient::PixmapCacheEvent) pixmapMessages.append(data); else if (data.messageType == QQmlProfilerClient::SceneGraphFrame || - (data.messageType == QQmlProfilerClient::Event && - (data.detailType == QQmlProfilerClient::FramePaint || - data.detailType == QQmlProfilerClient::AnimationFrame || - data.detailType == QQmlProfilerClient::Mouse || - data.detailType == QQmlProfilerClient::Key))) + data.messageType == QQmlProfilerClient::Event) asynchronousMessages.append(data); + else if (data.detailType == QQmlProfilerClient::Javascript) + javascriptMessages.append(data); else - synchronousMessages.append(data); + qmlMessages.append(data); } void tst_QQmlProfilerService::connect(bool block, const QString &testFile) @@ -347,23 +346,30 @@ void tst_QQmlProfilerService::connect(bool block, const QString &testFile) void tst_QQmlProfilerService::checkTraceReceived() { QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), "No trace received in time."); - QVERIFY(m_client->synchronousMessages.count()); + QVERIFY(m_client->asynchronousMessages.count()); // must start with "StartTrace" - QCOMPARE(m_client->synchronousMessages.first().messageType, (int)QQmlProfilerClient::Event); - QCOMPARE(m_client->synchronousMessages.first().detailType, (int)QQmlProfilerClient::StartTrace); + QCOMPARE(m_client->asynchronousMessages.first().messageType, (int)QQmlProfilerClient::Event); + QCOMPARE(m_client->asynchronousMessages.first().detailType, (int)QQmlProfilerClient::StartTrace); // must end with "EndTrace" - QCOMPARE(m_client->synchronousMessages.last().messageType, (int)QQmlProfilerClient::Event); - QCOMPARE(m_client->synchronousMessages.last().detailType, (int)QQmlProfilerClient::EndTrace); + QCOMPARE(m_client->asynchronousMessages.last().messageType, (int)QQmlProfilerClient::Event); + QCOMPARE(m_client->asynchronousMessages.last().detailType, (int)QQmlProfilerClient::EndTrace); } void tst_QQmlProfilerService::cleanup() { if (QTest::currentTestFailed()) { - qDebug() << "Synchronous Messages:" << m_client->synchronousMessages.count(); + qDebug() << "QML Messages:" << m_client->qmlMessages.count(); int i = 0; - foreach (const QQmlProfilerData &data, m_client->synchronousMessages) { + foreach (const QQmlProfilerData &data, m_client->qmlMessages) { + qDebug() << i++ << data.time << data.messageType << data.detailType << data.detailData + << data.line << data.column; + } + qDebug() << " "; + qDebug() << "JavaScript Messages:" << m_client->javascriptMessages.count(); + i = 0; + foreach (const QQmlProfilerData &data, m_client->javascriptMessages) { qDebug() << i++ << data.time << data.messageType << data.detailType << data.detailData << data.line << data.column; } @@ -534,22 +540,22 @@ void tst_QQmlProfilerService::signalSourceLocation() m_client->setTraceState(false); checkTraceReceived(); - QVERIFY2(m_client->synchronousMessages.count() >= 20, - QString::number(m_client->synchronousMessages.count()).toUtf8().constData()); - - QCOMPARE(m_client->synchronousMessages[14].messageType, (int)QQmlProfilerClient::RangeLocation); - QCOMPARE(m_client->synchronousMessages[14].detailType, (int)QQmlProfilerClient::HandlingSignal); - QVERIFY2(m_client->synchronousMessages[14].detailData.endsWith("signalSourceLocation.qml"), - m_client->synchronousMessages[14].detailData.toUtf8().constData()); - QCOMPARE(m_client->synchronousMessages[14].line, 8); - QCOMPARE(m_client->synchronousMessages[14].column, 28); - - QCOMPARE(m_client->synchronousMessages[19].messageType, (int)QQmlProfilerClient::RangeLocation); - QCOMPARE(m_client->synchronousMessages[19].detailType, (int)QQmlProfilerClient::HandlingSignal); - QVERIFY2(m_client->synchronousMessages[19].detailData.endsWith("signalSourceLocation.qml"), - m_client->synchronousMessages[19].detailData.toUtf8().constData()); - QCOMPARE(m_client->synchronousMessages[19].line, 7); - QCOMPARE(m_client->synchronousMessages[19].column, 21); + QVERIFY2(m_client->qmlMessages.count() >= 16, + QString::number(m_client->qmlMessages.count()).toUtf8().constData()); + + QCOMPARE(m_client->qmlMessages[13].messageType, (int)QQmlProfilerClient::RangeLocation); + QCOMPARE(m_client->qmlMessages[13].detailType, (int)QQmlProfilerClient::HandlingSignal); + QVERIFY2(m_client->qmlMessages[13].detailData.endsWith("signalSourceLocation.qml"), + m_client->qmlMessages[13].detailData.toUtf8().constData()); + QCOMPARE(m_client->qmlMessages[13].line, 8); + QCOMPARE(m_client->qmlMessages[13].column, 28); + + QCOMPARE(m_client->qmlMessages[15].messageType, (int)QQmlProfilerClient::RangeLocation); + QCOMPARE(m_client->qmlMessages[15].detailType, (int)QQmlProfilerClient::HandlingSignal); + QVERIFY2(m_client->qmlMessages[15].detailData.endsWith("signalSourceLocation.qml"), + m_client->qmlMessages[15].detailData.toUtf8().constData()); + QCOMPARE(m_client->qmlMessages[15].line, 7); + QCOMPARE(m_client->qmlMessages[15].column, 21); } void tst_QQmlProfilerService::javascript() @@ -564,26 +570,26 @@ void tst_QQmlProfilerService::javascript() m_client->setTraceState(false); checkTraceReceived(); - QVERIFY2(m_client->synchronousMessages.count() >= 36, - QString::number(m_client->synchronousMessages.count()).toUtf8().constData()); + QVERIFY2(m_client->javascriptMessages.count() >= 22, + QString::number(m_client->javascriptMessages.count()).toUtf8().constData()); - QCOMPARE(m_client->synchronousMessages[32].messageType, (int)QQmlProfilerClient::RangeStart); - QCOMPARE(m_client->synchronousMessages[32].detailType, (int)QQmlProfilerClient::Javascript); + QCOMPARE(m_client->javascriptMessages[6].messageType, (int)QQmlProfilerClient::RangeStart); + QCOMPARE(m_client->javascriptMessages[6].detailType, (int)QQmlProfilerClient::Javascript); - QCOMPARE(m_client->synchronousMessages[33].messageType, (int)QQmlProfilerClient::RangeLocation); - QCOMPARE(m_client->synchronousMessages[33].detailType, (int)QQmlProfilerClient::Javascript); - QVERIFY2(m_client->synchronousMessages[33].detailData.endsWith("javascript.qml"), - m_client->synchronousMessages[33].detailData.toUtf8().constData()); - QCOMPARE(m_client->synchronousMessages[33].line, 4); - QCOMPARE(m_client->synchronousMessages[33].column, 5); + QCOMPARE(m_client->javascriptMessages[7].messageType, (int)QQmlProfilerClient::RangeLocation); + QCOMPARE(m_client->javascriptMessages[7].detailType, (int)QQmlProfilerClient::Javascript); + QVERIFY2(m_client->javascriptMessages[7].detailData.endsWith("javascript.qml"), + m_client->javascriptMessages[7].detailData.toUtf8().constData()); + QCOMPARE(m_client->javascriptMessages[7].line, 4); + QCOMPARE(m_client->javascriptMessages[7].column, 5); - QCOMPARE(m_client->synchronousMessages[34].messageType, (int)QQmlProfilerClient::RangeData); - QCOMPARE(m_client->synchronousMessages[34].detailType, (int)QQmlProfilerClient::Javascript); - QVERIFY2(m_client->synchronousMessages[34].detailData == "something", - m_client->synchronousMessages[34].detailData.toUtf8().constData()); + QCOMPARE(m_client->javascriptMessages[8].messageType, (int)QQmlProfilerClient::RangeData); + QCOMPARE(m_client->javascriptMessages[8].detailType, (int)QQmlProfilerClient::Javascript); + QVERIFY2(m_client->javascriptMessages[8].detailData == "something", + m_client->javascriptMessages[8].detailData.toUtf8().constData()); - QCOMPARE(m_client->synchronousMessages[35].messageType, (int)QQmlProfilerClient::RangeEnd); - QCOMPARE(m_client->synchronousMessages[35].detailType, (int)QQmlProfilerClient::Javascript); + QCOMPARE(m_client->javascriptMessages[21].messageType, (int)QQmlProfilerClient::RangeEnd); + QCOMPARE(m_client->javascriptMessages[21].detailType, (int)QQmlProfilerClient::Javascript); } QTEST_MAIN(tst_QQmlProfilerService) diff --git a/tests/auto/quick/scenegraph/data/render_OpacityThroughBatchRoot.qml b/tests/auto/quick/scenegraph/data/render_OpacityThroughBatchRoot.qml new file mode 100644 index 0000000000..ed55a98979 --- /dev/null +++ b/tests/auto/quick/scenegraph/data/render_OpacityThroughBatchRoot.qml @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite 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$ +** +****************************************************************************/ + +import QtQuick 2.2 + +/* + This test verifies that when we have an update to opacity above + a batch root, the opacity of the batch root's children is rendered + correctly. The Text element has 1000 glyphs in it, which is needed + for contentRoot to become a batch root when the scale changes. + + #samples: 2 + PixelPos R G B Error-tolerance + #base: 50 50 0.0 0.0 1.0 0.0 + #final: 50 50 0.5 0.5 1.0 0.05 +*/ + +RenderTestBase { + id: root + + Item { + id: failRoot; + property alias itemScale: contentItem.scale + + Item { + id: contentItem + width: 100 + height: 100 + Rectangle { + width: 100 + height: 100 + color: "blue" + Text { + id: input + color: "black" + Component.onCompleted: { for (var i = 0; i<1000; ++i) input.text += 'x' } + } + } + } + } + + SequentialAnimation { + id: unifiedAnimation; + NumberAnimation { properties: "opacity,itemScale"; duration: 256; from: 1; to: 0.5; target: failRoot } + ScriptAction { script: root.finalStageComplete = true; } + } + + onEnterFinalStage: { + unifiedAnimation.running = true; + } + +} diff --git a/tests/auto/quick/scenegraph/tst_scenegraph.cpp b/tests/auto/quick/scenegraph/tst_scenegraph.cpp index ac4938e8bc..d510fdcda8 100644 --- a/tests/auto/quick/scenegraph/tst_scenegraph.cpp +++ b/tests/auto/quick/scenegraph/tst_scenegraph.cpp @@ -43,7 +43,7 @@ #include <QtQuick> -#include <private/qsgcontext_p.h> +#include <private/qopenglcontext_p.h> #include <QtQml> @@ -168,7 +168,7 @@ void tst_SceneGraph::manyWindows_data() struct ShareContextResetter { public: - ~ShareContextResetter() { QSGContext::setSharedOpenGLContext(0); } + ~ShareContextResetter() { QOpenGLContextPrivate::setGlobalShareContext(0); } }; void tst_SceneGraph::manyWindows() @@ -181,7 +181,7 @@ void tst_SceneGraph::manyWindows() ShareContextResetter cleanup; // To avoid dangling pointer in case of test-failure. if (shared) { sharedGLContext.create(); - QSGContext::setSharedOpenGLContext(&sharedGLContext); + QOpenGLContextPrivate::setGlobalShareContext(&sharedGLContext); } QScopedPointer<QWindow> parent; @@ -328,7 +328,8 @@ void tst_SceneGraph::render_data() << "data/render_StackingOrder.qml" << "data/render_Mipmap.qml" << "data/render_ImageFiltering.qml" - << "data/render_bug37555.qml" + << "data/render_bug37422.qml" + << "data/render_OpacityThroughBatchRoot.qml" ; QRegExp sampleCount("#samples: *(\\d+)"); |