llfasttimer.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llfasttimer.h
  3.  * @brief Inline implementations of fast timers.
  4.  *
  5.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2004-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_FASTTIMER_H
  33. #define LL_FASTTIMER_H
  34. // pull in the actual class definition
  35. #include "llfasttimer_class.h"
  36. #if LL_WINDOWS
  37. //
  38. // Windows implementation of CPU clock
  39. //
  40. //
  41. // NOTE: put back in when we aren't using platform sdk anymore
  42. //
  43. // because MS has different signatures for these functions in winnt.h
  44. // need to rename them to avoid conflicts
  45. //#define _interlockedbittestandset _renamed_interlockedbittestandset
  46. //#define _interlockedbittestandreset _renamed_interlockedbittestandreset
  47. //#include <intrin.h>
  48. //#undef _interlockedbittestandset
  49. //#undef _interlockedbittestandreset
  50. //inline U32 LLFastTimer::getCPUClockCount32()
  51. //{
  52. // U64 time_stamp = __rdtsc();
  53. // return (U32)(time_stamp >> 8);
  54. //}
  55. //
  56. //// return full timer value, *not* shifted by 8 bits
  57. //inline U64 LLFastTimer::getCPUClockCount64()
  58. //{
  59. // return __rdtsc();
  60. //}
  61. // shift off lower 8 bits for lower resolution but longer term timing
  62. // on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
  63. inline U32 LLFastTimer::getCPUClockCount32()
  64. {
  65. U32 ret_val;
  66. __asm
  67. {
  68.         _emit   0x0f
  69.         _emit   0x31
  70. shr eax,8
  71. shl edx,24
  72. or eax, edx
  73. mov dword ptr [ret_val], eax
  74. }
  75.     return ret_val;
  76. }
  77. // return full timer value, *not* shifted by 8 bits
  78. inline U64 LLFastTimer::getCPUClockCount64()
  79. {
  80. U64 ret_val;
  81. __asm
  82. {
  83.         _emit   0x0f
  84.         _emit   0x31
  85. mov eax,eax
  86. mov edx,edx
  87. mov dword ptr [ret_val+4], edx
  88. mov dword ptr [ret_val], eax
  89. }
  90.     return ret_val;
  91. }
  92. #endif
  93. #if LL_LINUX || LL_SOLARIS
  94. //
  95. // Linux and Solaris implementation of CPU clock - all architectures.
  96. //
  97. // Try to use the MONOTONIC clock if available, this is a constant time counter
  98. // with nanosecond resolution (but not necessarily accuracy) and attempts are made
  99. // to synchronize this value between cores at kernel start. It should not be affected
  100. // by CPU frequency. If not available use the REALTIME clock, but this may be affected by
  101. // NTP adjustments or other user activity affecting the system time.
  102. inline U64 LLFastTimer::getCPUClockCount64()
  103. {
  104. struct timespec tp;
  105. #ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
  106. if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
  107. #endif
  108. clock_gettime(CLOCK_REALTIME,&tp);
  109. return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;        
  110. }
  111. inline U32 LLFastTimer::getCPUClockCount32()
  112. {
  113. return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
  114. }
  115. #endif // (LL_LINUX || LL_SOLARIS))
  116. #if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
  117. //
  118. // Mac x86 implementation of CPU clock
  119. inline U32 LLFastTimer::getCPUClockCount32()
  120. {
  121. U64 x;
  122. __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
  123. return (U32)(x >> 8);
  124. }
  125. inline U64 LLFastTimer::getCPUClockCount64()
  126. {
  127. U64 x;
  128. __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
  129. return x;
  130. }
  131. #endif
  132. #if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)))
  133. //
  134. // Mac PPC (deprecated) implementation of CPU clock
  135. //
  136. // Just use gettimeofday implementation for now
  137. inline U32 LLFastTimer::getCPUClockCount32()
  138. {
  139. return (U32)(get_clock_count()>>8);
  140. }
  141. inline U64 LLFastTimer::getCPUClockCount64()
  142. {
  143. return get_clock_count();
  144. }
  145. #endif
  146. #endif // LL_LLFASTTIMER_H