1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef Timer_DEFINED 8 #define Timer_DEFINED 9 10 #include "SkTypes.h" 11 #include "SkString.h" 12 13 #if defined(SK_BUILD_FOR_WIN32) 14 #include "SysTimer_windows.h" 15 #elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 16 #include "SysTimer_mach.h" 17 #elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) 18 #include "SysTimer_posix.h" 19 #endif 20 21 #if SK_SUPPORT_GPU 22 #include "GpuTimer.h" 23 #endif 24 25 class SkGLContext; 26 27 /** 28 * SysTimers and GpuTimers are implemented orthogonally. 29 * This class combines 2 SysTimers and a GpuTimer into one single, 30 * platform specific Timer with a simple interface. The truncated 31 * timer doesn't include the time required for the GPU to finish 32 * its rendering. It should always be <= the un-truncated system 33 * times and (for GPU configurations) can be used to roughly (very 34 * roughly) gauge the GPU load/backlog. 35 */ 36 class Timer { 37 public: 38 explicit Timer(SkGLContext* gl = NULL); 39 40 void start(); 41 void truncatedEnd(); 42 void end(); 43 44 // All times in milliseconds. 45 double fCpu; 46 double fWall; 47 double fTruncatedCpu; 48 double fTruncatedWall; 49 double fGpu; 50 51 private: 52 SysTimer fSysTimer; 53 SysTimer fTruncatedSysTimer; 54 #if SK_SUPPORT_GPU 55 GpuTimer fGpuTimer; 56 #endif 57 }; 58 59 // Same as Timer above, supporting only fWall but with much lower overhead. 60 // (Typically, ~30ns instead of Timer's ~1us.) 61 class WallTimer { 62 public: 63 WallTimer(); 64 65 void start(); 66 void end(); 67 68 double fWall; // Milliseconds. 69 70 private: 71 SysTimer fSysTimer; 72 }; 73 74 SkString HumanizeMs(double); 75 76 #endif 77