diff options
Diffstat (limited to 'src/scenegraph/coreapi/qmlrenderer.cpp')
-rw-r--r-- | src/scenegraph/coreapi/qmlrenderer.cpp | 99 |
1 files changed, 22 insertions, 77 deletions
diff --git a/src/scenegraph/coreapi/qmlrenderer.cpp b/src/scenegraph/coreapi/qmlrenderer.cpp index ceea599..eada040 100644 --- a/src/scenegraph/coreapi/qmlrenderer.cpp +++ b/src/scenegraph/coreapi/qmlrenderer.cpp @@ -50,6 +50,8 @@ #include <QtGui/qapplication.h> #include <QtCore/qpair.h> +//#define FORCE_NO_REORDER + static bool nodeLessThan(GeometryNode *a, GeometryNode *b) { // Sort by clip... @@ -119,14 +121,14 @@ T Heap<T, prealloc>::pop() QMLRenderer::QMLRenderer() - : m_dirtyVertexData(false) - , m_dirtyIndexData(false) + : Renderer() { -#if defined(QML_RUNTIME_TESTING) QStringList args = qApp->arguments(); +#if defined(QML_RUNTIME_TESTING) m_render_opaque_nodes = !args.contains("--no-opaque-nodes"); m_render_alpha_nodes = !args.contains("--no-alpha-nodes"); #endif + GeometryDataUploader::setUseBuffers(!args.contains("--no-vbo")); } void QMLRenderer::render() @@ -173,14 +175,9 @@ void QMLRenderer::render() m_opaqueNodes.clear(); m_transparentNodes.clear(); - m_clipNodes.clear(); - int currentRenderOrder = 0; + int currentRenderOrder = 1; buildLists(rootNode(), ¤tRenderOrder); - if (m_geometry_uploader.useBuffers()) - uploadNodeData(); - - ++currentRenderOrder; m_renderOrderMatrix.setToIdentity(); m_renderOrderMatrix.scale(1, 1, qreal(1) / currentRenderOrder); @@ -203,8 +200,6 @@ void QMLRenderer::render() m_currentProgram->deactivate(); m_projectionMatrix.pop(); - - m_geometry_uploader.release(); } class Foo : public QPair<int, GeometryNode *> @@ -227,39 +222,30 @@ void QMLRenderer::buildLists(Node *node, int *currentRenderOrder) g = geomNode->geometry(); if (g->vertexCount()) { //Sanity check +#ifdef FORCE_NO_REORDER + if (true) { +#else if (geomNode->material()->flags() & AbstractEffect::Blending) { - geomNode->setRenderOrder(*currentRenderOrder); +#endif + geomNode->setRenderOrder(*currentRenderOrder - 1); m_transparentNodes.append(geomNode); } else { - geomNode->setRenderOrder(*currentRenderOrder + 1); + geomNode->setRenderOrder(*currentRenderOrder); m_opaqueNodes.append(geomNode); *currentRenderOrder += 2; } } - } else if (node->type() == Node::ClipNodeType) { - ClipNode *clipNode = static_cast<ClipNode *>(node); - g = clipNode->geometry(); - - if (g->vertexCount()) //Sanity check - m_clipNodes.append(clipNode); - } - - if (g && m_geometry_uploader.useBuffers()) { - if (g->isVertexDataDirty() || !m_geometry_uploader.containsGeometryVertex(g)) { - m_dirtyVertexData = true; - g->setVertexDataDirty(false); - } - if (g->isIndexDataDirty() || (g->indexCount() && !m_geometry_uploader.containsGeometryIndex(g))) { - m_dirtyIndexData = true; - g->setIndexDataDirty(false); - } } int count = node->childCount(); if (!count) return; +#ifdef FORCE_NO_REORDER + static bool reorder = false; +#else static bool reorder = !qApp->arguments().contains("--no-reorder"); +#endif if (reorder && count > 1 && (node->flags() & Node::ChildrenDoNotOverloap)) { QVarLengthArray<int, 16> beginIndices(count); @@ -298,51 +284,6 @@ void QMLRenderer::buildLists(Node *node, int *currentRenderOrder) } } -void QMLRenderer::uploadNodeData() -{ - m_geometry_uploader.bind(); - - if (!m_dirtyVertexData && !m_dirtyIndexData) - return; - - if (m_dirtyVertexData) - m_geometry_uploader.clearVertexData(); - if (m_dirtyIndexData) - m_geometry_uploader.clearIndexData(); - - int count = m_opaqueNodes.count(); - for (int i = 0; i < count; ++i) { - GeometryNode *geomNode = m_opaqueNodes.at(i); - if (m_dirtyVertexData) - m_geometry_uploader.addGeometryVertex(geomNode->geometry()); - if (m_dirtyIndexData) - m_geometry_uploader.addGeometryIndex(geomNode->geometry()); - } - - count = m_transparentNodes.count(); - for (int i = 0; i < count; ++i) { - GeometryNode *geomNode = m_transparentNodes.at(i); - if (m_dirtyVertexData) - m_geometry_uploader.addGeometryVertex(geomNode->geometry()); - if (m_dirtyIndexData) - m_geometry_uploader.addGeometryIndex(geomNode->geometry()); - } - - count = m_clipNodes.count(); - for (int i = 0; i < count; ++i) { - ClipNode *clipNode = m_clipNodes.at(i); - if (m_dirtyVertexData) - m_geometry_uploader.addGeometryVertex(clipNode->geometry()); - if (m_dirtyIndexData) - m_geometry_uploader.addGeometryIndex(clipNode->geometry()); - } - - m_geometry_uploader.upload(); - - m_dirtyVertexData = false; - m_dirtyIndexData = false; -} - void QMLRenderer::renderNodes(const QVector<GeometryNode *> &list, int renderOrders) { const float scale = 1.0f / renderOrders; @@ -375,7 +316,11 @@ void QMLRenderer::renderNodes(const QVector<GeometryNode *> &list, int renderOrd if (changeClip) { clipType = updateStencilClip(geomNode->clipList()); m_currentClip = geomNode->clipList(); +#ifdef FORCE_NO_REORDER + glDepthMask(false); +#else glDepthMask((material->flags() & AbstractEffect::Blending) == 0); +#endif //++clipChangeCount; } @@ -422,7 +367,7 @@ void QMLRenderer::renderNodes(const QVector<GeometryNode *> &list, int renderOrd GLboolean normalize = attr.type() != GL_FLOAT && attr.type() != GL_DOUBLE; #endif glVertexAttribPointer(*attributes, attr.tupleSize(), attr.type(), normalize, attr.stride(), - m_geometry_uploader.vertexData(g, offset)); + GeometryDataUploader::vertexData(g, offset)); offset += attr.tupleSize() * attr.sizeOfType(); } else { qWarning("Attribute required by effect is missing."); @@ -432,7 +377,7 @@ void QMLRenderer::renderNodes(const QVector<GeometryNode *> &list, int renderOrd QPair<int, int> indexRange = geomNode->indexRange(); if (g->indexCount()) glDrawElements(GLenum(g->drawingMode()), indexRange.second - indexRange.first, g->indexType(), - m_geometry_uploader.indexData(g)); + GeometryDataUploader::indexData(g)); else glDrawArrays(GLenum(g->drawingMode()), indexRange.first, indexRange.second - indexRange.first); } |