switch (marker) {
case FrameMarker_SwapBuffers:
- return call->name().contains(QLatin1String("SwapBuffers"));
+ return call->name().contains(QLatin1String("SwapBuffers")) ||
+ call->name() == QLatin1String("CGLFlushDrawable") ||
+ call->name() == QLatin1String("glFrameTerminatorGREMEDY");
case FrameMarker_Flush:
return call->name() == QLatin1String("glFlush");
case FrameMarker_Finish:
{
const ApiTraceFrame *frame = frameAt(idx);
if (frame)
- return frame->calls.count();
+ return frame->numChildren();
else
return 0;
}
}
m_frames.clear();
m_calls.clear();
+ m_errors.clear();
+ m_editedCalls.clear();
+ m_needsSaving = false;
emit invalidated();
m_loader->loadFile(m_fileName);
void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
{
+ QList<ApiTraceCall*> calls;
int currentFrames = m_frames.count();
int numNewFrames = frames.count();
+
+ emit beginAddingFrames(currentFrames, numNewFrames);
+
m_frames += frames;
int currentCalls = m_calls.count();
int numNewCalls = 0;
foreach(ApiTraceFrame *frame, frames) {
- frame->setParentTrace(this);
- numNewCalls += frame->calls.count();
- m_calls += frame->calls;
+ Q_ASSERT(this == frame->parentTrace());
+ numNewCalls += frame->numChildren();
+ calls += frame->calls();
}
+ m_calls.reserve(m_calls.count() + calls.count());
+ m_calls += calls;
- emit framesAdded(currentFrames, numNewFrames);
+ emit endAddingFrames();
emit callsAdded(currentCalls, numNewCalls);
}
if (m_calls.isEmpty())
return;
+ emit beginAddingFrames(0, m_frames.count());
+
ApiTraceFrame *currentFrame = 0;
foreach(ApiTraceCall *apiCall, m_calls) {
if (!currentFrame) {
- currentFrame = new ApiTraceFrame();
- currentFrame->setParentTrace(this);
+ currentFrame = new ApiTraceFrame(this);
currentFrame->number = m_frames.count();
}
apiCall->setParentFrame(currentFrame);
- currentFrame->calls.append(apiCall);
+ currentFrame->addCall(apiCall);
if (ApiTrace::isCallAFrameMarker(apiCall,
m_frameMarker)) {
m_frames.append(currentFrame);
m_frames.append(currentFrame);
currentFrame = 0;
}
- emit framesAdded(0, m_frames.count());
+ emit endAddingFrames();
}
ApiTraceCall * ApiTrace::callWithIndex(int idx) const
ApiTraceState ApiTrace::defaultState() const
{
ApiTraceFrame *frame = frameAt(0);
- if (!frame)
+ if (!frame || !frame->hasState())
return ApiTraceState();
- return frame->state();
+ return *frame->state();
}
void ApiTrace::callEdited(ApiTraceCall *call)
return m_saver->isRunning();
}
+void ApiTrace::callError(ApiTraceCall *call)
+{
+ Q_ASSERT(call);
+
+ if (call->hasError())
+ m_errors.insert(call);
+ else
+ m_errors.remove(call);
+
+ emit changed(call);
+}
+
+bool ApiTrace::hasErrors() const
+{
+ return !m_errors.isEmpty();
+}
+
+ApiTraceCallSignature * ApiTrace::signature(unsigned id)
+{
+ if (id >= m_signatures.count()) {
+ m_signatures.resize(id + 1);
+ return NULL;
+ } else {
+ return m_signatures[id];
+ }
+}
+
+void ApiTrace::addSignature(unsigned id, ApiTraceCallSignature *signature)
+{
+ m_signatures[id] = signature;
+}
+
#include "apitrace.moc"