aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/nodes
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-08-14 07:27:07 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-02 14:24:36 +0200
commitb480fa83a632b2ae5606e2870b47358328b479a2 (patch)
treebdd3e1b68a5a15a3950e13a50db911a93cdf279a /tests/auto/quick/nodes
parent9be35c270082d1614886874e17cc3f90a7a3f489 (diff)
New scenegraph renderer and atlas textures.
The renderer tries to batch primitives together where possible, isolate non-changing subparts of the scene from changing subparts and retain vertexdata on the GPU as much as possible. Atlas textures are crucial in enabling batching. The renderer and atlas texture are described in detail in the doc page "Qt Quick Scene Graph Renderer". Change-Id: Ia476c7f0f42e1fc57a2cef528e93ee88cf8f7055 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'tests/auto/quick/nodes')
-rw-r--r--tests/auto/quick/nodes/nodes.pro2
-rw-r--r--tests/auto/quick/nodes/tst_nodestest.cpp157
2 files changed, 30 insertions, 129 deletions
diff --git a/tests/auto/quick/nodes/nodes.pro b/tests/auto/quick/nodes/nodes.pro
index 2e3a4455ea..256318a441 100644
--- a/tests/auto/quick/nodes/nodes.pro
+++ b/tests/auto/quick/nodes/nodes.pro
@@ -6,5 +6,5 @@ SOURCES += tst_nodestest.cpp
CONFIG+=parallel_test
-QT += core-private gui-private qml-private quick-private opengl widgets testlib
+QT += core-private gui-private qml-private quick-private testlib
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/quick/nodes/tst_nodestest.cpp b/tests/auto/quick/nodes/tst_nodestest.cpp
index a8094002dd..3ba7771538 100644
--- a/tests/auto/quick/nodes/tst_nodestest.cpp
+++ b/tests/auto/quick/nodes/tst_nodestest.cpp
@@ -42,12 +42,15 @@
#include <QtCore/QString>
#include <QtTest/QtTest>
+#include <QtGui/QOffscreenSurface>
+#include <QtGui/QOpenGLContext>
+
#include <QtQuick/qsgnode.h>
-#include <QtQuick/private/qsgrenderer_p.h>
+#include <QtQuick/private/qsgbatchrenderer_p.h>
#include <QtQuick/private/qsgnodeupdater_p.h>
#include <QtQuick/qsgsimplerectnode.h>
-#include <QtOpenGL/QGLWidget>
+
class NodesTest : public QObject
{
Q_OBJECT
@@ -57,41 +60,45 @@ public:
private Q_SLOTS:
void initTestCase();
- void cleanupTestCase() {
- delete widget;
- }
+ void cleanupTestCase();
// Root nodes
void propegate();
void propegateWithMultipleRoots();
- void simulatedEffect_data();
- void simulatedEffect();
// Opacity nodes
void basicOpacityNode();
void opacityPropegation();
- // QSGNodeUpdater
void isBlockedCheck();
private:
- QGLWidget *widget;
-
- QSGNodeUpdater updater;
+ QOffscreenSurface *surface;
+ QOpenGLContext *context;
};
void NodesTest::initTestCase()
{
- widget = new QGLWidget();
- widget->resize(100, 30);
- widget->show();
+ surface = new QOffscreenSurface;
+ surface->create();
+
+ context = new QOpenGLContext();
+ context->create();
+ context->makeCurrent(surface);
}
-class DummyRenderer : public QSGRenderer
+void NodesTest::cleanupTestCase()
+{
+ context->doneCurrent();
+ delete context;
+ delete surface;
+}
+
+class DummyRenderer : public QSGBatchRenderer::Renderer
{
public:
DummyRenderer(QSGRootNode *root)
- : QSGRenderer(QSGContext::createDefaultContext())
+ : QSGBatchRenderer::Renderer(QSGContext::createDefaultContext())
, changedNode(0)
, changedState(0)
, renderCount(0)
@@ -107,7 +114,7 @@ public:
void nodeChanged(QSGNode *node, QSGNode::DirtyState state) {
changedNode = node;
changedState = state;
- QSGRenderer::nodeChanged(node, state);
+ QSGBatchRenderer::Renderer::nodeChanged(node, state);
}
QSGNode *changedNode;
@@ -163,114 +170,6 @@ void NodesTest::propegateWithMultipleRoots()
QCOMPARE((int) ren2.changedState, (int) QSGNode::DirtyGeometry);
}
-
-
-class SimulatedEffectRenderer : public DummyRenderer
-{
-public:
- SimulatedEffectRenderer(QSGRootNode *root, QSGBasicGeometryNode *c)
- : DummyRenderer(root)
- {
- child = c;
- }
-
- void render() {
- matrix = child->matrix() ? *child->matrix() : QMatrix4x4();
- DummyRenderer::render();
- }
-
- QSGBasicGeometryNode *child;
- QMatrix4x4 matrix;
-};
-
-
-class PseudoEffectNode : public QSGNode {
-public:
- PseudoEffectNode(QSGRenderer *r)
- : renderer(r)
- {
- setFlag(UsePreprocess);
- }
-
- void preprocess() {
-
- if (renderer->rootNode()->parent()) {
- // Mark the root dirty to build a clean state from the root and down
- renderer->rootNode()->markDirty(QSGNode::DirtyForceUpdate);
- }
-
- renderer->renderScene();
-
- if (renderer->rootNode()->parent()) {
- // Mark the parent of the root dirty to force the root and down to be updated.
- renderer->rootNode()->parent()->markDirty(QSGNode::DirtyForceUpdate);
- }
- }
-
- QSGRenderer *renderer;
-};
-
-void NodesTest::simulatedEffect_data()
-{
- QTest::addColumn<bool>("connected");
-
- QTest::newRow("connected") << true;
- QTest::newRow("disconnected") << false;
-}
-
-void NodesTest::simulatedEffect()
-{
- QFETCH(bool, connected);
-
- QSGRootNode root;
- QSGRootNode source;
- QSGTransformNode xform;
- QSGSimpleRectNode geometry;
- geometry.setRect(QRectF(0, 0, 1, 1));
- geometry.setColor(Qt::red);
-
- root.setFlag(QSGNode::OwnedByParent, false);
- source.setFlag(QSGNode::OwnedByParent, false);
- xform.setFlag(QSGNode::OwnedByParent, false);
- geometry.setFlag(QSGNode::OwnedByParent, false);
-
- SimulatedEffectRenderer rootRenderer(&root, &geometry);
- SimulatedEffectRenderer sourceRenderer(&source, &geometry);
-
- PseudoEffectNode effect(&sourceRenderer);
-
- /*
- root Source is redirected into effect using the SimulatedEffectRenderer
- / \
- xform effect
- |
- source
- |
- geometry
- */
-
- root.appendChildNode(&xform);
- root.appendChildNode(&effect);
- if (connected)
- xform.appendChildNode(&source);
- source.appendChildNode(&geometry);
- QMatrix4x4 m; m.translate(1, 2, 3);
- xform.setMatrix(m);
-
- // Clear all dirty states...
- updater.updateStates(&root);
-
- rootRenderer.renderScene();
-
- // compare that we got one render call to each
- QCOMPARE(rootRenderer.renderCount, 1);
- QCOMPARE(sourceRenderer.renderCount, 1);
- QVERIFY(sourceRenderer.renderingOrder < rootRenderer.renderingOrder);
- if (connected) // geometry is not rendered in this case, so skip it...
- QCOMPARE(rootRenderer.matrix, xform.matrix());
- QCOMPARE(sourceRenderer.matrix, QMatrix4x4());
-}
-
void NodesTest::basicOpacityNode()
{
QSGOpacityNode n;
@@ -296,6 +195,8 @@ void NodesTest::opacityPropegation()
QSGSimpleRectNode *geometry = new QSGSimpleRectNode;
geometry->setRect(0, 0, 100, 100);
+ DummyRenderer renderer(&root);
+
root.appendChildNode(a);
a->appendChildNode(b);
b->appendChildNode(c);
@@ -305,7 +206,7 @@ void NodesTest::opacityPropegation()
b->setOpacity(0.8);
c->setOpacity(0.7);
- updater.updateStates(&root);
+ renderer.renderScene();
QCOMPARE(a->combinedOpacity(), 0.9);
QCOMPARE(b->combinedOpacity(), 0.9 * 0.8);
@@ -313,7 +214,7 @@ void NodesTest::opacityPropegation()
QCOMPARE(geometry->inheritedOpacity(), 0.9 * 0.8 * 0.7);
b->setOpacity(0.1);
- updater.updateStates(&root);
+ renderer.renderScene();
QCOMPARE(a->combinedOpacity(), 0.9);
QCOMPARE(b->combinedOpacity(), 0.9 * 0.1);
@@ -321,7 +222,7 @@ void NodesTest::opacityPropegation()
QCOMPARE(geometry->inheritedOpacity(), 0.9 * 0.1 * 0.7);
b->setOpacity(0);
- updater.updateStates(&root);
+ renderer.renderScene();
QVERIFY(b->isSubtreeBlocked());