diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2015-02-02 12:07:50 +0100 |
---|---|---|
committer | Kevin Ottens <kevin.ottens@kdab.com> | 2015-02-03 10:12:25 +0000 |
commit | 10b58d98c459d654707d80c3400450a5bc07dfd4 (patch) | |
tree | 84f032dee1f6b1132d5b4c1ae13bf6978600a20d /src | |
parent | bb5041aa93682b10ff54f01915fe91a75673f4db (diff) |
Don't store QRenderState* in RenderRenderPass
RenderRenderPass is now storing pointers to backend objects as soon as
possible.
Change-Id: I6f8c4b92d18bcfe726df5731b978df0606a6a81c
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/backend/jobs/renderviewjobutils.cpp | 95 | ||||
-rw-r--r-- | src/render/backend/renderrenderpass.cpp | 99 | ||||
-rw-r--r-- | src/render/backend/renderrenderpass_p.h | 7 |
3 files changed, 99 insertions, 102 deletions
diff --git a/src/render/backend/jobs/renderviewjobutils.cpp b/src/render/backend/jobs/renderviewjobutils.cpp index f88144a1c..ea90cfa7d 100644 --- a/src/render/backend/jobs/renderviewjobutils.cpp +++ b/src/render/backend/jobs/renderviewjobutils.cpp @@ -41,20 +41,7 @@ #include "renderviewjobutils_p.h" -#include <Qt3DRenderer/qalphacoverage.h> -#include <Qt3DRenderer/qalphatest.h> -#include <Qt3DRenderer/qblendequation.h> -#include <Qt3DRenderer/qblendstate.h> -#include <Qt3DRenderer/qcolormask.h> -#include <Qt3DRenderer/qcullface.h> -#include <Qt3DRenderer/qdepthmask.h> -#include <Qt3DRenderer/qdepthtest.h> -#include <Qt3DRenderer/qdithering.h> -#include <Qt3DRenderer/qfrontface.h> #include <Qt3DRenderer/qopenglfilter.h> -#include <Qt3DRenderer/qpolygonoffset.h> -#include <Qt3DRenderer/qscissortest.h> -#include <Qt3DRenderer/qstenciltest.h> #include <Qt3DRenderer/sphere.h> #include <Qt3DRenderer/qshaderdata.h> @@ -71,9 +58,6 @@ #include <Qt3DRenderer/private/techniquefilternode_p.h> #include <Qt3DRenderer/private/viewportnode_p.h> -// TODO: Rename this include to something more descriptive -#include <Qt3DRenderer/private/blendstate_p.h> - QT_BEGIN_NAMESPACE namespace Qt3D { @@ -353,83 +337,8 @@ RenderStateSet *buildRenderStateSet(RenderRenderPass *pass, QFrameAllocator *all RenderStateSet *stateSet = allocator->allocate<RenderStateSet>(); - // TODO: Don't use QObject subclasses as backend storage - Q_FOREACH (QRenderState *renderState, pass->renderStates()) { - switch (renderState->type()) { - case QRenderState::AlphaTest: { - QAlphaTest *alphaTest = static_cast<QAlphaTest *>(renderState); - stateSet->addState(AlphaFunc::getOrCreate(alphaTest->func(), alphaTest->clamp())); - break; - } - case QRenderState::BlendEquation: { - QBlendEquation *blendEquation = static_cast<QBlendEquation *>(renderState); - stateSet->addState(BlendEquation::getOrCreate(blendEquation->mode())); - break; - } - case QRenderState::BlendState: { - QBlendState *blendState = static_cast<QBlendState *>(renderState); - // TO DO : Handle Alpha here as weel - stateSet->addState(BlendState::getOrCreate(blendState->srcRGB(), blendState->dstRGB())); - break; - } - case QRenderState::CullFace: { - QCullFace *cullFace = static_cast<QCullFace *>(renderState); - stateSet->addState(CullFace::getOrCreate(cullFace->mode())); - break; - } - case QRenderState::DepthMask: { - QDepthMask *depthMask = static_cast<QDepthMask *>(renderState); - stateSet->addState(DepthMask::getOrCreate(depthMask->mask())); - break; - } - case QRenderState::DepthTest: { - QDepthTest *depthTest = static_cast<QDepthTest *>(renderState); - stateSet->addState(DepthTest::getOrCreate(depthTest->func())); - break; - } - case QRenderState::Dithering: { - stateSet->addState(Dithering::getOrCreate()); - break; - } - case QRenderState::FrontFace: { - QFrontFace *frontFace = static_cast<QFrontFace *>(renderState); - stateSet->addState(FrontFace::getOrCreate(frontFace->direction())); - break; - } - case QRenderState::ScissorTest: { - QScissorTest *scissorTest = static_cast<QScissorTest *>(renderState); - stateSet->addState(ScissorTest::getOrCreate(scissorTest->left(), - scissorTest->bottom(), - scissorTest->width(), - scissorTest->height())); - break; - } - case QRenderState::StencilTest: { - QStencilTest *stencilTest = static_cast<QStencilTest *>(renderState); - stateSet->addState(StencilTest::getOrCreate(stencilTest->mask(), - stencilTest->func(), - stencilTest->faceMode())); - break; - } - case QRenderState::AlphaCoverage: { - stateSet->addState(AlphaCoverage::getOrCreate()); - break; - } - case QRenderState::PolygonOffset: { - QPolygonOffset *polygonOffset = static_cast<QPolygonOffset *>(renderState); - stateSet->addState(PolygonOffset::getOrCreate(polygonOffset->factor(), - polygonOffset->units())); - break; - } - case QRenderState::ColorMask: { - QColorMask *colorMask = static_cast<QColorMask *>(renderState); - stateSet->addState(ColorMask::getOrCreate(colorMask->isRed(), - colorMask->isGreen(), - colorMask->isBlue(), - colorMask->isAlpha())); - break; - } - } + Q_FOREACH (RenderState *renderState, pass->renderStates()) { + stateSet->addState(renderState); } return stateSet; diff --git a/src/render/backend/renderrenderpass.cpp b/src/render/backend/renderrenderpass.cpp index cf918a286..b538c95ac 100644 --- a/src/render/backend/renderrenderpass.cpp +++ b/src/render/backend/renderrenderpass.cpp @@ -46,6 +46,23 @@ #include <Qt3DRenderer/qrenderstate.h> #include <Qt3DRenderer/qrenderpass.h> +#include <Qt3DRenderer/qalphacoverage.h> +#include <Qt3DRenderer/qalphatest.h> +#include <Qt3DRenderer/qblendequation.h> +#include <Qt3DRenderer/qblendstate.h> +#include <Qt3DRenderer/qcolormask.h> +#include <Qt3DRenderer/qcullface.h> +#include <Qt3DRenderer/qdepthmask.h> +#include <Qt3DRenderer/qdepthtest.h> +#include <Qt3DRenderer/qdithering.h> +#include <Qt3DRenderer/qfrontface.h> +#include <Qt3DRenderer/qpolygonoffset.h> +#include <Qt3DRenderer/qscissortest.h> +#include <Qt3DRenderer/qstenciltest.h> + +// TODO: Rename this include to something more descriptive +#include <Qt3DRenderer/private/blendstate_p.h> + #include <Qt3DCore/qscenepropertychange.h> QT_BEGIN_NAMESPACE @@ -54,6 +71,75 @@ namespace Qt3D { namespace Render { +RenderState *getOrCreateBackendState(QRenderState *renderState) +{ + switch (renderState->type()) { + case QRenderState::AlphaTest: { + QAlphaTest *alphaTest = static_cast<QAlphaTest *>(renderState); + return AlphaFunc::getOrCreate(alphaTest->func(), alphaTest->clamp()); + } + case QRenderState::BlendEquation: { + QBlendEquation *blendEquation = static_cast<QBlendEquation *>(renderState); + return BlendEquation::getOrCreate(blendEquation->mode()); + } + case QRenderState::BlendState: { + QBlendState *blendState = static_cast<QBlendState *>(renderState); + // TO DO : Handle Alpha here as weel + return BlendState::getOrCreate(blendState->srcRGB(), blendState->dstRGB()); + } + case QRenderState::CullFace: { + QCullFace *cullFace = static_cast<QCullFace *>(renderState); + return CullFace::getOrCreate(cullFace->mode()); + } + case QRenderState::DepthMask: { + QDepthMask *depthMask = static_cast<QDepthMask *>(renderState); + return DepthMask::getOrCreate(depthMask->mask()); + } + case QRenderState::DepthTest: { + QDepthTest *depthTest = static_cast<QDepthTest *>(renderState); + return DepthTest::getOrCreate(depthTest->func()); + } + case QRenderState::Dithering: { + return Dithering::getOrCreate(); + } + case QRenderState::FrontFace: { + QFrontFace *frontFace = static_cast<QFrontFace *>(renderState); + return FrontFace::getOrCreate(frontFace->direction()); + } + case QRenderState::ScissorTest: { + QScissorTest *scissorTest = static_cast<QScissorTest *>(renderState); + return ScissorTest::getOrCreate(scissorTest->left(), + scissorTest->bottom(), + scissorTest->width(), + scissorTest->height()); + } + case QRenderState::StencilTest: { + QStencilTest *stencilTest = static_cast<QStencilTest *>(renderState); + return StencilTest::getOrCreate(stencilTest->mask(), + stencilTest->func(), + stencilTest->faceMode()); + } + case QRenderState::AlphaCoverage: { + return AlphaCoverage::getOrCreate(); + } + case QRenderState::PolygonOffset: { + QPolygonOffset *polygonOffset = static_cast<QPolygonOffset *>(renderState); + return PolygonOffset::getOrCreate(polygonOffset->factor(), + polygonOffset->units()); + } + case QRenderState::ColorMask: { + QColorMask *colorMask = static_cast<QColorMask *>(renderState); + return ColorMask::getOrCreate(colorMask->isRed(), + colorMask->isGreen(), + colorMask->isBlue(), + colorMask->isAlpha()); + } + default: + qFatal("Should not happen"); + return Q_NULLPTR; + } +} + RenderRenderPass::RenderRenderPass() : QBackendNode() { @@ -81,7 +167,7 @@ void RenderRenderPass::updateFromPeer(QNode *peer) Q_FOREACH (QAnnotation *c, pass->annotations()) appendAnnotation(c->id()); Q_FOREACH (QRenderState *renderState, pass->renderStates()) - appendRenderState(renderState); + appendRenderState(renderState->id(), getOrCreateBackendState(renderState)); } void RenderRenderPass::sceneChangeEvent(const QSceneChangePtr &e) @@ -100,7 +186,8 @@ void RenderRenderPass::sceneChangeEvent(const QSceneChangePtr &e) appendBinding(RenderParameterMapping(propertyChange->value().value<QParameterMapping *>())); } else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { - appendRenderState(propertyChange->value().value<QRenderState *>()); + QRenderState *renderState = propertyChange->value().value<QRenderState *>(); + appendRenderState(renderState->id(), getOrCreateBackendState(renderState)); } break; } @@ -141,7 +228,7 @@ QList<QNodeId> RenderRenderPass::annotations() const return m_annotationList; } -QList<QRenderState *> RenderRenderPass::renderStates() const +QList<RenderState *> RenderRenderPass::renderStates() const { return m_renderStates.values(); } @@ -168,10 +255,10 @@ void RenderRenderPass::removeBinding(const QNodeId &bindingId) m_bindings.remove(bindingId); } -void RenderRenderPass::appendRenderState(QRenderState *renderState) +void RenderRenderPass::appendRenderState(const QNodeId &id, RenderState *renderState) { - if (!m_renderStates.contains(renderState->id())) - m_renderStates[renderState->id()] = renderState; + if (!m_renderStates.contains(id)) + m_renderStates[id] = renderState; } void RenderRenderPass::removeRenderState(const QNodeId &renderStateId) diff --git a/src/render/backend/renderrenderpass_p.h b/src/render/backend/renderrenderpass_p.h index 6120e69c7..21f8b0ef3 100644 --- a/src/render/backend/renderrenderpass_p.h +++ b/src/render/backend/renderrenderpass_p.h @@ -62,6 +62,7 @@ class QRenderState; namespace Render { class RenderPassManager; +class RenderState; class Q_AUTOTEST_EXPORT RenderRenderPass : public QBackendNode { @@ -77,7 +78,7 @@ public: QNodeId shaderProgram() const; QList<RenderParameterMapping> bindings() const; QList<QNodeId> annotations() const; - QList<QRenderState *> renderStates() const; + QList<RenderState *> renderStates() const; private: void appendAnnotation(const QNodeId &criterionId); @@ -86,12 +87,12 @@ private: void appendBinding(const RenderParameterMapping &binding); void removeBinding(const QNodeId &bindingId); - void appendRenderState(QRenderState *renderState); + void appendRenderState(const QNodeId &id, RenderState *renderState); void removeRenderState(const QNodeId &renderStateId); QNodeId m_shaderUuid; QHash<QNodeId, RenderParameterMapping> m_bindings; - QHash<QNodeId, QRenderState *> m_renderStates; + QHash<QNodeId, RenderState *> m_renderStates; QList<QNodeId> m_annotationList; }; |