summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2015-02-02 12:07:50 +0100
committerKevin Ottens <kevin.ottens@kdab.com>2015-02-03 10:12:25 +0000
commit10b58d98c459d654707d80c3400450a5bc07dfd4 (patch)
tree84f032dee1f6b1132d5b4c1ae13bf6978600a20d /src
parentbb5041aa93682b10ff54f01915fe91a75673f4db (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.cpp95
-rw-r--r--src/render/backend/renderrenderpass.cpp99
-rw-r--r--src/render/backend/renderrenderpass_p.h7
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;
};