summaryrefslogtreecommitdiffstats
path: root/src/render/renderstates/renderstates_p.h
diff options
context:
space:
mode:
authorWieland Hagen <wieland.hagen@kdab.com>2016-01-28 13:48:11 +0100
committerWieland Hagen <wieland.hagen@kdab.com>2016-02-05 16:08:56 +0000
commitca6de904266422949f0c42ed2b16ba8cf7ac27a9 (patch)
tree6e8b7a630e4a5315e4f13f4bc6a22c5eb06b72eb /src/render/renderstates/renderstates_p.h
parentf4d0f45cc9a054735cd867a71d30b1d23147a409 (diff)
Pooled RenderStateImpls
Most RenderStateImpls are cached globally, and created only if no state with given values existed yet. Some states are still allocated on the heap on a per-frontend-node-basis. This applies only to RenderStates that may result in a large number of different values (e.g. when float parameters are involved) Change-Id: I3eabdeae6ec46ed86689338cf00315590c26b3fe Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/renderstates/renderstates_p.h')
-rw-r--r--src/render/renderstates/renderstates_p.h79
1 files changed, 57 insertions, 22 deletions
diff --git a/src/render/renderstates/renderstates_p.h b/src/render/renderstates/renderstates_p.h
index 74a2fa82a..584447269 100644
--- a/src/render/renderstates/renderstates_p.h
+++ b/src/render/renderstates/renderstates_p.h
@@ -54,27 +54,59 @@
#include <Qt3DRender/private/genericstate_p.h>
-#include <QOpenGLContext>
-
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
-template <class State>
-State* createRenderStateImpl()
+template <class State, class S>
+State* getOrCreateRenderStateImpl(const S& m1)
+{
+ State state;
+ state.set(m1);
+ return getOrCreateRenderStateEqualTo<State>(state);
+}
+
+template <class State, class S, class T>
+State* getOrCreateRenderStateImpl(const S& m1, const T& m2)
+{
+ State state;
+ state.set(m1, m2);
+ return getOrCreateRenderStateEqualTo<State>(state);
+}
+
+template <class State, class S, class T, class U>
+State* getOrCreateRenderStateImpl(const S& m1, const T& m2, const U& m3)
+{
+ State state;
+ state.set(m1, m2, m3);
+ return getOrCreateRenderStateEqualTo<State>(state);
+}
+
+template <class State, class S, class T, class U, class V>
+State* getOrCreateRenderStateImpl(const S& m1, const T& m2, const U& m3, const V& m4)
+{
+ State state;
+ state.set(m1, m2, m3, m4);
+ return getOrCreateRenderStateEqualTo<State>(state);
+}
+
+template <class State, class S, class T, class U, class V, class W, class Z>
+State* getOrCreateRenderStateImpl(const S& m1, const T& m2, const U& m3, const V& m4, const W& m5, const Z& m6)
{
- return new State();
+ State state;
+ state.set(m1, m2, m3, m4, m5, m6);
+ return getOrCreateRenderStateEqualTo<State>(state);
}
-class Q_AUTOTEST_EXPORT BlendState : public GenericState6<BlendStateMask, GLenum, GLenum, GLenum, GLenum, bool, int>
+class Q_AUTOTEST_EXPORT BlendState : public GenericState6<BlendState, BlendStateMask, GLenum, GLenum, GLenum, GLenum, bool, int>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT BlendEquation : public GenericState1<BlendStateMask, GLenum>
+class Q_AUTOTEST_EXPORT BlendEquation : public GenericState1<BlendEquation, BlendStateMask, GLenum>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
@@ -82,100 +114,103 @@ public:
};
-class Q_AUTOTEST_EXPORT AlphaFunc : public GenericState2<AlphaTestMask, GLenum, GLclampf>
+class Q_AUTOTEST_EXPORT AlphaFunc : public GenericState2<AlphaFunc, AlphaTestMask, GLenum, GLclampf>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT DepthTest : public GenericState1<DepthTestStateMask, GLenum>
+class Q_AUTOTEST_EXPORT DepthTest : public GenericState1<DepthTest, DepthTestStateMask, GLenum>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT DepthMask : public GenericState1<DepthWriteStateMask, GLboolean>
+class Q_AUTOTEST_EXPORT DepthMask : public GenericState1<DepthMask, DepthWriteStateMask, GLboolean>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT CullFace : public GenericState1<CullFaceStateMask, GLenum>
+class Q_AUTOTEST_EXPORT CullFace : public GenericState1<CullFace, CullFaceStateMask, GLenum>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT FrontFace : public GenericState1<FrontFaceStateMask, GLenum>
+class Q_AUTOTEST_EXPORT FrontFace : public GenericState1<FrontFace, FrontFaceStateMask, GLenum>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT Dithering : public MaskedRenderState<DitheringStateMask>
+class Q_AUTOTEST_EXPORT Dithering : public MaskedRenderState<Dithering, DitheringStateMask>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT ScissorTest : public GenericState4<ScissorStateMask, int, int, int, int>
+class Q_AUTOTEST_EXPORT ScissorTest : public GenericState4<ScissorTest, ScissorStateMask, int, int, int, int>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
+ bool isPooledImpl() const Q_DECL_NOEXCEPT Q_DECL_OVERRIDE { return false; }
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT StencilTest : public GenericState6<StencilTestStateMask, GLenum, int, uint, GLenum, int, uint>
+class Q_AUTOTEST_EXPORT StencilTest : public GenericState6<StencilTest, StencilTestStateMask, GLenum, int, uint, GLenum, int, uint>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT AlphaCoverage : public MaskedRenderState<AlphaCoverageStateMask>
+class Q_AUTOTEST_EXPORT AlphaCoverage : public MaskedRenderState<AlphaCoverage, AlphaCoverageStateMask>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT PointSize : public GenericState2<PointSizeMask, bool, GLfloat>
+class Q_AUTOTEST_EXPORT PointSize : public GenericState2<PointSize, PointSizeMask, bool, GLfloat>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
+ bool isPooledImpl() const Q_DECL_NOEXCEPT Q_DECL_OVERRIDE { return false; }
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT PolygonOffset : public GenericState2<PolygonOffsetStateMask, GLfloat, GLfloat>
+class Q_AUTOTEST_EXPORT PolygonOffset : public GenericState2<PolygonOffset, PolygonOffsetStateMask, GLfloat, GLfloat>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
+ bool isPooledImpl() const Q_DECL_NOEXCEPT Q_DECL_OVERRIDE { return false; }
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT ColorMask : public GenericState4<ColorStateMask, GLboolean, GLboolean, GLboolean, GLboolean>
+class Q_AUTOTEST_EXPORT ColorMask : public GenericState4<ColorMask, ColorStateMask, GLboolean, GLboolean, GLboolean, GLboolean>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_FINAL;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT ClipPlane : public GenericState1<ClipPlaneMask, int>
+class Q_AUTOTEST_EXPORT ClipPlane : public GenericState1<ClipPlane, ClipPlaneMask, int>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_FINAL;
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT StencilOp : public GenericState6<StencilOpMask, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum>
+class Q_AUTOTEST_EXPORT StencilOp : public GenericState6<StencilOp, StencilOpMask, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_FINAL;
};
-class Q_AUTOTEST_EXPORT StencilMask : public GenericState2<StencilWriteStateMask, uint, uint>
+class Q_AUTOTEST_EXPORT StencilMask : public GenericState2<StencilMask, StencilWriteStateMask, uint, uint>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_FINAL;