- Trace::Call *call;
-
- while ((call = parser.parse_call())) {
- const std::string &name = call->name();
-
- if ((name[0] == 'w' && name[1] == 'g' && name[2] == 'l') ||
- (name[0] == 'g' && name[1] == 'l' && name[2] == 'X')) {
- // XXX: We ignore the majority of the OS-specific calls for now
- if (name == "glXSwapBuffers" ||
- name == "wglSwapBuffers") {
- if (retrace::verbosity >= 1) {
- std::cout << *call;
- std::cout.flush();
- };
- frame_complete();
- if (double_buffer)
- drawable->swapBuffers();
- else
- glFlush();
- } else if (name == "glXMakeCurrent" ||
- name == "wglMakeCurrent") {
- glFlush();
- if (!double_buffer) {
- frame_complete();
- }
+ retrace::Retracer retracer;
+
+ retracer.addCallbacks(gl_callbacks);
+ retracer.addCallbacks(glx_callbacks);
+ retracer.addCallbacks(wgl_callbacks);
+ retracer.addCallbacks(cgl_callbacks);
+ retracer.addCallbacks(egl_callbacks);
+
+ startTime = os::getTime();
+ trace::Call *call;
+
+ while ((call = retrace::parser.parse_call())) {
+ bool swapRenderTarget = call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET;
+ bool doSnapshot =
+ snapshot_frequency.contains(*call) ||
+ compare_frequency.contains(*call)
+ ;
+
+ // For calls which cause rendertargets to be swaped, we take the
+ // snapshot _before_ swapping the rendertargets.
+ if (doSnapshot && swapRenderTarget) {
+ if (call->flags & trace::CALL_FLAG_END_FRAME) {
+ // For swapbuffers/presents we still use this call number,
+ // spite not have been executed yet.
+ snapshot(call->no);