aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/qmlprofiler/qmlprofilertracefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/qmlprofiler/qmlprofilertracefile.cpp')
-rw-r--r--plugins/qmlprofiler/qmlprofilertracefile.cpp105
1 files changed, 97 insertions, 8 deletions
diff --git a/plugins/qmlprofiler/qmlprofilertracefile.cpp b/plugins/qmlprofiler/qmlprofilertracefile.cpp
index 4ad00ce02c5..52bc3816d36 100644
--- a/plugins/qmlprofiler/qmlprofilertracefile.cpp
+++ b/plugins/qmlprofiler/qmlprofilertracefile.cpp
@@ -48,6 +48,8 @@ const char TYPE_COMPILING_STR[] = "Compiling";
const char TYPE_CREATING_STR[] = "Creating";
const char TYPE_BINDING_STR[] = "Binding";
const char TYPE_HANDLINGSIGNAL_STR[] = "HandlingSignal";
+const char TYPE_PIXMAPCACHE_STR[] = "PixmapCache";
+const char TYPE_SCENEGRAPH_STR[] = "SceneGraph";
#define _(X) QLatin1String(X)
@@ -71,6 +73,10 @@ static QmlEventType qmlEventTypeAsEnum(const QString &typeString)
return Binding;
} else if (typeString == _(TYPE_HANDLINGSIGNAL_STR)) {
return HandlingSignal;
+ } else if (typeString == _(TYPE_PIXMAPCACHE_STR)) {
+ return PixmapCacheEvent;
+ } else if (typeString == _(TYPE_SCENEGRAPH_STR)) {
+ return SceneGraphFrameEvent;
} else {
bool isNumber = false;
int type = typeString.toUInt(&isNumber);
@@ -99,6 +105,12 @@ static QString qmlEventTypeAsString(QmlEventType typeEnum)
case HandlingSignal:
return _(TYPE_HANDLINGSIGNAL_STR);
break;
+ case PixmapCacheEvent:
+ return _(TYPE_PIXMAPCACHE_STR);
+ break;
+ case SceneGraphFrameEvent:
+ return _(TYPE_SCENEGRAPH_STR);
+ break;
default:
return QString::number((int)typeEnum);
}
@@ -249,7 +261,10 @@ void QmlProfilerFileReader::loadEventData(QXmlStreamReader &stream)
break;
}
- if (elementName == _("bindingType")) {
+ if (elementName == _("bindingType") ||
+ elementName == _("animationFrame") ||
+ elementName == _("cacheEventType") ||
+ elementName == _("sgEventType")) {
event.bindingType = readData.toInt();
break;
}
@@ -288,20 +303,45 @@ void QmlProfilerFileReader::loadProfilerDataModel(QXmlStreamReader &stream)
switch (token) {
case QXmlStreamReader::StartElement: {
if (elementName == _("range")) {
- Range range = { 0, 0 };
+ Range range = { 0, 0, 0, 0, 0, 0, 0 };
const QXmlStreamAttributes attributes = stream.attributes();
if (!attributes.hasAttribute(_("startTime"))
- || !attributes.hasAttribute(_("duration"))
|| !attributes.hasAttribute(_("eventIndex"))) {
// ignore incomplete entry
continue;
}
range.startTime = attributes.value(_("startTime")).toString().toLongLong();
- range.duration = attributes.value(_("duration")).toString().toLongLong();
+ if (attributes.hasAttribute(_("duration")))
+ range.duration = attributes.value(_("duration")).toString().toLongLong();
+
+ // attributes for special events
+ if (attributes.hasAttribute(_("framerate")))
+ range.numericData1 = attributes.value(_("framerate")).toString().toLongLong();
+ if (attributes.hasAttribute(_("animationcount")))
+ range.numericData2 = attributes.value(_("animationcount")).toString().toLongLong();
+ if (attributes.hasAttribute(_("width")))
+ range.numericData1 = attributes.value(_("width")).toString().toLongLong();
+ if (attributes.hasAttribute(_("height")))
+ range.numericData2 = attributes.value(_("height")).toString().toLongLong();
+ if (attributes.hasAttribute(_("refCount")))
+ range.numericData3 = attributes.value(_("refCount")).toString().toLongLong();
+ if (attributes.hasAttribute(_("timing1")))
+ range.numericData1 = attributes.value(_("timing1")).toString().toLongLong();
+ if (attributes.hasAttribute(_("timing2")))
+ range.numericData2 = attributes.value(_("timing2")).toString().toLongLong();
+ if (attributes.hasAttribute(_("timing3")))
+ range.numericData3 = attributes.value(_("timing3")).toString().toLongLong();
+ if (attributes.hasAttribute(_("timing4")))
+ range.numericData4 = attributes.value(_("timing4")).toString().toLongLong();
+ if (attributes.hasAttribute(_("timing5")))
+ range.numericData5 = attributes.value(_("timing5")).toString().toLongLong();
+
+
int eventIndex = attributes.value(_("eventIndex")).toString().toInt();
+
m_ranges.append(QPair<Range,int>(range, eventIndex));
}
break;
@@ -332,10 +372,18 @@ void QmlProfilerFileReader::processQmlEvents()
QmlEvent &event = m_qmlEvents[eventIndex];
- emit rangedEvent(event.type, event.bindingType, range.startTime, range.duration,
+ if (event.type == Painting && event.bindingType == QmlDebug::AnimationFrame) {
+ emit frame(range.startTime, range.numericData1, range.numericData2);
+ } else if (event.type == PixmapCacheEvent) {
+ emit pixmapCacheEvent(range.startTime, event.bindingType, event.filename, range.numericData1, range.numericData2, range.numericData3);
+ } else if (event.type == SceneGraphFrameEvent) {
+ emit sceneGraphFrame(SceneGraphFrameEvent, event.bindingType, range.startTime, range.numericData1, range.numericData2, range.numericData3, range.numericData4, range.numericData5);
+ } else {
+ emit rangedEvent(event.type, event.bindingType, range.startTime, range.duration,
QStringList(event.displayName), QmlEventLocation(event.filename,
event.line,
event.column));
+ }
}
}
@@ -377,7 +425,7 @@ void QmlProfilerFileWriter::setQmlEvents(const QVector<QmlProfilerSimpleModel::Q
m_qmlEvents.insert(hashStr, e);
}
- Range r = { event.startTime, event.duration, };
+ Range r = { event.startTime, event.duration, event.numericData1, event.numericData2, event.numericData3, event.numericData4, event.numericData5 };
m_ranges.append(QPair<Range, QString>(r, hashStr));
}
@@ -415,7 +463,13 @@ void QmlProfilerFileWriter::save(QIODevice *device)
}
stream.writeTextElement(_("details"), event.details);
if (event.type == Binding)
- stream.writeTextElement(_("bindingType"), QString::number((int)event.bindingType));
+ stream.writeTextElement(_("bindingType"), QString::number(event.bindingType));
+ if (event.type == Painting && event.bindingType == AnimationFrame)
+ stream.writeTextElement(_("animationFrame"), QString::number(event.bindingType));
+ if (event.type == PixmapCacheEvent)
+ stream.writeTextElement(_("cacheEventType"), QString::number(event.bindingType));
+ if (event.type == SceneGraphFrameEvent)
+ stream.writeTextElement(_("sgEventType"), QString::number(event.bindingType));
stream.writeEndElement();
}
stream.writeEndElement(); // eventData
@@ -429,10 +483,45 @@ void QmlProfilerFileWriter::save(QIODevice *device)
stream.writeStartElement(_("range"));
stream.writeAttribute(_("startTime"), QString::number(range.startTime));
- stream.writeAttribute(_("duration"), QString::number(range.duration));
+ if (range.duration > 0) // no need to store duration of instantaneous events
+ stream.writeAttribute(_("duration"), QString::number(range.duration));
stream.writeAttribute(_("eventIndex"), QString::number(m_qmlEvents.keys().indexOf(eventHash)));
QmlEvent event = m_qmlEvents.value(eventHash);
+
+ // special: animation event
+ if (event.type == QmlDebug::Painting && event.bindingType == QmlDebug::AnimationFrame) {
+
+ stream.writeAttribute(_("framerate"), QString::number(range.numericData1));
+ stream.writeAttribute(_("animationcount"), QString::number(range.numericData2));
+ }
+
+ // special: pixmap cache event
+ if (event.type == QmlDebug::PixmapCacheEvent) {
+ // pixmap image size
+ if (event.bindingType == 0) {
+ stream.writeAttribute(_("width"), QString::number(range.numericData1));
+ stream.writeAttribute(_("height"), QString::number(range.numericData2));
+ }
+
+ // reference count (1) / cache size changed (2)
+ if (event.bindingType == 1 || event.bindingType == 2)
+ stream.writeAttribute(_("refCount"), QString::number(range.numericData3));
+ }
+
+ if (event.type == QmlDebug::SceneGraphFrameEvent) {
+ // special: scenegraph frame events
+ if (range.numericData1 > 0)
+ stream.writeAttribute(_("timing1"), QString::number(range.numericData1));
+ if (range.numericData2 > 0)
+ stream.writeAttribute(_("timing2"), QString::number(range.numericData2));
+ if (range.numericData3 > 0)
+ stream.writeAttribute(_("timing3"), QString::number(range.numericData3));
+ if (range.numericData4 > 0)
+ stream.writeAttribute(_("timing4"), QString::number(range.numericData4));
+ if (range.numericData5 > 0)
+ stream.writeAttribute(_("timing5"), QString::number(range.numericData5));
+ }
// if (event.type == QmlDebug::Painting && range.animationCount >= 0) {
// // animation frame
// stream.writeAttribute(_("framerate"), QString::number(rangedEvent.frameRate));