aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp')
-rw-r--r--plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp221
1 files changed, 79 insertions, 142 deletions
diff --git a/plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp b/plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp
index 2250ce7cd3..7e0bd79f5e 100644
--- a/plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp
+++ b/plugins/qmlprofilerextension/scenegraphtimelinemodel.cpp
@@ -19,7 +19,6 @@
#include "scenegraphtimelinemodel.h"
#include "qmldebug/qmlprofilereventtypes.h"
#include "qmlprofiler/qmlprofilermodelmanager.h"
-#include "qmlprofiler/abstracttimelinemodel_p.h"
#include <QCoreApplication>
#include <QDebug>
@@ -66,83 +65,31 @@ enum SceneGraphCategoryType {
MaximumSceneGraphCategoryType
};
-enum SceneGraphStage {
- MinimumSceneGraphStage = 0,
- Polish = MinimumSceneGraphStage,
- Wait,
- GUIThreadSync,
- Animations,
- MaximumGUIThreadStage,
-
- RenderThreadSync = MaximumGUIThreadStage,
- Render,
- Swap,
- MaximumRenderThreadStage,
-
- RenderPreprocess = MaximumRenderThreadStage,
- RenderUpdate,
- RenderBind,
- RenderRender,
- MaximumRenderStage,
-
- Material = MaximumRenderStage,
- MaximumMaterialStage,
-
- GlyphRender = MaximumMaterialStage,
- GlyphStore,
- MaximumGlyphStage,
-
- TextureBind = MaximumGlyphStage,
- TextureConvert,
- TextureSwizzle,
- TextureUpload,
- TextureMipmap,
- TextureDeletion,
- MaximumTextureStage,
-
- MaximumSceneGraphStage = MaximumTextureStage
-};
-
-
-Q_STATIC_ASSERT(sizeof(StageLabels) == MaximumSceneGraphStage * sizeof(const char *));
-
-class SceneGraphTimelineModel::SceneGraphTimelineModelPrivate :
- public AbstractTimelineModel::AbstractTimelineModelPrivate
-{
-public:
- void flattenLoads();
+Q_STATIC_ASSERT(sizeof(StageLabels) ==
+ SceneGraphTimelineModel::MaximumSceneGraphStage * sizeof(const char *));
- QVector<SceneGraphEvent> data;
- qint64 insert(qint64 start, qint64 duration, int typeIndex, SceneGraphStage stage,
- int glyphCount = -1);
- static const char *threadLabel(SceneGraphStage stage);
-
-private:
- Q_DECLARE_PUBLIC(SceneGraphTimelineModel)
-};
-
-SceneGraphTimelineModel::SceneGraphTimelineModel(QObject *parent)
- : AbstractTimelineModel(new SceneGraphTimelineModelPrivate,
- tr(QmlProfilerModelManager::featureName(QmlDebug::ProfileSceneGraph)),
- QmlDebug::SceneGraphFrame, QmlDebug::MaximumRangeType, parent)
+SceneGraphTimelineModel::SceneGraphTimelineModel(QmlProfilerModelManager *manager,
+ QObject *parent) :
+ QmlProfilerTimelineModel(manager,
+ tr(QmlProfilerModelManager::featureName(QmlDebug::ProfileSceneGraph)),
+ QmlDebug::SceneGraphFrame, QmlDebug::MaximumRangeType, parent)
{
+ announceFeatures(1 << QmlDebug::ProfileSceneGraph);
}
-quint64 SceneGraphTimelineModel::features() const
+int SceneGraphTimelineModel::expandedRow(int index) const
{
- return 1 << QmlDebug::ProfileSceneGraph;
+ return selectionId(index) + 1;
}
-int SceneGraphTimelineModel::row(int index) const
+int SceneGraphTimelineModel::collapsedRow(int index) const
{
- Q_D(const SceneGraphTimelineModel);
- return expanded() ? (d->data[index].stage + 1) : d->data[index].rowNumberCollapsed;
+ return m_data[index].rowNumberCollapsed;
}
-int SceneGraphTimelineModel::selectionId(int index) const
+int SceneGraphTimelineModel::typeId(int index) const
{
- Q_D(const SceneGraphTimelineModel);
- return d->data[index].stage;
+ return m_data[index].typeId;
}
QColor SceneGraphTimelineModel::color(int index) const
@@ -152,18 +99,15 @@ QColor SceneGraphTimelineModel::color(int index) const
QVariantList SceneGraphTimelineModel::labels() const
{
- Q_D(const SceneGraphTimelineModel);
QVariantList result;
- if (d->expanded && !d->hidden && !isEmpty()) {
- for (SceneGraphStage i = MinimumSceneGraphStage; i < MaximumSceneGraphStage;
- i = static_cast<SceneGraphStage>(i + 1)) {
- QVariantMap element;
- element.insert(QLatin1String("displayName"), tr(d->threadLabel(i)));
- element.insert(QLatin1String("description"), tr(StageLabels[i]));
- element.insert(QLatin1String("id"), i);
- result << element;
- }
+ for (SceneGraphStage i = MinimumSceneGraphStage; i < MaximumSceneGraphStage;
+ i = static_cast<SceneGraphStage>(i + 1)) {
+ QVariantMap element;
+ element.insert(QLatin1String("displayName"), tr(threadLabel(i)));
+ element.insert(QLatin1String("description"), tr(StageLabels[i]));
+ element.insert(QLatin1String("id"), i);
+ result << element;
}
return result;
@@ -171,25 +115,24 @@ QVariantList SceneGraphTimelineModel::labels() const
QVariantMap SceneGraphTimelineModel::details(int index) const
{
- Q_D(const SceneGraphTimelineModel);
QVariantMap result;
- const SceneGraphEvent *ev = &d->data[index];
+ const SceneGraphStage stage = static_cast<SceneGraphStage>(selectionId(index));
+
+ result.insert(QLatin1String("displayName"), tr(threadLabel(stage)));
+ result.insert(tr("Stage"), tr(StageLabels[stage]));
+ result.insert(tr("Duration"), QmlProfilerBaseModel::formatTime(duration(index)));
- result.insert(QLatin1String("displayName"),
- tr(d->threadLabel(static_cast<SceneGraphStage>(ev->stage))));
- result.insert(tr("Stage"), tr(StageLabels[ev->stage]));
- result.insert(tr("Duration"), QmlProfilerBaseModel::formatTime(range(index).duration));
- if (ev->glyphCount >= 0)
- result.insert(tr("Glyphs"), QString::number(ev->glyphCount));
+ const int glyphCount = m_data[index].glyphCount;
+ if (glyphCount >= 0)
+ result.insert(tr("Glyphs"), QString::number(glyphCount));
return result;
}
void SceneGraphTimelineModel::loadData()
{
- Q_D(SceneGraphTimelineModel);
clear();
- QmlProfilerDataModel *simpleModel = d->modelManager->qmlModel();
+ QmlProfilerDataModel *simpleModel = modelManager()->qmlModel();
if (simpleModel->isEmpty())
return;
@@ -208,111 +151,108 @@ void SceneGraphTimelineModel::loadData()
// parts of the breakdown are usually very short.
qint64 startTime = event.startTime - event.numericData1 - event.numericData2 -
event.numericData3 - event.numericData4;
- startTime += d->insert(startTime, event.numericData1, event.typeIndex,
- RenderPreprocess);
- startTime += d->insert(startTime, event.numericData2, event.typeIndex, RenderUpdate);
- startTime += d->insert(startTime, event.numericData3, event.typeIndex, RenderBind);
- d->insert(startTime, event.numericData4, event.typeIndex, RenderRender);
+ startTime += insert(startTime, event.numericData1, event.typeIndex, RenderPreprocess);
+ startTime += insert(startTime, event.numericData2, event.typeIndex, RenderUpdate);
+ startTime += insert(startTime, event.numericData3, event.typeIndex, RenderBind);
+ insert(startTime, event.numericData4, event.typeIndex, RenderRender);
break;
}
case QmlDebug::SceneGraphAdaptationLayerFrame: {
qint64 startTime = event.startTime - event.numericData2 - event.numericData3;
- startTime += d->insert(startTime, event.numericData2, event.typeIndex, GlyphRender,
- event.numericData1);
- d->insert(startTime, event.numericData3, event.typeIndex, GlyphStore,
- event.numericData1);
+ startTime += insert(startTime, event.numericData2, event.typeIndex, GlyphRender,
+ event.numericData1);
+ insert(startTime, event.numericData3, event.typeIndex, GlyphStore, event.numericData1);
break;
}
case QmlDebug::SceneGraphContextFrame: {
- d->insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
+ insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
Material);
break;
}
case QmlDebug::SceneGraphRenderLoopFrame: {
qint64 startTime = event.startTime - event.numericData1 - event.numericData2 -
event.numericData3;
- startTime += d->insert(startTime, event.numericData1, event.typeIndex,
+ startTime += insert(startTime, event.numericData1, event.typeIndex,
RenderThreadSync);
- startTime += d->insert(startTime, event.numericData2, event.typeIndex,
+ startTime += insert(startTime, event.numericData2, event.typeIndex,
Render);
- d->insert(startTime, event.numericData3, event.typeIndex, Swap);
+ insert(startTime, event.numericData3, event.typeIndex, Swap);
break;
}
case QmlDebug::SceneGraphTexturePrepare: {
qint64 startTime = event.startTime - event.numericData1 - event.numericData2 -
event.numericData3 - event.numericData4 - event.numericData5;
- startTime += d->insert(startTime, event.numericData1, event.typeIndex, TextureBind);
- startTime += d->insert(startTime, event.numericData2, event.typeIndex, TextureConvert);
- startTime += d->insert(startTime, event.numericData3, event.typeIndex, TextureSwizzle);
- startTime += d->insert(startTime, event.numericData4, event.typeIndex, TextureUpload);
- d->insert(startTime, event.numericData5, event.typeIndex, TextureMipmap);
+ startTime += insert(startTime, event.numericData1, event.typeIndex, TextureBind);
+ startTime += insert(startTime, event.numericData2, event.typeIndex, TextureConvert);
+ startTime += insert(startTime, event.numericData3, event.typeIndex, TextureSwizzle);
+ startTime += insert(startTime, event.numericData4, event.typeIndex, TextureUpload);
+ insert(startTime, event.numericData5, event.typeIndex, TextureMipmap);
break;
}
case QmlDebug::SceneGraphTextureDeletion: {
- d->insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
- TextureDeletion);
+ insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
+ TextureDeletion);
break;
}
case QmlDebug::SceneGraphPolishAndSync: {
qint64 startTime = event.startTime - event.numericData1 - event.numericData2 -
event.numericData3 - event.numericData4;
- startTime += d->insert(startTime, event.numericData1, event.typeIndex, Polish);
- startTime += d->insert(startTime, event.numericData2, event.typeIndex, Wait);
- startTime += d->insert(startTime, event.numericData3, event.typeIndex, GUIThreadSync);
- d->insert(startTime, event.numericData4, event.typeIndex, Animations);
+ startTime += insert(startTime, event.numericData1, event.typeIndex, Polish);
+ startTime += insert(startTime, event.numericData2, event.typeIndex, Wait);
+ startTime += insert(startTime, event.numericData3, event.typeIndex, GUIThreadSync);
+ insert(startTime, event.numericData4, event.typeIndex, Animations);
break;
}
case QmlDebug::SceneGraphWindowsAnimations: {
// GUI thread, separate animations stage
- d->insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
- Animations);
+ insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
+ Animations);
break;
}
case QmlDebug::SceneGraphPolishFrame: {
// GUI thread, separate polish stage
- d->insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
- Polish);
+ insert(event.startTime - event.numericData1, event.numericData1, event.typeIndex,
+ Polish);
break;
}
default: break;
}
- d->modelManager->modelProxyCountUpdated(d->modelId, count(), simpleModel->getEvents().count());
+ updateProgress(count(), simpleModel->getEvents().count());
}
computeNesting();
- d->flattenLoads();
- d->modelManager->modelProxyCountUpdated(d->modelId, 1, 1);
+ flattenLoads();
+ updateProgress(1, 1);
}
-void SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::flattenLoads()
+void SceneGraphTimelineModel::flattenLoads()
{
- Q_Q(SceneGraphTimelineModel);
- collapsedRowCount = 0;
+ int collapsedRowCount = 0;
// computes "compressed row"
QVector <qint64> eventEndTimes;
- for (int i = 0; i < q->count(); i++) {
- SceneGraphEvent &event = data[i];
- const Range &start = q->range(i);
+ for (int i = 0; i < count(); i++) {
+ SceneGraphEvent &event = m_data[i];
+ int stage = selectionId(i);
// Don't try to put render thread events in GUI row and vice versa.
// Rows below those are free for all.
- if (event.stage < MaximumGUIThreadStage)
+ if (stage < MaximumGUIThreadStage)
event.rowNumberCollapsed = SceneGraphGUIThread;
- else if (event.stage < MaximumRenderThreadStage)
+ else if (stage < MaximumRenderThreadStage)
event.rowNumberCollapsed = SceneGraphRenderThread;
else
event.rowNumberCollapsed = SceneGraphRenderThreadDetails;
while (eventEndTimes.count() > event.rowNumberCollapsed &&
- eventEndTimes[event.rowNumberCollapsed] > start.start)
+ eventEndTimes[event.rowNumberCollapsed] > startTime(i))
++event.rowNumberCollapsed;
while (eventEndTimes.count() <= event.rowNumberCollapsed)
eventEndTimes << 0; // increase stack length, proper value added below
- eventEndTimes[event.rowNumberCollapsed] = start.start + start.duration;
+ eventEndTimes[event.rowNumberCollapsed] = endTime(i);
// readjust to account for category empty row
event.rowNumberCollapsed++;
@@ -321,8 +261,8 @@ void SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::flattenLoads()
}
// Starting from 0, count is maxIndex+1
- collapsedRowCount++;
- expandedRowCount = MaximumSceneGraphStage + 1;
+ setCollapsedRowCount(collapsedRowCount + 1);
+ setExpandedRowCount(MaximumSceneGraphStage + 1);
}
/*!
@@ -330,19 +270,18 @@ void SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::flattenLoads()
* \a glyphCount (if it's a \c GlyphRender or \c GlyphStore event) into the scene graph model if its
* \a duration is greater than 0. Returns \a duration in that case; otherwise returns 0.
*/
-qint64 SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::insert(qint64 start,
- qint64 duration, int typeIndex, SceneGraphStage stage, int glyphCount)
+qint64 SceneGraphTimelineModel::insert(qint64 start, qint64 duration, int typeIndex,
+ SceneGraphStage stage, int glyphCount)
{
if (duration <= 0)
return 0;
- Q_Q(SceneGraphTimelineModel);
- data.insert(q->insert(start, duration, typeIndex), SceneGraphEvent(stage, glyphCount));
+ m_data.insert(QmlProfilerTimelineModel::insert(start, duration, stage),
+ SceneGraphEvent(typeIndex, glyphCount));
return duration;
}
-const char *SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::threadLabel(
- SceneGraphStage stage)
+const char *SceneGraphTimelineModel::threadLabel(SceneGraphStage stage)
{
if (stage < MaximumGUIThreadStage)
return ThreadLabels[SceneGraphGUIThread];
@@ -355,14 +294,12 @@ const char *SceneGraphTimelineModel::SceneGraphTimelineModelPrivate::threadLabel
void SceneGraphTimelineModel::clear()
{
- Q_D(SceneGraphTimelineModel);
- d->collapsedRowCount = 1;
- d->data.clear();
- AbstractTimelineModel::clear();
+ m_data.clear();
+ QmlProfilerTimelineModel::clear();
}
-SceneGraphTimelineModel::SceneGraphEvent::SceneGraphEvent(int stage, int glyphCount) :
- stage(stage), rowNumberCollapsed(-1), glyphCount(glyphCount)
+SceneGraphTimelineModel::SceneGraphEvent::SceneGraphEvent(int typeId, int glyphCount) :
+ typeId(typeId), rowNumberCollapsed(-1), glyphCount(glyphCount)
{
}