]> git.cworth.org Git - apitrace/commitdiff
Merge branch 'master' into d3dretrace
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 17 Mar 2012 22:43:27 +0000 (22:43 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 17 Mar 2012 22:43:27 +0000 (22:43 +0000)
1  2 
CMakeLists.txt
glretrace.hpp
glretrace_main.cpp
retrace.cpp
retrace.hpp

diff --combined CMakeLists.txt
index a141e10abfdba92b4f2d48c7ba58a51b5af88c78,7308fb24bfee07e446c17ad8e24a59d2e567a617..35d9a7848560cb8d77d89beca9f3b8fc40224848
@@@ -17,20 -17,28 +17,28 @@@ endif (
  # prescribed in http://www.gentoo.org/proj/en/qa/automagic.xml
  set (ENABLE_GUI "AUTO" CACHE STRING "Enable Qt GUI.")
  
- set (ENABLE_EGL "AUTO" CACHE STRING "Enable EGL support.")
+ set (ENABLE_CLI true CACHE BOOL "Enable command Line interface.")
+ set (ENABLE_EGL true CACHE BOOL "Enable EGL support.")
  
  
  ##############################################################################
  # Find dependencies
  
- include (FindPkgConfig)
  set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
  
  set (CMAKE_USE_PYTHON_VERSION 2.7 2.6)
  
- find_package (PythonInterp REQUIRED)
- find_package (OpenGL REQUIRED)
+ if (ANDROID)
+     set (ENABLE_GUI false)
+ else ()
+     macro (find_host_package)
+         find_package (${ARGN})
+     endmacro()
+ endif ()
+ find_host_package (PythonInterp REQUIRED)
+ find_package (Threads)
  
  if (ENABLE_GUI)
      if (NOT (ENABLE_GUI STREQUAL "AUTO"))
      find_package (QJSON ${REQUIRE_GUI})
  endif ()
  
- include_directories (${OPENGL_INCLUDE_DIR})
  if (WIN32)
      find_package (DirectX)
+     set (ENABLE_EGL false)
  elseif (APPLE)
+     set (ENABLE_EGL false)
  else ()
      find_package (X11)
  
      endif ()
  
      if (ENABLE_EGL)
-         if (NOT ENABLE_EGL STREQUAL "AUTO")
-             set (REQUIRE_EGL REQUIRED)
-         endif ()
-         pkg_check_modules (EGL egl glesv1_cm glesv2 ${REQUIRE_EGL})
-         if (EGL_FOUND)
-             include_directories (${EGL_INCLUDE_DIR})
-             add_definitions (-DHAVE_EGL)
-         endif ()
-     else ()
-         set (EGL_FOUND 0)
+         add_definitions (-DHAVE_EGL)
      endif ()
  endif ()
  
@@@ -74,9 -73,6 +73,6 @@@
  include (CheckCXXCompilerFlag)
  
  if (WIN32)
-     # MSVC & MinGW only define & use APIENTRY
-     add_definitions (-DGLAPIENTRY=__stdcall)
      # http://msdn.microsoft.com/en-us/library/aa383745.aspx
      add_definitions (-D_WIN32_WINNT=0x0500 -DWINVER=0x0500)
  else (WIN32)
@@@ -160,14 -156,12 +156,12 @@@ set (ZLIB_LIBRARIES z_bundled
  add_subdirectory (thirdparty/zlib EXCLUDE_FROM_ALL)
  
  include_directories (${ZLIB_INCLUDE_DIRS})
- link_libraries (${ZLIB_LIBRARIES})
  
  set (SNAPPY_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/snappy)
  set (SNAPPY_LIBRARIES snappy_bundled)
  add_subdirectory (thirdparty/snappy EXCLUDE_FROM_ALL)
  
  include_directories (${SNAPPY_INCLUDE_DIRS})
- link_libraries (${SNAPPY_LIBRARIES})
  
  set (PNG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpng)
  set (PNG_DEFINITIONS "")
@@@ -176,7 -170,16 +170,16 @@@ set (PNG_LIBRARIES png_bundled
  add_subdirectory (thirdparty/libpng EXCLUDE_FROM_ALL)
  include_directories (${PNG_INCLUDE_DIR})
  add_definitions (${PNG_DEFINITIONS})
- link_libraries (${PNG_LIBRARIES})
+ if (MSVC)
+     add_subdirectory (thirdparty/getopt EXCLUDE_FROM_ALL)
+     include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/getopt)
+     set (GETOPT_LIBRARIES getopt_bundled)
+ endif ()
+ if (WIN32)
+     add_subdirectory (thirdparty/less)
+ endif ()
  
  # The Qt website provides binaries for Windows and MacOSX, and they are
  # automatically found by cmake without any manual intervention.  The situation
@@@ -195,12 -198,11 +198,11 @@@ if (QT4_FOUND AND NOT QJSON_FOUND AND (
      set (QJSON_FOUND TRUE)
  endif ()
  
- # For glext headers.  Needs to be before system includes as often system's GL
- # headers bundle and include glext.h and glxext.h
- include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glext)
- # For EGL headers
- include_directories (${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/khr)
+ # We use bundled headers for all Khronos APIs, to guarantee support for both
+ # OpenGL and OpenGL ES at build time, because the OpenGL and OpenGL ES 1 APIs
+ # are so intertwined that conditional compilation extremely difficult. This
+ # also avoids missing/inconsistent declarations in system headers.
+ include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/khronos)
  
  ##############################################################################
  # Installation directories
@@@ -209,22 -211,14 +211,14 @@@ if (WIN32 OR APPLE
      # On Windows/MacOSX, applications are usually installed on a directory of
      # their own
      set (DOC_INSTALL_DIR doc)
+     set (LIB_INSTALL_DIR lib)
  else ()
      set (DOC_INSTALL_DIR share/doc/${CMAKE_PROJECT_NAME})
- endif ()
- set (LIB_INSTALL_DIR lib/apitrace)
- if (APPLE)
-     # MacOSX uses fat binaries, so no need to have per-architecture wrapper
-     # directories
-     set (LIB_ARCH_INSTALL_DIR ${LIB_INSTALL_DIR})
- else ()
-     set (LIB_ARCH_INSTALL_DIR ${LIB_INSTALL_DIR}/${CMAKE_SYSTEM_PROCESSOR})
+     set (LIB_INSTALL_DIR lib/${CMAKE_PROJECT_NAME})
  endif ()
  
  set(SCRIPTS_INSTALL_DIR ${LIB_INSTALL_DIR}/scripts)
- set(WRAPPER_INSTALL_DIR ${LIB_ARCH_INSTALL_DIR}/wrappers)
+ set(WRAPPER_INSTALL_DIR ${LIB_INSTALL_DIR}/wrappers)
  
  # Expose the binary/install directories to source
  #
@@@ -271,6 -265,7 +265,7 @@@ else (
  endif ()
  
  add_library (common STATIC
+     common/trace_callset.cpp
      common/trace_dump.cpp
      common/trace_file.cpp
      common/trace_file_read.cpp
@@@ -299,7 -294,9 +294,9 @@@ set_target_properties (common PROPERTIE
      COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS}"
  )
  
- link_libraries (common)
+ if (ANDROID)
+     target_link_libraries (common log)
+ endif ()
  
  
  ##############################################################################
@@@ -320,6 -317,11 +317,11 @@@ if (WIN32
              DEPENDS ddrawtrace.py trace.py specs/d3d.py specs/d3dtypes.py specs/d3dcaps.py specs/ddraw.py specs/winapi.py specs/stdapi.py
          )
          add_library (ddraw MODULE specs/ddraw.def ddrawtrace.cpp)
+         target_link_libraries (ddraw
+             common
+             ${ZLIB_LIBRARIES}
+             ${SNAPPY_LIBRARIES}
+         )
          set_target_properties (ddraw
              PROPERTIES PREFIX ""
              RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
              DEPENDS d3d8trace.py trace.py specs/d3d8.py specs/d3d8types.py specs/d3d8caps.py specs/winapi.py specs/stdapi.py
          )
          add_library (d3d8 MODULE specs/d3d8.def d3d8trace.cpp d3dshader.cpp)
+         target_link_libraries (d3d8
+             common
+             ${ZLIB_LIBRARIES}
+             ${SNAPPY_LIBRARIES}
+         )
          set_target_properties (d3d8
              PROPERTIES PREFIX ""
              RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
              DEPENDS d3d9trace.py trace.py specs/d3d9.py specs/d3d9types.py specs/d3d9caps.py specs/winapi.py specs/stdapi.py
          )
          add_library (d3d9 MODULE specs/d3d9.def d3d9trace.cpp d3dshader.cpp)
+         target_link_libraries (d3d9
+             common
+             ${ZLIB_LIBRARIES}
+             ${SNAPPY_LIBRARIES}
+         )
          set_target_properties (d3d9
              PROPERTIES PREFIX ""
              RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
              DEPENDS d3d10trace.py trace.py specs/d3d10misc.py specs/d3d10.py specs/dxgi.py specs/dxgitype.py specs/dxgiformat.py specs/winapi.py specs/stdapi.py
          )
          add_library (d3d10 MODULE specs/d3d10.def d3d10trace.cpp)
+         target_link_libraries (d3d10
+             common
+             ${ZLIB_LIBRARIES}
+             ${SNAPPY_LIBRARIES}
+         )
          set_target_properties (d3d10
              PROPERTIES PREFIX ""
              RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
          glproc_gl.cpp
      )
      add_dependencies (wgltrace glproc)
+     target_link_libraries (wgltrace
+         common
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
+     )
      set_target_properties (wgltrace PROPERTIES
          PREFIX ""
          OUTPUT_NAME opengl32
@@@ -425,7 -447,10 +447,10 @@@ elseif (APPLE
      )
  
      target_link_libraries (cgltrace
-         pthread
+         common
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
+         ${CMAKE_THREAD_LIBS_INIT}
          dl
      )
  
@@@ -457,8 -482,11 +482,11 @@@ elseif (X11_FOUND
      )
  
      target_link_libraries (glxtrace
+         common
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
          ${X11_X11_LIB}
-         pthread
+         ${CMAKE_THREAD_LIBS_INIT}
          dl
      )
  
  endif ()
  
  
- if (EGL_FOUND)
+ if (ENABLE_EGL AND NOT WIN32 AND NOT APPLE)
      # libEGL.so/libGL.so
      add_custom_command (
          OUTPUT egltrace.cpp
      )
  
      target_link_libraries (egltrace
-         pthread
+         common
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
+         ${CMAKE_THREAD_LIBS_INIT}
          dl
      )
  
@@@ -552,6 -583,9 +583,9 @@@ if (WIN32 OR APPLE OR X11_FOUND
  
      target_link_libraries (glretrace
          common
+         ${PNG_LIBRARIES}
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
      )
  
      if (WIN32)
              target_link_libraries (glretrace
                  "-framework Cocoa"
                  "-framework ApplicationServices" # CGS*
-                 ${OPENGL_gl_LIBRARY} # CGL*
+                 #"-framework OpenGL" # CGL*
              )
          else ()
              target_link_libraries (glretrace ${X11_X11_LIB})
              # gdb doesn't like when pthreads is loaded through dlopen (which happens
              # when dlopen'ing libGL), so link pthreads to avoid this issue.  See also
              # http://stackoverflow.com/questions/2702628/gdb-cannot-find-new-threads-generic-error
-             pthread
+             ${CMAKE_THREAD_LIBS_INIT}
              dl
          )
  
      install (TARGETS glretrace RUNTIME DESTINATION bin) 
  endif ()
  
- if (EGL_FOUND AND X11_FOUND AND NOT WIN32 AND NOT APPLE)
+ if (ENABLE_EGL AND X11_FOUND AND NOT WIN32 AND NOT APPLE)
      add_executable (eglretrace
          ${retrace_sources}
          glws_egl_xlib.cpp
  
      target_link_libraries (eglretrace
          common
+         ${PNG_LIBRARIES}
+         ${ZLIB_LIBRARIES}
+         ${SNAPPY_LIBRARIES}
          ${X11_X11_LIB}
-         pthread
+         ${CMAKE_THREAD_LIBS_INIT}
          dl
      )
  
      install (TARGETS eglretrace RUNTIME DESTINATION bin) 
  endif ()
  
 +if (WIN32 AND DirectX_D3DX9_INCLUDE_DIR)
 +    add_custom_command (
 +        OUTPUT d3dretrace_d3d9.cpp
 +        COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3dretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp
 +        DEPENDS d3dretrace.py retrace.py specs/d3d9.py specs/d3d9types.py specs/d3d9caps.py specs/winapi.py specs/stdapi.py
 +    )
 +
 +    include_directories (SYSTEM ${DirectX_D3DX9_INCLUDE_DIR})
 +    add_executable (d3dretrace
 +        retrace.cpp
 +        d3dretrace_main.cpp
 +        d3dretrace_d3d9.cpp
 +    )
 +endif ()
 +
  ##############################################################################
  # CLI
  
- add_subdirectory(cli)
+ if (ENABLE_CLI)
+     add_subdirectory(cli)
+ endif ()
  
  ##############################################################################
  # Scripts (to support the CLI)
  
  install (
      PROGRAMS
-         ${CMAKE_CURRENT_SOURCE_DIR}/scripts/tracediff.sh
+         ${CMAKE_CURRENT_SOURCE_DIR}/scripts/tracediff.py
          ${CMAKE_CURRENT_SOURCE_DIR}/scripts/jsondiff.py
          ${CMAKE_CURRENT_SOURCE_DIR}/scripts/snapdiff.py
      DESTINATION ${SCRIPTS_INSTALL_DIR}
@@@ -661,11 -685,10 +700,10 @@@ install 
          LICENSE
          NEWS.markdown
          README.markdown
-         TODO.markdown
      DESTINATION ${DOC_INSTALL_DIR}
  )
  
- set (CPACK_PACKAGE_VERSION_MAJOR "2")
+ set (CPACK_PACKAGE_VERSION_MAJOR "3")
  set (CPACK_PACKAGE_VERSION_MINOR "0")
  
  # Use current date in YYYYMMDD format as patch number 
@@@ -674,6 -697,13 +712,13 @@@ execute_process 
      OUTPUT_VARIABLE CPACK_PACKAGE_VERSION_PATCH
  )
  
+ # cpack mistakenly detects Mingw-w64 as win32
+ if (MINGW)
+     if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+         set (CPACK_SYSTEM_NAME win64)
+     endif ()
+ endif ()
  # See http://www.vtk.org/Wiki/CMake:CPackPackageGenerators
  if (WIN32)
      set (CPACK_GENERATOR "ZIP")
diff --combined glretrace.hpp
index f7d244fa36290cf75e155d9e549ee1eb027de5ab,83535223fcf3c7f1009d9731df459ff8a9090203..8ba2a80edd477b8e2b418f0c21bfb76b57aace32
@@@ -26,6 -26,7 +26,6 @@@
  #ifndef _GLRETRACE_HPP_
  #define _GLRETRACE_HPP_
  
 -#include "trace_parser.hpp"
  #include "glws.hpp"
  #include "retrace.hpp"
  
@@@ -35,6 -36,7 +35,6 @@@ namespace glretrace 
  
  extern bool double_buffer;
  extern bool insideGlBeginEnd;
 -extern trace::Parser parser;
  extern glws::Profile defaultProfile;
  extern glws::Visual *visual[glws::PROFILE_MAX];
  extern glws::Drawable *drawable;
@@@ -44,17 -46,7 +44,7 @@@ extern unsigned frame
  extern long long startTime;
  extern bool wait;
  
- enum frequency {
-     FREQUENCY_NEVER = 0,
-     FREQUENCY_FRAME,
-     FREQUENCY_FRAMEBUFFER,
-     FREQUENCY_DRAW,
- };
  extern bool benchmark;
- extern const char *compare_prefix;
- extern const char *snapshot_prefix;
- extern enum frequency snapshot_frequency;
  
  extern unsigned dump_state;
  
@@@ -67,7 -59,6 +57,6 @@@ extern const retrace::Entry glx_callbac
  extern const retrace::Entry wgl_callbacks[];
  extern const retrace::Entry egl_callbacks[];
  
- void snapshot(unsigned call_no);
  void frame_complete(trace::Call &call);
  
  void updateDrawable(int width, int height);
diff --combined glretrace_main.cpp
index d80775f0ed3dd76c591c632e479065580c573939,11f34ce8200ca16215780c0fbfce976f918ca414..16d3ec0de8599fd3ce5cf0379f4439b35578eeb6
  
  #include <string.h>
  
+ #include "os_binary.hpp"
  #include "os_string.hpp"
  #include "os_time.hpp"
  #include "image.hpp"
  #include "retrace.hpp"
+ #include "trace_callset.hpp"
  #include "glproc.hpp"
  #include "glstate.hpp"
  #include "glretrace.hpp"
@@@ -39,6 -41,7 +41,6 @@@ namespace glretrace 
  
  bool double_buffer = true;
  bool insideGlBeginEnd = false;
 -trace::Parser parser;
  glws::Profile defaultProfile = glws::PROFILE_COMPAT;
  glws::Visual *visual[glws::PROFILE_MAX];
  glws::Drawable *drawable = NULL;
@@@ -49,9 -52,10 +51,10 @@@ long long startTime = 0
  bool wait = false;
  
  bool benchmark = false;
- const char *compare_prefix = NULL;
- const char *snapshot_prefix = NULL;
- enum frequency snapshot_frequency = FREQUENCY_NEVER;
+ static const char *compare_prefix = NULL;
+ static const char *snapshot_prefix = NULL;
+ static trace::CallSet snapshot_frequency;
+ static trace::CallSet compare_frequency;
  
  unsigned dump_state = ~0;
  
@@@ -137,9 -141,11 +140,11 @@@ updateDrawable(int width, int height) 
  }
  
  
- void snapshot(unsigned call_no) {
-     if (!drawable ||
-         (!snapshot_prefix && !compare_prefix)) {
+ static void
+ snapshot(unsigned call_no) {
+     assert(snapshot_prefix || compare_prefix);
+     if (!drawable) {
          return;
      }
  
@@@ -193,11 -199,6 +198,6 @@@ void frame_complete(trace::Call &call) 
      if (!drawable->visible) {
          retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
      }
-     if (snapshot_frequency == FREQUENCY_FRAME ||
-         snapshot_frequency == FREQUENCY_FRAMEBUFFER) {
-         snapshot(call.no);
-     }
  }
  
  
@@@ -214,8 -215,32 +214,32 @@@ static void display(void) 
      trace::Call *call;
  
      while ((call = 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);
+             } else {
+                 // Whereas for ordinate fbo/rendertarget changes we use the
+                 // previous call's number.
+                 snapshot(call->no - 1);
+             }
+         }
          retracer.retrace(*call);
  
+         if (doSnapshot && !swapRenderTarget) {
+             snapshot(call->no);
+         }
          if (!insideGlBeginEnd &&
              drawable && context &&
              call->no >= dump_state) {
      long long endTime = os::getTime();
      float timeInterval = (endTime - startTime) * (1.0 / os::timeFrequency);
  
-     if (retrace::verbosity >= -1) { 
+     if ((retrace::verbosity >= -1) || (retrace::profiling)) {
          std::cout << 
              "Rendered " << frame << " frames"
              " in " <<  timeInterval << " secs,"
@@@ -253,12 -278,14 +277,14 @@@ static void usage(void) 
          "Replay TRACE.\n"
          "\n"
          "  -b           benchmark mode (no error checking or warning messages)\n"
+         "  -p           profiling mode (run whole trace, dump profiling info)\n"
          "  -c PREFIX    compare against snapshots\n"
+         "  -C CALLSET   calls to compare (default is every frame)\n"
          "  -core        use core profile\n"
          "  -db          use a double buffer visual (default)\n"
          "  -sb          use a single buffer visual\n"
          "  -s PREFIX    take snapshots; `-` for PNM stdout output\n"
-         "  -S FREQUENCY snapshot frequency: frame (default), framebuffer, or draw\n"
+         "  -S CALLSET   calls to snapshot (default is every frame)\n"
          "  -v           increase output verbosity\n"
          "  -D CALLNO    dump state at specific call no\n"
          "  -w           wait on final frame\n";
  extern "C"
  int main(int argc, char **argv)
  {
+     assert(compare_frequency.empty());
+     assert(snapshot_frequency.empty());
  
      int i;
      for (i = 1; i < argc; ++i) {
              benchmark = true;
              retrace::verbosity = -1;
              glws::debug = false;
+         } else if (!strcmp(arg, "-p")) {
+             retrace::profiling = true;
+             retrace::verbosity = -1;
+             glws::debug = false;
          } else if (!strcmp(arg, "-c")) {
              compare_prefix = argv[++i];
-             if (snapshot_frequency == FREQUENCY_NEVER) {
-                 snapshot_frequency = FREQUENCY_FRAME;
+             if (compare_frequency.empty()) {
+                 compare_frequency = trace::CallSet(trace::FREQUENCY_FRAME);
+             }
+         } else if (!strcmp(arg, "-C")) {
+             compare_frequency = trace::CallSet(argv[++i]);
+             if (compare_prefix == NULL) {
+                 compare_prefix = "";
              }
          } else if (!strcmp(arg, "-D")) {
              dump_state = atoi(argv[++i]);
              return 0;
          } else if (!strcmp(arg, "-s")) {
              snapshot_prefix = argv[++i];
-             if (snapshot_frequency == FREQUENCY_NEVER) {
-                 snapshot_frequency = FREQUENCY_FRAME;
+             if (snapshot_frequency.empty()) {
+                 snapshot_frequency = trace::CallSet(trace::FREQUENCY_FRAME);
              }
              if (snapshot_prefix[0] == '-' && snapshot_prefix[1] == 0) {
+                 os::setBinaryMode(stdout);
                  retrace::verbosity = -2;
              }
          } else if (!strcmp(arg, "-S")) {
-             arg = argv[++i];
-             if (!strcmp(arg, "frame")) {
-                 snapshot_frequency = FREQUENCY_FRAME;
-             } else if (!strcmp(arg, "framebuffer")) {
-                 snapshot_frequency = FREQUENCY_FRAMEBUFFER;
-             } else if (!strcmp(arg, "draw")) {
-                 snapshot_frequency = FREQUENCY_DRAW;
-             } else {
-                 std::cerr << "error: unknown frequency " << arg << "\n";
-                 usage();
-                 return 1;
-             }
+             snapshot_frequency = trace::CallSet(argv[++i]);
              if (snapshot_prefix == NULL) {
                  snapshot_prefix = "";
              }
diff --combined retrace.cpp
index fe0694d6a3726faf24b45df321160645a498fc69,d2e6d379b06d283ca729e1712e80a22044103189..1630995cdb440551232c6bdfcd214ea1f61f2abe
@@@ -27,6 -27,7 +27,7 @@@
  #include <string.h>
  #include <iostream>
  
+ #include "os_time.hpp"
  #include "trace_dump.hpp"
  #include "retrace.hpp"
  
  namespace retrace {
  
  
 +trace::Parser parser;
 +
 +
  int verbosity = 0;
+ bool profiling = false;
  
  
  static bool call_dumped = false;
@@@ -117,7 -116,20 +119,20 @@@ void Retracer::retrace(trace::Call &cal
      assert(callback);
      assert(callbacks[id] == callback);
  
-     callback(call);
+     if (retrace::profiling) {
+         long long startTime = os::getTime();
+         callback(call);
+         long long stopTime = os::getTime();
+         float timeInterval = (stopTime - startTime) * (1.0E6 / os::timeFrequency);
+         std::cout
+             << call.no << " "
+             << "[" << timeInterval << " usec] "
+         ;
+         trace::dump(call, std::cout, trace::DUMP_FLAG_NO_CALL_NO | trace::DUMP_FLAG_NO_COLOR);
+     } else {
+         callback(call);
+     }
  }
  
  
diff --combined retrace.hpp
index 33671411deb2a8b7841a078adfefc71d60fe273f,57b8b052639085e6b8742bd5e395761f999577fe..a4559c730f8baf49d7e8661315315f0b9cdbd61d
  #include <ostream>
  
  #include "trace_model.hpp"
 +#include "trace_parser.hpp"
  
  
  namespace retrace {
  
  
 +extern trace::Parser parser;
 +
 +
  /**
   * Handle map.
   *
@@@ -99,6 -95,11 +99,11 @@@ toPointer(trace::Value &value, bool bin
   */
  extern int verbosity;
  
+ /**
+  * Add profiling data to the dump when retracing.
+  */
+ extern bool profiling;
  
  std::ostream &warning(trace::Call &call);