diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-05-30 17:18:16 +0200 |
---|---|---|
committer | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-06-10 14:05:10 +0200 |
commit | 52644616b3099b47dbe1cac11335721a2b7aacb6 (patch) | |
tree | 7295cb0ba7769fd5e9f7419a94c088972095e00b | |
parent | 80e9375dfae450ac40088d566e23b9234733b91e (diff) |
Make min-heap member of QMLRenderer instead of stack variable.
The heap is used to sort non-overlapping children.
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp | 78 | ||||
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h | 28 |
2 files changed, 60 insertions, 46 deletions
diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp index e2bd8f6134..676ecaae78 100644 --- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp +++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp @@ -111,48 +111,47 @@ static bool nodeLessThanWithRenderOrder(QSGGeometryNode *a, QSGGeometryNode *b) return a->matrix() < b->matrix(); } -// Minimum heap. -template <typename T, int prealloc = 256> -class Heap + +IndexGeometryNodePair::IndexGeometryNodePair(int i, QSGGeometryNode *node) + : QPair<int, QSGGeometryNode *>(i, node) +{ +} + +bool IndexGeometryNodePair::operator < (const IndexGeometryNodePair &other) const +{ + return nodeLessThan(second, other.second); +} + + +IndexGeometryNodePairHeap::IndexGeometryNodePairHeap() + : v(64) { -public: - void insert(const T &x); - const T &top() const { return v[0]; } - T pop(); - bool isEmpty() const { return v.isEmpty(); } -private: - static int parent(int i) { return (i - 1) >> 1; } - static int left(int i) { return (i << 1) | 1; } - static int right(int i) { return (i + 1) << 1; } - QVarLengthArray<T, prealloc> v; -}; - -template <typename T, int prealloc> -void Heap<T, prealloc>::insert(const T &x) +} + +void IndexGeometryNodePairHeap::insert(const IndexGeometryNodePair &x) { int i = v.size(); - v.append(x); - while (i != 0 && v[i] < v[parent(i)]) { - qSwap(v[parent(i)], v[i]); + v.add(x); + while (i != 0 && v.at(i) < v.at(parent(i))) { + qSwap(v.at(parent(i)), v.at(i)); i = parent(i); } } -template <typename T, int prealloc> -T Heap<T, prealloc>::pop() +IndexGeometryNodePair IndexGeometryNodePairHeap::pop() { - T x = top(); + IndexGeometryNodePair x = top(); if (v.size() > 1) - qSwap(v[0], v[v.size() - 1]); - v.resize(v.size() - 1); + qSwap(v.first(), v.last()); + v.pop_back(); int i = 0; while (left(i) < v.size()) { int low = left(i); - if (right(i) < v.size() && v[right(i)] < v[low]) + if (right(i) < v.size() && v.at(right(i)) < v.at(low)) low = right(i); - if (!(v[low] < v[i])) + if (!(v.at(low) < v.at(i))) break; - qSwap(v[i], v[low]); + qSwap(v.at(i), v.at(low)); i = low; } return x; @@ -340,14 +339,6 @@ void QMLRenderer::render() } -class Foo : public QPair<int, QSGGeometryNode *> -{ -public: - Foo() { } - Foo(int i, QSGGeometryNode *n) : QPair<int, QSGGeometryNode *>(i, n) { } - bool operator < (const Foo &other) const { return nodeLessThan(second, other.second); } -}; - void QMLRenderer::setSortFrontToBackEnabled(bool sort) { printf("setting sorting to... %d\n", sort); @@ -405,21 +396,20 @@ void QMLRenderer::buildLists(QSGNode *node) int childNodeCount = m_transparentNodes.size() - baseCount; if (childNodeCount) { - Heap<Foo, 16> heap; m_tempNodes.reset(); m_tempNodes.reserve(childNodeCount); while (childNodeCount) { for (int i = 0; i < count; ++i) { if (beginIndices[i] != endIndices[i]) - heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); + m_heap.insert(IndexGeometryNodePair(i, m_transparentNodes.at(beginIndices[i]++))); } - while (!heap.isEmpty()) { - Foo foo = heap.pop(); - m_tempNodes.add(foo.second); + while (!m_heap.isEmpty()) { + IndexGeometryNodePair pair = m_heap.pop(); + m_tempNodes.add(pair.second); --childNodeCount; - int i = foo.first; - if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), foo.second)) - heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); + int i = pair.first; + if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), pair.second)) + m_heap.insert(IndexGeometryNodePair(i, m_transparentNodes.at(beginIndices[i]++))); } } Q_ASSERT(m_tempNodes.size() == m_transparentNodes.size() - baseCount); diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h index ca1f5592cf..dc2d089391 100644 --- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h +++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h @@ -52,6 +52,31 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) +class IndexGeometryNodePair : public QPair<int, QSGGeometryNode *> +{ +public: + IndexGeometryNodePair(int i, QSGGeometryNode *n); + bool operator < (const IndexGeometryNodePair &other) const; +}; + + +// Minimum heap. +class IndexGeometryNodePairHeap +{ +public: + IndexGeometryNodePairHeap(); + void insert(const IndexGeometryNodePair &x); + const IndexGeometryNodePair &top() const { return v.first(); } + IndexGeometryNodePair pop(); + bool isEmpty() const { return v.isEmpty(); } +private: + static int parent(int i) { return (i - 1) >> 1; } + static int left(int i) { return (i << 1) | 1; } + static int right(int i) { return (i + 1) << 1; } + QDataBuffer<IndexGeometryNodePair> v; +}; + + class QMLRenderer : public QSGRenderer { Q_OBJECT @@ -77,14 +102,13 @@ private: QDataBuffer<QSGGeometryNode *> m_opaqueNodes; QDataBuffer<QSGGeometryNode *> m_transparentNodes; QDataBuffer<QSGGeometryNode *> m_tempNodes; + IndexGeometryNodePairHeap m_heap; bool m_rebuild_lists; bool m_needs_sorting; bool m_sort_front_to_back; int m_currentRenderOrder; - - #ifdef QML_RUNTIME_TESTING bool m_render_opaque_nodes; bool m_render_alpha_nodes; |