aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergio Ahumada <sahumada@blackberry.com>2014-06-11 10:03:38 +0200
committerSergio Ahumada <sahumada@blackberry.com>2014-06-11 10:03:38 +0200
commitb4247d7c79af564b1213a9de17ff306747e17caa (patch)
tree20d32303488bb4b957d3e8b1bc9815332409fd68
parentbcabc0ad3d25e78cd158a59fef4e894b3ec58b72 (diff)
parent906cf6ce32604dc71d3e5b33f2de2f0046e252ff (diff)
Merge remote-tracking branch 'origin/stable' into 5.3
-rw-r--r--examples/quick/quickwidgets/quickwidget/main.cpp6
-rw-r--r--src/3rdparty/masm/yarr/YarrJIT.cpp2
-rw-r--r--src/qml/doc/src/cppintegration/exposecppattributes.qdoc2
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp4
-rw-r--r--src/quick/scenegraph/qsgthreadedrenderloop.cpp2
-rw-r--r--src/quickwidgets/qquickwidget.cpp64
-rw-r--r--src/quickwidgets/qquickwidget_p.h2
-rw-r--r--tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp98
-rw-r--r--tests/auto/quick/scenegraph/data/render_OpacityThroughBatchRoot.qml90
-rw-r--r--tests/auto/quick/scenegraph/tst_scenegraph.cpp9
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+)");