summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWieland Hagen <wieland.hagen@kdab.com>2016-01-22 18:26:42 +0100
committerWieland Hagen <wieland.hagen@kdab.com>2016-02-05 16:08:55 +0000
commitf4d0f45cc9a054735cd867a71d30b1d23147a409 (patch)
tree142ab9fb76609185342bfffeb72afd990c5fbacd
parent5757b17a7535ca2a97f78463e4798242a5dcb508 (diff)
Cache RenderStateNodes, so we don't have to look them up every frame
Backend nodes for QRenderPass und QStateSet cache nodes, update only if necessary. Change-Id: Ib04ba9f1632ad531705f40886dcfc87979cf2a0e Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/renderview.cpp4
-rw-r--r--src/render/framegraph/statesetnode.cpp16
-rw-r--r--src/render/framegraph/statesetnode_p.h10
-rw-r--r--src/render/jobs/renderviewjobutils.cpp7
-rw-r--r--src/render/jobs/renderviewjobutils_p.h3
-rw-r--r--src/render/materialsystem/renderpass.cpp17
-rw-r--r--src/render/materialsystem/renderpass_p.h8
-rw-r--r--src/render/renderstates/renderstatecollection.cpp96
-rw-r--r--src/render/renderstates/renderstatecollection_p.h89
-rw-r--r--src/render/renderstates/renderstates.pri6
-rw-r--r--tests/auto/render/renderpass/tst_renderpass.cpp147
11 files changed, 220 insertions, 183 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 660ac68ea..89c322d1d 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -525,9 +525,9 @@ void RenderView::buildDrawRenderCommands(Entity *node, const Plane *planes)
// if no renderstates are defined as part of the pass. That means:
// RenderPass { renderStates: [] } will use the states defined by
// StateSet in the FrameGraph
- if (!pass->renderStates().isEmpty()) {
+ if (pass->hasRenderStates()) {
command->m_stateSet = m_allocator->allocate<RenderStateSet>();
- addToRenderStateSet(command->m_stateSet, pass->renderStates(), m_manager->renderStateManager());
+ addToRenderStateSet(command->m_stateSet, pass, m_manager->renderStateManager());
// Merge per pass stateset with global stateset
// so that the local stateset only overrides
diff --git a/src/render/framegraph/statesetnode.cpp b/src/render/framegraph/statesetnode.cpp
index e65d48843..4739c4a9a 100644
--- a/src/render/framegraph/statesetnode.cpp
+++ b/src/render/framegraph/statesetnode.cpp
@@ -69,11 +69,6 @@ void StateSetNode::updateFromPeer(Qt3DCore::QNode *peer)
appendRenderState(renderState->id());
}
-QList<Qt3DCore::QNodeId> StateSetNode::renderStates() const
-{
- return m_renderStates;
-}
-
void StateSetNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e);
@@ -97,17 +92,6 @@ void StateSetNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
}
}
-void StateSetNode::appendRenderState(const Qt3DCore::QNodeId &id)
-{
- if (!m_renderStates.contains(id))
- m_renderStates.append(id);
-}
-
-void StateSetNode::removeRenderState(const Qt3DCore::QNodeId &renderStateId)
-{
- m_renderStates.removeAll(renderStateId);
-}
-
} // namespace Render
} // namespace Qt3DRender
diff --git a/src/render/framegraph/statesetnode_p.h b/src/render/framegraph/statesetnode_p.h
index aa402e430..87d100d6c 100644
--- a/src/render/framegraph/statesetnode_p.h
+++ b/src/render/framegraph/statesetnode_p.h
@@ -52,6 +52,7 @@
//
#include <Qt3DRender/private/framegraphnode_p.h>
+#include <Qt3DRender/private/renderstatecollection_p.h>
QT_BEGIN_NAMESPACE
@@ -59,7 +60,7 @@ namespace Qt3DRender {
namespace Render {
-class StateSetNode : public FrameGraphNode
+class StateSetNode : public FrameGraphNode, public RenderStateCollection
{
public:
StateSetNode();
@@ -67,15 +68,8 @@ public:
void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_OVERRIDE;
- QList<Qt3DCore::QNodeId> renderStates() const;
-
protected:
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
-
- void appendRenderState(const Qt3DCore::QNodeId &id);
- void removeRenderState(const Qt3DCore::QNodeId &renderStateId);
-
- QList<Qt3DCore::QNodeId> m_renderStates;
};
} // namespace Render
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index 23c4ed57b..8ac832e0c 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -194,7 +194,7 @@ void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphN
rv->setStateSet(stateSet);
}
- addToRenderStateSet(stateSet, rStateSet->renderStates(), manager->renderStateManager());
+ addToRenderStateSet(stateSet, rStateSet, manager->renderStateManager());
break;
}
@@ -394,11 +394,10 @@ void parametersFromMaterialEffectTechnique(ParameterInfoList *infoList,
}
void addToRenderStateSet(RenderStateSet *stateSet,
- const QList<Qt3DCore::QNodeId> &nodeIds,
+ const RenderStateCollection *collection,
RenderStateManager *manager)
{
- Q_FOREACH (Qt3DCore::QNodeId renderStateId, nodeIds) {
- RenderStateNode *rstate = manager->lookupResource(renderStateId);
+ Q_FOREACH (RenderStateNode *rstate, collection->renderStates(manager)) {
stateSet->addState(rstate->impl());
}
}
diff --git a/src/render/jobs/renderviewjobutils_p.h b/src/render/jobs/renderviewjobutils_p.h
index ec52ae7cc..09f237c3c 100644
--- a/src/render/jobs/renderviewjobutils_p.h
+++ b/src/render/jobs/renderviewjobutils_p.h
@@ -80,6 +80,7 @@ class ShaderDataManager;
struct ShaderUniform;
class ShaderData;
class RenderStateManager;
+class RenderStateCollection;
Q_AUTOTEST_EXPORT void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv,
const FrameGraphNode *fgLeaf);
@@ -133,7 +134,7 @@ Q_AUTOTEST_EXPORT ParameterInfoList::iterator findParamInfo(ParameterInfoList *i
const QString &name);
Q_AUTOTEST_EXPORT void addToRenderStateSet(RenderStateSet *stateSet,
- const QList<Qt3DCore::QNodeId> &nodeIds,
+ const RenderStateCollection *collection,
RenderStateManager *manager);
diff --git a/src/render/materialsystem/renderpass.cpp b/src/render/materialsystem/renderpass.cpp
index 1afb1c214..91b6789a5 100644
--- a/src/render/materialsystem/renderpass.cpp
+++ b/src/render/materialsystem/renderpass.cpp
@@ -64,7 +64,6 @@ RenderPass::RenderPass()
RenderPass::~RenderPass()
{
- cleanup();
}
void RenderPass::cleanup()
@@ -147,11 +146,6 @@ QList<Qt3DCore::QNodeId> RenderPass::annotations() const
return m_annotationList;
}
-QList<Qt3DCore::QNodeId> RenderPass::renderStates() const
-{
- return m_renderStates;
-}
-
QList<Qt3DCore::QNodeId> RenderPass::parameters() const
{
return m_parameterPack.parameters();
@@ -179,17 +173,6 @@ void RenderPass::removeBinding(const Qt3DCore::QNodeId &bindingId)
m_bindings.remove(bindingId);
}
-void RenderPass::appendRenderState(const Qt3DCore::QNodeId &renderStateId)
-{
- if (!m_renderStates.contains(renderStateId))
- m_renderStates.append(renderStateId);
-}
-
-void RenderPass::removeRenderState(const Qt3DCore::QNodeId &renderStateId)
-{
- m_renderStates.removeAll(renderStateId);
-}
-
} // namespace Render
} // namespace Qt3DRender
diff --git a/src/render/materialsystem/renderpass_p.h b/src/render/materialsystem/renderpass_p.h
index b55cba35a..be038e97d 100644
--- a/src/render/materialsystem/renderpass_p.h
+++ b/src/render/materialsystem/renderpass_p.h
@@ -55,6 +55,7 @@
#include <Qt3DRender/qt3drender_global.h>
#include <Qt3DRender/private/parametermapping_p.h>
#include <Qt3DRender/private/parameterpack_p.h>
+#include <Qt3DRender/private/renderstatecollection_p.h>
#include <Qt3DCore/private/qabstractaspect_p.h>
#include <Qt3DCore/qbackendnode.h>
#include <Qt3DCore/qnodeid.h>
@@ -74,7 +75,7 @@ namespace Render {
class RenderPassManager;
class RenderState;
-class Q_AUTOTEST_EXPORT RenderPass : public Qt3DCore::QBackendNode
+class Q_AUTOTEST_EXPORT RenderPass : public Qt3DCore::QBackendNode, public RenderStateCollection
{
public:
RenderPass();
@@ -88,7 +89,6 @@ public:
Qt3DCore::QNodeId shaderProgram() const;
QList<ParameterMapping> bindings() const;
QList<Qt3DCore::QNodeId> annotations() const;
- QList<Qt3DCore::QNodeId> renderStates() const;
QList<Qt3DCore::QNodeId> parameters() const;
private:
@@ -98,12 +98,8 @@ private:
void appendBinding(const ParameterMapping &binding);
void removeBinding(const Qt3DCore::QNodeId &bindingId);
- void appendRenderState(const Qt3DCore::QNodeId &renderStateId);
- void removeRenderState(const Qt3DCore::QNodeId &renderStateId);
-
Qt3DCore::QNodeId m_shaderUuid;
QHash<Qt3DCore::QNodeId, ParameterMapping> m_bindings;
- QList<Qt3DCore::QNodeId> m_renderStates;
QList<Qt3DCore::QNodeId> m_annotationList;
ParameterPack m_parameterPack;
};
diff --git a/src/render/renderstates/renderstatecollection.cpp b/src/render/renderstates/renderstatecollection.cpp
new file mode 100644
index 000000000..34c11a539
--- /dev/null
+++ b/src/render/renderstates/renderstatecollection.cpp
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://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.LGPLv3 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.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 later 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 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DRender/private/renderstatecollection_p.h"
+#include <Qt3DRender/private/renderstates_p.h>
+#include <Qt3DRender/private/managers_p.h>
+
+#include <Qt3DRender/qrenderstate.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+namespace Render {
+
+RenderStateCollection::RenderStateCollection()
+ : m_dirty(false)
+{
+}
+
+RenderStateCollection::~RenderStateCollection()
+{
+}
+
+QList<RenderStateNode*> RenderStateCollection::renderStates(RenderStateManager *manager) const
+{
+ if (m_dirty) {
+ m_renderStateNodes.clear();
+
+ Q_FOREACH (Qt3DCore::QNodeId id, m_renderStateIds) {
+ RenderStateNode *node = manager->lookupResource(id);
+ m_renderStateNodes.append(node);
+ }
+
+ m_dirty = false;
+ }
+
+ return m_renderStateNodes;
+}
+
+bool RenderStateCollection::hasRenderStates() const
+{
+ return !m_renderStateIds.empty();
+}
+
+void RenderStateCollection::appendRenderState(const Qt3DCore::QNodeId &renderStateId)
+{
+ if (!m_renderStateIds.contains(renderStateId)) {
+ m_renderStateIds.append(renderStateId);
+ m_dirty = true;
+ }
+}
+
+void RenderStateCollection::removeRenderState(const Qt3DCore::QNodeId &renderStateId)
+{
+ if (m_renderStateIds.removeAll(renderStateId) > 0) {
+ m_dirty = true;
+ }
+
+}
+
+} // namespace Render
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
diff --git a/src/render/renderstates/renderstatecollection_p.h b/src/render/renderstates/renderstatecollection_p.h
new file mode 100644
index 000000000..9a40517e6
--- /dev/null
+++ b/src/render/renderstates/renderstatecollection_p.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://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.LGPLv3 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.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 later 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 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DRENDER_RENDER_RENDERSTATECOLLECTION_H
+#define QT3DRENDER_RENDER_RENDERSTATECOLLECTION_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <Qt3DRender/private/genericstate_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+
+class QRenderState;
+
+namespace Render {
+
+class RenderStateManager;
+
+class Q_AUTOTEST_EXPORT RenderStateCollection
+{
+public:
+ RenderStateCollection();
+ ~RenderStateCollection();
+
+ QList<RenderStateNode*> renderStates(RenderStateManager *manager) const;
+ bool hasRenderStates() const;
+
+protected:
+ void appendRenderState(const Qt3DCore::QNodeId &renderStateId);
+ void removeRenderState(const Qt3DCore::QNodeId &renderStateId);
+
+private:
+ QList<Qt3DCore::QNodeId> m_renderStateIds;
+ mutable QList<RenderStateNode*> m_renderStateNodes;
+ mutable bool m_dirty;
+};
+
+} // namespace Render
+
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_RENDER_RENDERSTATECOLLECTION_H
+
diff --git a/src/render/renderstates/renderstates.pri b/src/render/renderstates/renderstates.pri
index 554a0e666..440e7c411 100644
--- a/src/render/renderstates/renderstates.pri
+++ b/src/render/renderstates/renderstates.pri
@@ -24,7 +24,8 @@ HEADERS += \
$$PWD/qstenciltestseparate.h \
$$PWD/renderstates_p.h \
$$PWD/renderstateset_p.h \
- $$PWD/qpointsize.h
+ $$PWD/qpointsize.h \
+ $$PWD/renderstatecollection_p.h
SOURCES += \
@@ -49,4 +50,5 @@ SOURCES += \
$$PWD/qstenciltestseparate.cpp \
$$PWD/renderstates.cpp \
$$PWD/renderstateset.cpp \
- $$PWD/qpointsize.cpp
+ $$PWD/qpointsize.cpp \
+ $$PWD/renderstatecollection.cpp
diff --git a/tests/auto/render/renderpass/tst_renderpass.cpp b/tests/auto/render/renderpass/tst_renderpass.cpp
index 12e65ec4b..eea26fcd7 100644
--- a/tests/auto/render/renderpass/tst_renderpass.cpp
+++ b/tests/auto/render/renderpass/tst_renderpass.cpp
@@ -57,18 +57,20 @@
#include <Qt3DRender/QClipPlane>
#include <Qt3DRender/private/renderstates_p.h>
+#include <Qt3DRender/private/managers_p.h>
using namespace Qt3DCore;
using namespace Qt3DRender;
using namespace Qt3DRender::Render;
-Q_DECLARE_METATYPE(RenderState*)
-
class tst_RenderRenderPass : public QObject
{
Q_OBJECT
public:
- tst_RenderRenderPass() {}
+ tst_RenderRenderPass()
+ : m_renderStateManager(new RenderStateManager())
+ {
+ }
~tst_RenderRenderPass() {}
private slots:
@@ -81,118 +83,10 @@ private slots:
QVERIFY(backend.shaderProgram().isNull());
QVERIFY(backend.annotations().isEmpty());
QVERIFY(backend.bindings().isEmpty());
- QVERIFY(backend.renderStates().isEmpty());
+ QVERIFY(backend.renderStates(m_renderStateManager).isEmpty());
QVERIFY(backend.parameters().isEmpty());
}
- void shouldHavePropertiesMirroringItsPeer_data()
- {
- QTest::addColumn<QRenderState*>("frontendState");
- QTest::addColumn<RenderState*>("backendState");
-
- QRenderState *frontendState = Q_NULLPTR;
- RenderState *backendState = Q_NULLPTR;
-
- QAlphaCoverage *alphaCoverage = new QAlphaCoverage;
- frontendState = alphaCoverage;
- backendState = AlphaCoverage::getOrCreate();
- QTest::newRow("alphacoverage") << frontendState << backendState;
-
- QAlphaTest *alphaTest = new QAlphaTest;
- frontendState = alphaTest;
- backendState = AlphaFunc::getOrCreate(alphaTest->func(), alphaTest->clamp());
- QTest::newRow("alphatest") << frontendState << backendState;
-
- QBlendEquation *blendEquation = new QBlendEquation;
- frontendState = blendEquation;
- backendState = BlendEquation::getOrCreate(blendEquation->mode());
- QTest::newRow("blendequation") << frontendState << backendState;
-
- QBlendState *blendState = new QBlendState;
- frontendState = blendState;
- backendState = BlendState::getOrCreate(blendState->srcRGB(), blendState->dstRGB(),
- blendState->srcRGB(), blendState->dstRGB(),
- blendState->enabled(), blendState->bufferIndex());
- QTest::newRow("blendstate") << frontendState << backendState;
-
- QColorMask *colorMask = new QColorMask;
- frontendState = colorMask;
- backendState = ColorMask::getOrCreate(colorMask->isRed(),
- colorMask->isGreen(),
- colorMask->isBlue(),
- colorMask->isAlpha());
- QTest::newRow("colormask") << frontendState << backendState;
-
- QCullFace *cullFace = new QCullFace;
- frontendState = cullFace;
- backendState = CullFace::getOrCreate(cullFace->mode());
- QTest::newRow("cullface") << frontendState << backendState;
-
- QDepthMask *depthMask = new QDepthMask;
- frontendState = depthMask;
- backendState = DepthMask::getOrCreate(depthMask->mask());
- QTest::newRow("depthmask") << frontendState << backendState;
-
- QDepthTest *depthTest = new QDepthTest;
- frontendState = depthTest;
- backendState = DepthTest::getOrCreate(depthTest->func());
- QTest::newRow("depthtest") << frontendState << backendState;
-
- QDithering *dithering = new QDithering;
- frontendState = dithering;
- backendState = Dithering::getOrCreate();
- QTest::newRow("dithering") << frontendState << backendState;
-
- QFrontFace *frontFace = new QFrontFace;
- frontendState = frontFace;
- backendState = FrontFace::getOrCreate(frontFace->direction());
- QTest::newRow("frontface") << frontendState << backendState;
-
- QPolygonOffset *polygonOffset = new QPolygonOffset;
- frontendState = polygonOffset;
- backendState = PolygonOffset::getOrCreate(polygonOffset->factor(),
- polygonOffset->units());
- QTest::newRow("polygonoffset") << frontendState << backendState;
-
- QScissorTest *scissorTest = new QScissorTest;
- frontendState = scissorTest;
- backendState = ScissorTest::getOrCreate(scissorTest->left(),
- scissorTest->bottom(),
- scissorTest->width(),
- scissorTest->height());
- QTest::newRow("scissortest") << frontendState << backendState;
-
- QStencilTest *stencilTest = new QStencilTest;
- frontendState = stencilTest;
- backendState = StencilTest::getOrCreate(stencilTest->front()->func(),
- stencilTest->front()->ref(),
- stencilTest->front()->mask(),
- stencilTest->back()->func(),
- stencilTest->back()->ref(),
- stencilTest->back()->mask());
- QTest::newRow("stenciltest") << frontendState << backendState;
-
- QStencilMask *stencilMask = new QStencilMask;
- frontendState = stencilMask;
- backendState = StencilMask::getOrCreate(stencilMask->frontMask(), stencilMask->backMask());
-
- QTest::newRow("stencilmask") << frontendState << backendState;
-
- QStencilOp *stencilOp = new QStencilOp;
- frontendState = stencilOp;
- backendState = StencilOp::getOrCreate(stencilOp->front()->stencilFail(),
- stencilOp->front()->depthFail(),
- stencilOp->front()->stencilDepthPass(),
- stencilOp->back()->stencilFail(),
- stencilOp->back()->depthFail(),
- stencilOp->back()->stencilDepthPass());
- QTest::newRow("stencilop") << frontendState << backendState;
-
- QClipPlane *clipPlane = new QClipPlane;
- frontendState = clipPlane;
- backendState = ClipPlane::getOrCreate(clipPlane->plane());
- }
-
void shouldHavePropertiesMirroringItsPeer()
{
// GIVEN
@@ -205,13 +99,14 @@ private slots:
frontend.addParameter(new QParameter(&frontend));
- QFETCH(QRenderState*, frontendState);
+ QRenderState *frontendState = new QBlendState();
frontendState->setParent(&frontend);
frontend.addRenderState(frontendState);
RenderPass backend;
- QFETCH(RenderState*, backendState);
+ RenderStateNode *backendState = m_renderStateManager->getOrCreateResource(frontendState->id());
+ backendState->setPeer(frontendState);
// WHEN
backend.setPeer(&frontend);
@@ -231,8 +126,8 @@ private slots:
QCOMPARE(backend.parameters().size(), 1);
QCOMPARE(backend.parameters().first(), frontend.parameters().first()->id());
- QCOMPARE(backend.renderStates().size(), 1);
- QCOMPARE(backend.renderStates().first(), backendState);
+ QCOMPARE(backend.renderStates(m_renderStateManager).size(), 1);
+ QCOMPARE(backend.renderStates(m_renderStateManager).first(), backendState);
}
void shouldHandleShaderPropertyChangeEvents()
@@ -345,20 +240,15 @@ private slots:
QVERIFY(backend.parameters().isEmpty());
}
- void shouldHandlePropertyChangeEvents_data()
- {
- shouldHavePropertiesMirroringItsPeer_data();
- }
-
void shouldHandlePropertyChangeEvents()
{
- // GIVEN
- QFETCH(QRenderState*, frontendState);
+ QRenderState *frontendState = new QBlendState();
QNodePtr frontendStatePtr(frontendState);
RenderPass backend;
- QFETCH(RenderState*, backendState);
+ RenderStateNode *backendState = m_renderStateManager->getOrCreateResource(frontendState->id());
+ backendState->setPeer(frontendState);
// WHEN
QScenePropertyChangePtr addChange(new QScenePropertyChange(NodeAdded, QSceneChange::Node, frontendState->id()));
@@ -367,8 +257,8 @@ private slots:
backend.sceneChangeEvent(addChange);
// THEN
- QCOMPARE(backend.renderStates().size(), 1);
- QCOMPARE(backend.renderStates().first(), backendState);
+ QCOMPARE(backend.renderStates(m_renderStateManager).size(), 1);
+ QCOMPARE(backend.renderStates(m_renderStateManager).first(), backendState);
// WHEN
QScenePropertyChangePtr removeChange(new QScenePropertyChange(NodeRemoved, QSceneChange::Node, frontendState->id()));
@@ -377,8 +267,11 @@ private slots:
backend.sceneChangeEvent(removeChange);
// THEN
- QVERIFY(backend.renderStates().isEmpty());
+ QVERIFY(backend.renderStates(m_renderStateManager).isEmpty());
}
+
+private:
+ RenderStateManager *m_renderStateManager;
};
QTEST_APPLESS_MAIN(tst_RenderRenderPass)