diff options
-rw-r--r-- | examples/materials/SortedForwardRenderer.qml (renamed from examples/materials/ForwardRenderer.qml) | 0 | ||||
-rw-r--r-- | src/render/backend/qgraphicscontext.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/rendercommand.cpp | 21 | ||||
-rw-r--r-- | src/render/backend/rendercommand_p.h | 3 | ||||
-rw-r--r-- | src/render/backend/renderstate.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/renderview.cpp | 23 | ||||
-rw-r--r-- | src/render/frontend/framegraph-components/qsortcriterion.h | 2 |
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); |