summaryrefslogtreecommitdiffstats
path: root/src/render/backend/renderview.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2017-09-03 12:09:57 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2017-09-04 21:20:25 +0000
commit5e13bb3f093627af02f86602ab02f98bbf3648a2 (patch)
tree994b0f9fc18344ec5adfbab78f2584948fddc173 /src/render/backend/renderview.cpp
parente2a214855303f9579fc5c5e941a7e1a7e4080566 (diff)
Add support for FrontToBack sorting
A typical renderer with opaque-transparent passes will often want to use FrontToBack in the opaque pass (even though this is usually not strictly required). Change-Id: I071b62424a5446c86d76c6045c126a599534bf80 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend/renderview.cpp')
-rw-r--r--src/render/backend/renderview.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index dca660ad0..962480f2f 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -307,6 +307,15 @@ struct AdjacentSubRangeFinder<QSortPolicy::Material>
}
};
+template<>
+struct AdjacentSubRangeFinder<QSortPolicy::FrontToBack>
+{
+ static bool adjacentSubRange(RenderCommand *a, RenderCommand *b)
+ {
+ return a->m_depth == b->m_depth;
+ }
+};
+
template<typename Predicate>
int advanceUntilNonAdjacent(const QVector<RenderCommand *> &commands,
const int beg, const int end, Predicate pred)
@@ -366,6 +375,16 @@ struct SubRangeSorter<QSortPolicy::Material>
}
};
+template<>
+struct SubRangeSorter<QSortPolicy::FrontToBack>
+{
+ static void sortSubRange(CommandIt begin, const CommandIt end)
+ {
+ std::stable_sort(begin, end, [] (RenderCommand *a, RenderCommand *b) {
+ return a->m_depth < b->m_depth;
+ });
+ }
+};
int findSubRange(const QVector<RenderCommand *> &commands,
const int begin, const int end,
@@ -378,6 +397,8 @@ int findSubRange(const QVector<RenderCommand *> &commands,
return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::BackToFront>::adjacentSubRange);
case QSortPolicy::Material:
return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::Material>::adjacentSubRange);
+ case QSortPolicy::FrontToBack:
+ return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::FrontToBack>::adjacentSubRange);
default:
Q_UNREACHABLE();
return end;
@@ -418,6 +439,9 @@ void sortCommandRange(QVector<RenderCommand *> &commands, int begin, const int e
// Group all same material together (same parameters most likely)
sortByMaterial(commands, begin, end);
break;
+ case QSortPolicy::FrontToBack:
+ SubRangeSorter<QSortPolicy::FrontToBack>::sortSubRange(commands.begin() + begin, commands.begin() + end);
+ break;
default:
Q_UNREACHABLE();
}