summaryrefslogtreecommitdiffstats
path: root/src/render/renderers/opengl/renderstates
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/renderers/opengl/renderstates')
-rw-r--r--src/render/renderers/opengl/renderstates/renderstateset.cpp15
-rw-r--r--src/render/renderers/opengl/renderstates/renderstateset_p.h8
2 files changed, 19 insertions, 4 deletions
diff --git a/src/render/renderers/opengl/renderstates/renderstateset.cpp b/src/render/renderers/opengl/renderstates/renderstateset.cpp
index b14695c77..d667d9c76 100644
--- a/src/render/renderers/opengl/renderstates/renderstateset.cpp
+++ b/src/render/renderers/opengl/renderstates/renderstateset.cpp
@@ -112,17 +112,28 @@ void RenderStateSet::merge(RenderStateSet *other)
// We only add states which are new (different type)
for (const StateVariant &otherState : otherStates) {
- const bool hasFoundStateOfSameType = hasStateOfType(otherState.type);
- if (!hasFoundStateOfSameType)
+ const bool canAdd = canAddStateOfType(otherState.type);
+ if (canAdd)
m_states.push_back(otherState);
}
}
+bool RenderStateSet::canAddStateOfType(StateMask type) const
+{
+ return !hasStateOfType(type) || allowMultipleStatesOfType(type);
+}
+
bool RenderStateSet::hasStateOfType(StateMask type) const
{
return (type & stateMask());
}
+bool RenderStateSet::allowMultipleStatesOfType(StateMask type) const
+{
+ return (type == BlendEquationArgumentsMask) ||
+ (type == ClipPlaneMask);
+}
+
bool RenderStateSet::contains(const StateVariant &ds) const
{
// trivial reject using the state mask bits
diff --git a/src/render/renderers/opengl/renderstates/renderstateset_p.h b/src/render/renderers/opengl/renderstates/renderstateset_p.h
index 29be4d2f1..c2f3a0219 100644
--- a/src/render/renderers/opengl/renderstates/renderstateset_p.h
+++ b/src/render/renderers/opengl/renderstates/renderstateset_p.h
@@ -93,8 +93,7 @@ public:
QVector<StateVariant> states() const { return m_states; }
- bool hasStateOfType(StateMask type) const;
-
+ bool canAddStateOfType(StateMask type) const;
/**
* @brief contains - check if this set contains a matching piece of state
@@ -102,6 +101,11 @@ public:
* @return
*/
bool contains(const StateVariant &ds) const;
+
+private:
+ bool hasStateOfType(StateMask type) const;
+ bool allowMultipleStatesOfType(StateMask type) const;
+
private:
StateMaskSet m_stateMask;
QVector<StateVariant> m_states;