3 #include "loaderthread.h"
4 #include "saverthread.h"
9 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
12 m_loader = new LoaderThread(this);
13 connect(m_loader, SIGNAL(parsedFrames(const QList<ApiTraceFrame*>)),
14 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
15 connect(m_loader, SIGNAL(started()),
16 this, SIGNAL(startedLoadingTrace()));
17 connect(m_loader, SIGNAL(finished()),
18 this, SIGNAL(finishedLoadingTrace()));
20 m_saver = new SaverThread(this);
31 bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
32 ApiTrace::FrameMarker marker)
38 case FrameMarker_SwapBuffers:
39 return call->name().contains(QLatin1String("SwapBuffers"));
40 case FrameMarker_Flush:
41 return call->name() == QLatin1String("glFlush");
42 case FrameMarker_Finish:
43 return call->name() == QLatin1String("glFinish");
44 case FrameMarker_Clear:
45 return call->name() == QLatin1String("glClear");
48 Q_ASSERT(!"unknown frame marker");
53 bool ApiTrace::isEmpty() const
55 return m_calls.isEmpty();
58 QString ApiTrace::fileName() const
61 return m_tempFileName;
66 ApiTrace::FrameMarker ApiTrace::frameMarker() const
71 QList<ApiTraceCall*> ApiTrace::calls() const
76 ApiTraceCall * ApiTrace::callAt(int idx) const
78 return m_calls.value(idx);
81 int ApiTrace::numCalls() const
83 return m_calls.count();
86 QList<ApiTraceFrame*> ApiTrace::frames() const
91 ApiTraceFrame * ApiTrace::frameAt(int idx) const
93 return m_frames.value(idx);
96 int ApiTrace::numFrames() const
98 return m_frames.count();
101 int ApiTrace::numCallsInFrame(int idx) const
103 const ApiTraceFrame *frame = frameAt(idx);
105 return frame->calls.count();
110 void ApiTrace::setFileName(const QString &name)
112 if (m_fileName != name) {
115 if (m_loader->isRunning()) {
116 m_loader->terminate();
123 m_loader->loadFile(m_fileName);
127 void ApiTrace::setFrameMarker(FrameMarker marker)
129 if (m_frameMarker != marker) {
130 emit framesInvalidated();
132 qDeleteAll(m_frames);
138 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
140 int currentFrames = m_frames.count();
141 int numNewFrames = frames.count();
144 int currentCalls = m_calls.count();
146 foreach(ApiTraceFrame *frame, frames) {
147 frame->setParentTrace(this);
148 numNewCalls += frame->calls.count();
149 m_calls += frame->calls;
152 emit framesAdded(currentFrames, numNewFrames);
153 emit callsAdded(currentCalls, numNewCalls);
156 void ApiTrace::detectFrames()
158 if (m_calls.isEmpty())
161 ApiTraceFrame *currentFrame = 0;
162 foreach(ApiTraceCall *apiCall, m_calls) {
164 currentFrame = new ApiTraceFrame();
165 currentFrame->setParentTrace(this);
166 currentFrame->number = m_frames.count();
168 apiCall->setParentFrame(currentFrame);
169 currentFrame->calls.append(apiCall);
170 if (ApiTrace::isCallAFrameMarker(apiCall,
172 m_frames.append(currentFrame);
176 //last frames won't have markers
177 // it's just a bunch of Delete calls for every object
178 // after the last SwapBuffers
180 m_frames.append(currentFrame);
183 emit framesAdded(0, m_frames.count());
186 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
188 for (int i = 0; i < m_calls.count(); ++i) {
189 ApiTraceCall *call = m_calls[i];
190 if (call->index() == idx)
196 ApiTraceState ApiTrace::defaultState() const
198 ApiTraceFrame *frame = frameAt(0);
200 return ApiTraceState();
202 return frame->state();
205 void ApiTrace::callEdited(ApiTraceCall *call)
207 if (!m_editedCalls.contains(call)) {
208 //lets generate a temp filename
209 QString tempPath = QDir::tempPath();
210 //lets make sure it exists
211 m_tempFileName = QString::fromLatin1("%1/%2.edited")
214 m_needsSaving = true;
217 m_editedCalls.insert(call);
222 void ApiTrace::callReverted(ApiTraceCall *call)
224 m_editedCalls.remove(call);
226 if (m_editedCalls.isEmpty()) {
227 m_needsSaving = false;
232 bool ApiTrace::edited() const
234 return !m_editedCalls.isEmpty();
237 bool ApiTrace::needsSaving() const
239 return m_needsSaving;
242 void ApiTrace::save()
244 QFileInfo fi(m_tempFileName);
246 dir.mkpath(fi.absolutePath());
247 m_needsSaving = false;
249 m_saver->saveFile(m_tempFileName, m_calls);
252 #include "apitrace.moc"