diff options
-rw-r--r-- | src/declarative/items/qsgcanvas.cpp | 9 | ||||
-rw-r--r-- | src/declarative/items/qsgflickable.cpp | 12 | ||||
-rw-r--r-- | src/declarative/items/qsgflickable_p_p.h | 4 | ||||
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp | 70 | ||||
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgrenderer.cpp | 3 |
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, |