aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/items/qsgcanvas.cpp9
-rw-r--r--src/declarative/items/qsgflickable.cpp12
-rw-r--r--src/declarative/items/qsgflickable_p_p.h4
-rw-r--r--src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp70
-rw-r--r--src/declarative/scenegraph/coreapi/qsgrenderer.cpp3
5 files changed, 86 insertions, 12 deletions
diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp
index 5fc5c76d1d..5d5c49d981 100644
--- a/src/declarative/items/qsgcanvas.cpp
+++ b/src/declarative/items/qsgcanvas.cpp
@@ -48,6 +48,8 @@
#include <private/qsgrenderer_p.h>
#include <private/qsgflashnode_p.h>
+#include <private/qabstractanimation_p.h>
+
#include <QtGui/qpainter.h>
#include <QtGui/qgraphicssceneevent.h>
#include <QtGui/qmatrix4x4.h>
@@ -60,6 +62,7 @@
QT_BEGIN_NAMESPACE
DEFINE_BOOL_CONFIG_OPTION(qmlThreadedRenderer, QML_THREADED_RENDERER)
+DEFINE_BOOL_CONFIG_OPTION(qmlFixedAnimationStep, QML_FIXED_ANIMATION_STEP)
/*
Focus behavior
@@ -332,8 +335,8 @@ void QSGCanvasPrivate::renderSceneGraph()
#ifdef FRAME_TIMING
- int pixel;
- glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel);
+// int pixel;
+// glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel);
readbackTime = frameTimer.elapsed();
#endif
@@ -477,6 +480,8 @@ QSGCanvasPrivate::~QSGCanvasPrivate()
void QSGCanvasPrivate::init(QSGCanvas *c)
{
+ QUnifiedTimer::instance(true)->setConsistentTiming(qmlFixedAnimationStep());
+
q_ptr = c;
Q_Q(QSGCanvas);
diff --git a/src/declarative/items/qsgflickable.cpp b/src/declarative/items/qsgflickable.cpp
index ab3559bce9..be0ac13bbf 100644
--- a/src/declarative/items/qsgflickable.cpp
+++ b/src/declarative/items/qsgflickable.cpp
@@ -169,8 +169,8 @@ void QSGFlickableVisibleArea::updateVisible()
QSGFlickablePrivate::QSGFlickablePrivate()
: contentItem(new QSGItem)
- , hData(this, &QSGFlickablePrivate::setRoundedViewportX)
- , vData(this, &QSGFlickablePrivate::setRoundedViewportY)
+ , hData(this, &QSGFlickablePrivate::setViewportX)
+ , vData(this, &QSGFlickablePrivate::setViewportY)
, flickingHorizontally(false), flickingVertically(false)
, hMoved(false), vMoved(false)
, movingHorizontally(false), movingVertically(false)
@@ -894,14 +894,14 @@ void QSGFlickablePrivate::clearDelayedPress()
}
}
-void QSGFlickablePrivate::setRoundedViewportX(qreal x)
+void QSGFlickablePrivate::setViewportX(qreal x)
{
- contentItem->setX(qRound(x));
+ contentItem->setX(x);
}
-void QSGFlickablePrivate::setRoundedViewportY(qreal y)
+void QSGFlickablePrivate::setViewportY(qreal y)
{
- contentItem->setY(qRound(y));
+ contentItem->setY(y);
}
void QSGFlickable::timerEvent(QTimerEvent *event)
diff --git a/src/declarative/items/qsgflickable_p_p.h b/src/declarative/items/qsgflickable_p_p.h
index 9f212ee038..114db53668 100644
--- a/src/declarative/items/qsgflickable_p_p.h
+++ b/src/declarative/items/qsgflickable_p_p.h
@@ -140,8 +140,8 @@ public:
void captureDelayedPress(QGraphicsSceneMouseEvent *event);
void clearDelayedPress();
- void setRoundedViewportX(qreal x);
- void setRoundedViewportY(qreal y);
+ void setViewportX(qreal x);
+ void setViewportY(qreal y);
qreal overShootDistance(qreal size);
diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
index 901b84aa09..4569e7fc32 100644
--- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
+++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp
@@ -48,9 +48,18 @@
#include <QtCore/qvarlengtharray.h>
#include <QtGui/qapplication.h>
#include <QtCore/qpair.h>
+#include <QtCore/QElapsedTimer>
//#define FORCE_NO_REORDER
+// #define RENDERER_DEBUG
+#ifdef RENDERER_DEBUG
+#define DEBUG_THRESHOLD 0
+QElapsedTimer debugTimer;
+int materialChanges;
+int geometryNodesDrawn;
+#endif
+
QT_BEGIN_NAMESPACE
static bool nodeLessThan(QSGGeometryNode *a, QSGGeometryNode *b)
@@ -187,6 +196,13 @@ void QMLRenderer::render()
}
#endif
+#ifdef RENDERER_DEBUG
+ debugTimer.invalidate();
+ debugTimer.start();
+ geometryNodesDrawn = 0;
+ materialChanges = 0;
+#endif
+
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_BLEND);
@@ -205,8 +221,16 @@ void QMLRenderer::render()
glDisable(GL_SCISSOR_TEST);
glClearColor(m_clear_color.redF(), m_clear_color.greenF(), m_clear_color.blueF(), m_clear_color.alphaF());
+#ifdef RENDERER_DEBUG
+ int debugtimeSetup = debugTimer.elapsed();
+#endif
+
bindable()->clear(clearMode());
+#ifdef RENDERER_DEBUG
+ int debugtimeClear = debugTimer.elapsed();
+#endif
+
QRect r = viewportRect();
glViewport(r.x(), deviceRect().bottom() - r.bottom(), r.width(), r.height());
m_projectionMatrix = projectMatrix();
@@ -228,6 +252,11 @@ void QMLRenderer::render()
m_rebuild_lists = false;
}
+#ifdef RENDERER_DEBUG
+ int debugtimeLists = debugTimer.elapsed();
+#endif
+
+
if (m_needs_sorting) {
qSort(m_opaqueNodes.begin(), m_opaqueNodes.end(),
m_sort_front_to_back
@@ -236,6 +265,10 @@ void QMLRenderer::render()
m_needs_sorting = false;
}
+#ifdef RENDERER_DEBUG
+ int debugtimeSorting = debugTimer.elapsed();
+#endif
+
m_renderOrderMatrix.setToIdentity();
m_renderOrderMatrix.scale(1, 1, qreal(1) / m_currentRenderOrder);
@@ -252,6 +285,12 @@ void QMLRenderer::render()
renderNodes(m_opaqueNodes);
}
+#ifdef RENDERER_DEBUG
+ int debugtimeOpaque = debugTimer.elapsed();
+ int opaqueNodes = geometryNodesDrawn;
+ int opaqueMaterialChanges = materialChanges;
+#endif
+
glEnable(GL_BLEND);
glDepthMask(false);
#ifdef QML_RUNTIME_TESTING
@@ -265,10 +304,33 @@ void QMLRenderer::render()
renderNodes(m_transparentNodes);
}
+#ifdef RENDERER_DEBUG
+ int debugtimeAlpha = debugTimer.elapsed();
+#endif
+
+
if (m_currentProgram)
m_currentProgram->deactivate();
m_projectionMatrix.pop();
+
+#ifdef RENDERER_DEBUG
+ if (debugTimer.elapsed() > DEBUG_THRESHOLD) {
+ printf(" --- Renderer breakdown:\n"
+ " - setup=%d, clear=%d, building=%d, sorting=%d, opaque=%d, alpha=%d\n"
+ " - material changes: opaque=%d, alpha=%d, total=%d\n"
+ " - geometry ndoes: opaque=%d, alpha=%d, total=%d\n",
+ debugtimeSetup,
+ debugtimeClear - debugtimeSetup,
+ debugtimeLists - debugtimeClear,
+ debugtimeSorting - debugtimeLists,
+ debugtimeOpaque - debugtimeSorting,
+ debugtimeAlpha - debugtimeOpaque,
+ opaqueMaterialChanges, materialChanges - opaqueMaterialChanges, materialChanges,
+ opaqueNodes, geometryNodesDrawn - opaqueNodes, geometryNodesDrawn);
+ }
+#endif
+
}
class Foo : public QPair<int, QSGGeometryNode *>
@@ -426,6 +488,10 @@ void QMLRenderer::renderNodes(const QVector<QSGGeometryNode *> &list)
m_currentProgram->activate();
//++programChangeCount;
updates |= (QSGMaterialShader::RenderState::DirtyMatrix | QSGMaterialShader::RenderState::DirtyOpacity);
+
+#ifdef RENDERER_DEBUG
+ materialChanges++;
+#endif
}
bool changeRenderOrder = currentRenderOrder != geomNode->renderOrder();
@@ -449,6 +515,10 @@ void QMLRenderer::renderNodes(const QVector<QSGGeometryNode *> &list)
const QSGGeometry *g = geomNode->geometry();
bindGeometry(program, g);
draw(geomNode);
+
+#ifdef RENDERER_DEBUG
+ geometryNodesDrawn++;
+#endif
}
//qDebug("Clip: %i, shader program: %i, material: %i times changed while drawing %s items",
// clipChangeCount, programChangeCount, materialChangeCount,
diff --git a/src/declarative/scenegraph/coreapi/qsgrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp
index eb7b830ade..04c0817f8f 100644
--- a/src/declarative/scenegraph/coreapi/qsgrenderer.cpp
+++ b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp
@@ -243,8 +243,7 @@ void QSGRenderer::renderScene(const Bindable &bindable)
m_bindable = 0;
#ifdef QSG_RENDERER_TIMING
- printf("Frame #%d: Breakdown of frametime: preprocess=%d, updates=%d, binding=%d, render=%d, total=%d\n",
- ++frameNumber,
+ printf(" - Breakdown of frametime: preprocess=%d, updates=%d, binding=%d, render=%d, total=%d\n",
preprocessTime,
updatePassTime - preprocessTime,
bindTime - updatePassTime,