QmlProfiler: Add a QmlTypedEvent and extend QmlEvent

The QmlTypedEvent is mainly useful to read a generic QmlEvent and
QmlEventType from a QPacket. QmlEventType has a stream operator to do
exactly that. QmlEvent also gets further options to store 32-bit data
in addition to 64- and 8-bit data. Also, with the more generic storage
layout we can reduce the memory consumption of range events by 50%.
This comes at the cost of additional memory allocations for non-range
events, but as non-range events are significantly less frequent than
range events, this is a good tradeoff. Finally the new storage layout
lends itself to efficient serialization, which will help when
developing new storage and transfer formats for QML traces.

Change-Id: I420de68b0142f23c8fb2ca8b329d7ffe69c83fe0
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
Ulf Hermann
2016-04-28 15:57:12 +02:00
parent 61d94c5ccd
commit 8d15633a22
13 changed files with 541 additions and 160 deletions

View File

@@ -150,71 +150,79 @@ void SceneGraphTimelineModel::loadData()
// look incomplete if that was left out as the printf profiler lists it, too, and people
// are apparently comparing that. Unfortunately it is somewhat redundant as the other
// parts of the breakdown are usually very short.
qint64 startTime = event.timestamp() - event.numericData(0) - event.numericData(1) -
event.numericData(2) - event.numericData(3);
startTime += insert(startTime, event.numericData(0), event.typeIndex(), RenderPreprocess);
startTime += insert(startTime, event.numericData(1), event.typeIndex(), RenderUpdate);
startTime += insert(startTime, event.numericData(2), event.typeIndex(), RenderBind);
insert(startTime, event.numericData(3), event.typeIndex(), RenderRender);
qint64 startTime = event.timestamp() - event.number<qint64>(0) - event.number<qint64>(1)
- event.number<qint64>(2) - event.number<qint64>(3);
startTime += insert(startTime, event.number<qint64>(0), event.typeIndex(),
RenderPreprocess);
startTime += insert(startTime, event.number<qint64>(1), event.typeIndex(),
RenderUpdate);
startTime += insert(startTime, event.number<qint64>(2), event.typeIndex(), RenderBind);
insert(startTime, event.number<qint64>(3), event.typeIndex(), RenderRender);
break;
}
case SceneGraphAdaptationLayerFrame: {
qint64 startTime = event.timestamp() - event.numericData(1) - event.numericData(2);
startTime += insert(startTime, event.numericData(1), event.typeIndex(), GlyphRender,
event.numericData(0));
insert(startTime, event.numericData(2), event.typeIndex(), GlyphStore, event.numericData(0));
qint64 startTime = event.timestamp() - event.number<qint64>(1)
- event.number<qint64>(2);
startTime += insert(startTime, event.number<qint64>(1), event.typeIndex(), GlyphRender,
event.number<qint64>(0));
insert(startTime, event.number<qint64>(2), event.typeIndex(), GlyphStore,
event.number<qint64>(0));
break;
}
case SceneGraphContextFrame: {
insert(event.timestamp() - event.numericData(0), event.numericData(0), event.typeIndex(),
Material);
insert(event.timestamp() - event.number<qint64>(0), event.number<qint64>(0),
event.typeIndex(), Material);
break;
}
case SceneGraphRenderLoopFrame: {
qint64 startTime = event.timestamp() - event.numericData(0) - event.numericData(1) -
event.numericData(2);
startTime += insert(startTime, event.numericData(0), event.typeIndex(),
RenderThreadSync);
startTime += insert(startTime, event.numericData(1), event.typeIndex(),
Render);
insert(startTime, event.numericData(2), event.typeIndex(), Swap);
qint64 startTime = event.timestamp() - event.number<qint64>(0) - event.number<qint64>(1)
- event.number<qint64>(2);
startTime += insert(startTime, event.number<qint64>(0), event.typeIndex(),
RenderThreadSync);
startTime += insert(startTime, event.number<qint64>(1), event.typeIndex(),
Render);
insert(startTime, event.number<qint64>(2), event.typeIndex(), Swap);
break;
}
case SceneGraphTexturePrepare: {
qint64 startTime = event.timestamp() - event.numericData(0) - event.numericData(1) -
event.numericData(2) - event.numericData(3) - event.numericData(4);
startTime += insert(startTime, event.numericData(0), event.typeIndex(), TextureBind);
startTime += insert(startTime, event.numericData(1), event.typeIndex(), TextureConvert);
startTime += insert(startTime, event.numericData(2), event.typeIndex(), TextureSwizzle);
startTime += insert(startTime, event.numericData(3), event.typeIndex(), TextureUpload);
insert(startTime, event.numericData(4), event.typeIndex(), TextureMipmap);
qint64 startTime = event.timestamp() - event.number<qint64>(0) - event.number<qint64>(1)
- event.number<qint64>(2) - event.number<qint64>(3) - event.number<qint64>(4);
startTime += insert(startTime, event.number<qint64>(0), event.typeIndex(), TextureBind);
startTime += insert(startTime, event.number<qint64>(1), event.typeIndex(),
TextureConvert);
startTime += insert(startTime, event.number<qint64>(2), event.typeIndex(),
TextureSwizzle);
startTime += insert(startTime, event.number<qint64>(3), event.typeIndex(),
TextureUpload);
insert(startTime, event.number<qint64>(4), event.typeIndex(), TextureMipmap);
break;
}
case SceneGraphTextureDeletion: {
insert(event.timestamp() - event.numericData(0), event.numericData(0), event.typeIndex(),
TextureDeletion);
insert(event.timestamp() - event.number<qint64>(0), event.number<qint64>(0),
event.typeIndex(), TextureDeletion);
break;
}
case SceneGraphPolishAndSync: {
qint64 startTime = event.timestamp() - event.numericData(0) - event.numericData(1) -
event.numericData(2) - event.numericData(3);
qint64 startTime = event.timestamp() - event.number<qint64>(0) - event.number<qint64>(1)
- event.number<qint64>(2) - event.number<qint64>(3);
startTime += insert(startTime, event.numericData(0), event.typeIndex(), Polish);
startTime += insert(startTime, event.numericData(1), event.typeIndex(), Wait);
startTime += insert(startTime, event.numericData(2), event.typeIndex(), GUIThreadSync);
insert(startTime, event.numericData(3), event.typeIndex(), Animations);
startTime += insert(startTime, event.number<qint64>(0), event.typeIndex(), Polish);
startTime += insert(startTime, event.number<qint64>(1), event.typeIndex(), Wait);
startTime += insert(startTime, event.number<qint64>(2), event.typeIndex(),
GUIThreadSync);
insert(startTime, event.number<qint64>(3), event.typeIndex(), Animations);
break;
}
case SceneGraphWindowsAnimations: {
// GUI thread, separate animations stage
insert(event.timestamp() - event.numericData(0), event.numericData(0), event.typeIndex(),
Animations);
insert(event.timestamp() - event.number<qint64>(0), event.number<qint64>(0),
event.typeIndex(), Animations);
break;
}
case SceneGraphPolishFrame: {
// GUI thread, separate polish stage
insert(event.timestamp() - event.numericData(0), event.numericData(0), event.typeIndex(),
Polish);
insert(event.timestamp() - event.number<qint64>(0), event.number<qint64>(0),
event.typeIndex(), Polish);
break;
}
default: break;