summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/materials/SortedForwardRenderer.qml (renamed from examples/materials/ForwardRenderer.qml)0
-rw-r--r--src/render/backend/qgraphicscontext.cpp2
-rw-r--r--src/render/backend/rendercommand.cpp21
-rw-r--r--src/render/backend/rendercommand_p.h3
-rw-r--r--src/render/backend/renderstate.cpp2
-rw-r--r--src/render/backend/renderview.cpp23
-rw-r--r--src/render/frontend/framegraph-components/qsortcriterion.h2
7 files changed, 26 insertions, 27 deletions
diff --git a/examples/materials/ForwardRenderer.qml b/examples/materials/SortedForwardRenderer.qml
index 6bcf7347b..6bcf7347b 100644
--- a/examples/materials/ForwardRenderer.qml
+++ b/examples/materials/SortedForwardRenderer.qml
diff --git a/src/render/backend/qgraphicscontext.cpp b/src/render/backend/qgraphicscontext.cpp
index d6d783252..743def3da 100644
--- a/src/render/backend/qgraphicscontext.cpp
+++ b/src/render/backend/qgraphicscontext.cpp
@@ -239,7 +239,7 @@ void QGraphicsContext::activateShader(RenderShader *shader)
m_activeShader = Q_NULLPTR;
}
- if (m_activeShader == shader) {
+ if (m_activeShader != Q_NULLPTR && m_activeShader->dna() == shader->dna()) {
// no op
} else {
diff --git a/src/render/backend/rendercommand.cpp b/src/render/backend/rendercommand.cpp
index 058059dc7..e5f77837f 100644
--- a/src/render/backend/rendercommand.cpp
+++ b/src/render/backend/rendercommand.cpp
@@ -49,27 +49,12 @@ namespace Render {
RenderCommand::RenderCommand()
{
+ m_sortingType.global = 0;
}
-bool operator <(const RenderCommand &r1, const RenderCommand &r2)
+bool compareCommands(RenderCommand *r1, RenderCommand *r2)
{
- bool inf = true;
- for (int i = 0; i < 4 && inf; i++) {
- switch (r1.m_sortingType.sorts[i]) {
- case 0:
- return inf;
- case QSortCriterion::StateChangeCost:
- inf = r1.m_changeCost < r2.m_changeCost;
- break;
- case QSortCriterion::BackToFront:
- inf = r1.m_depth < r2.m_depth;
- break;
- case QSortCriterion::Material:
- inf = r1.m_shader != r2.m_shader;
- break;
- }
- }
- return inf;
+ return r1->m_sortingType.global < r2->m_sortingType.global;
}
} // namespace Render
diff --git a/src/render/backend/rendercommand_p.h b/src/render/backend/rendercommand_p.h
index 1875b697a..c9c80fb9f 100644
--- a/src/render/backend/rendercommand_p.h
+++ b/src/render/backend/rendercommand_p.h
@@ -80,6 +80,7 @@ public:
float m_depth;
int m_changeCost;
+ uint m_shaderDna;
union sortingType {
char sorts[4];
@@ -88,7 +89,7 @@ public:
};
-bool operator < (const RenderCommand &r1, const RenderCommand &r2);
+bool compareCommands(RenderCommand *r1, RenderCommand *r2);
} // Render
diff --git a/src/render/backend/renderstate.cpp b/src/render/backend/renderstate.cpp
index 17d547fe6..fb2f932f6 100644
--- a/src/render/backend/renderstate.cpp
+++ b/src/render/backend/renderstate.cpp
@@ -84,7 +84,7 @@ int RenderStateSet::changeCost(RenderStateSet *previousState)
cost += bs.count();
// now, find out how many states we're changing
- foreach (RenderState* ds, m_states) {
+ Q_FOREACH (RenderState* ds, m_states) {
// if the other state contains matching, then doesn't
// contribute to cost at all
if (previousState->contains(ds)) {
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index ae05da252..ef6db414a 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -317,8 +317,7 @@ void RenderView::sort()
{
// Compares the bitsetKey of the RenderCommands
// Key[Depth | StateCost | Shader]
-
- std::sort(m_commands.begin(), m_commands.end());
+ std::sort(m_commands.begin(), m_commands.end(), compareCommands);
}
// Tries to order renderCommand by shader so as to minimize shader changes
@@ -553,16 +552,28 @@ void RenderView::buildSortingKey(RenderCommand *command)
{
// Build a bitset key depending on the SortingCriterion
int sortCount = m_data->m_sortingCriteria.count();
- command->m_sortingType.global = 0;
// Default sorting
if (sortCount == 0)
- command->m_sortingType.sorts[0] = QSortCriterion::StateChangeCost;
+ command->m_sortingType.sorts[0] = command->m_changeCost; // State change cost
// Handle at most 4 filters at once
for (int i = 0; i < sortCount && i < 4; i++) {
SortCriterion *sC = m_renderer->sortCriterionManager()->lookupResource(m_data->m_sortingCriteria[i]);
- command->m_sortingType.sorts[i] = sC->sortType();
+
+ switch (sC->sortType()) {
+ case QSortCriterion::StateChangeCost:
+ command->m_sortingType.sorts[i] = command->m_changeCost; // State change cost
+ break;
+ case QSortCriterion::BackToFront:
+ command->m_sortingType.sorts[i] = 0; // Depth value (not implemented yet)
+ break;
+ case QSortCriterion::Material:
+ command->m_sortingType.sorts[i] = command->m_shaderDna; // Material
+ break;
+ default:
+ Q_UNREACHABLE();
+ }
}
}
@@ -584,6 +595,8 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, RenderRenderPass *
RenderShader *shader = Q_NULLPTR;
if ((shader = m_renderer->shaderManager()->data(command->m_shader)) != Q_NULLPTR) {
+ command->m_shaderDna = shader->dna();
+
// Builds the QUniformPack, sets shader standard uniforms and store attributes name / glname bindings
// If a parameter is defined and not found in the bindings it is assumed to be a binding of Uniform type with the glsl name
// equals to the parameter name
diff --git a/src/render/frontend/framegraph-components/qsortcriterion.h b/src/render/frontend/framegraph-components/qsortcriterion.h
index 9f14591c1..ededeead9 100644
--- a/src/render/frontend/framegraph-components/qsortcriterion.h
+++ b/src/render/frontend/framegraph-components/qsortcriterion.h
@@ -55,7 +55,7 @@ class QT3DRENDERERSHARED_EXPORT QSortCriterion : public QNode
{
Q_OBJECT
Q_ENUMS(SortType)
- Q_PROPERTY(QSortCriterion::SortType sort READ sort WRITE setSort NOTIFY sortChanged)
+ Q_PROPERTY(Qt3D::QSortCriterion::SortType sort READ sort WRITE setSort NOTIFY sortChanged)
public:
explicit QSortCriterion(QNode *parent = 0);