3 #include "loaderthread.h"
8 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
11 m_loader = new LoaderThread(this);
12 connect(m_loader, SIGNAL(parsedFrames(const QList<ApiTraceFrame*>)),
13 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
14 connect(m_loader, SIGNAL(started()),
15 this, SIGNAL(startedLoadingTrace()));
16 connect(m_loader, SIGNAL(finished()),
17 this, SIGNAL(finishedLoadingTrace()));
27 bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
28 ApiTrace::FrameMarker marker)
34 case FrameMarker_SwapBuffers:
35 return call->name().contains(QLatin1String("SwapBuffers"));
36 case FrameMarker_Flush:
37 return call->name() == QLatin1String("glFlush");
38 case FrameMarker_Finish:
39 return call->name() == QLatin1String("glFinish");
40 case FrameMarker_Clear:
41 return call->name() == QLatin1String("glClear");
44 Q_ASSERT(!"unknown frame marker");
49 bool ApiTrace::isEmpty() const
51 return m_calls.isEmpty();
54 QString ApiTrace::fileName() const
57 return m_tempFileName;
62 ApiTrace::FrameMarker ApiTrace::frameMarker() const
67 QList<ApiTraceCall*> ApiTrace::calls() const
72 ApiTraceCall * ApiTrace::callAt(int idx) const
74 return m_calls.value(idx);
77 int ApiTrace::numCalls() const
79 return m_calls.count();
82 QList<ApiTraceFrame*> ApiTrace::frames() const
87 ApiTraceFrame * ApiTrace::frameAt(int idx) const
89 return m_frames.value(idx);
92 int ApiTrace::numFrames() const
94 return m_frames.count();
97 int ApiTrace::numCallsInFrame(int idx) const
99 const ApiTraceFrame *frame = frameAt(idx);
101 return frame->calls.count();
106 void ApiTrace::setFileName(const QString &name)
108 if (m_fileName != name) {
111 if (m_loader->isRunning()) {
112 m_loader->terminate();
119 m_loader->loadFile(m_fileName);
123 void ApiTrace::setFrameMarker(FrameMarker marker)
125 if (m_frameMarker != marker) {
126 emit framesInvalidated();
128 qDeleteAll(m_frames);
134 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
136 int currentFrames = m_frames.count();
137 int numNewFrames = frames.count();
140 int currentCalls = m_calls.count();
142 foreach(ApiTraceFrame *frame, frames) {
143 frame->setParentTrace(this);
144 numNewCalls += frame->calls.count();
145 m_calls += frame->calls;
148 emit framesAdded(currentFrames, numNewFrames);
149 emit callsAdded(currentCalls, numNewCalls);
152 void ApiTrace::detectFrames()
154 if (m_calls.isEmpty())
157 ApiTraceFrame *currentFrame = 0;
158 foreach(ApiTraceCall *apiCall, m_calls) {
160 currentFrame = new ApiTraceFrame();
161 currentFrame->setParentTrace(this);
162 currentFrame->number = m_frames.count();
164 apiCall->setParentFrame(currentFrame);
165 currentFrame->calls.append(apiCall);
166 if (ApiTrace::isCallAFrameMarker(apiCall,
168 m_frames.append(currentFrame);
172 //last frames won't have markers
173 // it's just a bunch of Delete calls for every object
174 // after the last SwapBuffers
176 m_frames.append(currentFrame);
179 emit framesAdded(0, m_frames.count());
182 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
184 for (int i = 0; i < m_calls.count(); ++i) {
185 ApiTraceCall *call = m_calls[i];
186 if (call->index() == idx)
192 ApiTraceState ApiTrace::defaultState() const
194 ApiTraceFrame *frame = frameAt(0);
196 return ApiTraceState();
198 return frame->state();
201 void ApiTrace::callEdited(ApiTraceCall *call)
203 if (!m_editedCalls.contains(call)) {
204 //lets generate a temp filename
205 QString tempPath = QDir::tempPath();
206 //lets make sure it exists
207 m_tempFileName = QString::fromLatin1("%1/%2.edited")
210 m_needsSaving = true;
213 m_editedCalls.insert(call);
218 void ApiTrace::callReverted(ApiTraceCall *call)
220 m_editedCalls.remove(call);
222 if (m_editedCalls.isEmpty()) {
223 m_needsSaving = false;
228 bool ApiTrace::edited() const
230 return !m_editedCalls.isEmpty();
233 bool ApiTrace::needsSaving() const
235 return m_needsSaving;
238 void ApiTrace::save()
240 QFileInfo fi(m_tempFileName);
242 dir.mkpath(fi.absolutePath());
243 m_needsSaving = false;
246 #include "apitrace.moc"