diff options
author | Wieland Hagen <wieland.hagen@kdab.com> | 2016-01-22 18:26:42 +0100 |
---|---|---|
committer | Wieland Hagen <wieland.hagen@kdab.com> | 2016-02-05 16:08:55 +0000 |
commit | f4d0f45cc9a054735cd867a71d30b1d23147a409 (patch) | |
tree | 142ab9fb76609185342bfffeb72afd990c5fbacd | |
parent | 5757b17a7535ca2a97f78463e4798242a5dcb508 (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.cpp | 4 | ||||
-rw-r--r-- | src/render/framegraph/statesetnode.cpp | 16 | ||||
-rw-r--r-- | src/render/framegraph/statesetnode_p.h | 10 | ||||
-rw-r--r-- | src/render/jobs/renderviewjobutils.cpp | 7 | ||||
-rw-r--r-- | src/render/jobs/renderviewjobutils_p.h | 3 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass.cpp | 17 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass_p.h | 8 | ||||
-rw-r--r-- | src/render/renderstates/renderstatecollection.cpp | 96 | ||||
-rw-r--r-- | src/render/renderstates/renderstatecollection_p.h | 89 | ||||
-rw-r--r-- | src/render/renderstates/renderstates.pri | 6 | ||||
-rw-r--r-- | tests/auto/render/renderpass/tst_renderpass.cpp | 147 |
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) |