summaryrefslogtreecommitdiffstats
path: root/src/scenegraph/coreapi/qmlrenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/scenegraph/coreapi/qmlrenderer.cpp')
-rw-r--r--src/scenegraph/coreapi/qmlrenderer.cpp99
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(), &currentRenderOrder);
- 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);
}