hkMonitorStream.inl
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #if defined( HK_PLATFORM_PS3_SPU)
  9. #include <spu_intrinsics.h>
  10. #endif
  11. #if defined (HK_PLATFORM_PS3_SPU)
  12. #define HK_PERF_BOOKMARK( VAL ) { uint32_t v = VAL; __asm__ volatile (" wrch $ch69, %0" :: "r"(v)); __asm__ volatile ("nop;nop;nop;nop;nop;nop;nop;nop"); __asm__ volatile ("nop;nop;nop;nop;nop;nop;nop;nop");}
  13. #elif defined(HK_PLATFORM_PS3_PPU)
  14. #include <cell/perf/performance.h>
  15. #define HK_PERF_BOOKMARK( VAL ) cellPerfInsertCBEpmBookmark( VAL );
  16. #else
  17. #define HK_PERF_BOOKMARK( VAL )
  18. #endif
  19. void hkMonitorStream::TimerCommand::setTime()
  20. {
  21. hkUint32 ticks;
  22. __asm {
  23. //push ebx
  24. //cpuid
  25. //pop ebx
  26. rdtsc
  27. mov dword ptr[ticks], eax
  28. //mov dword ptr[ticks+4], edx
  29. }
  30. m_time0 = ticks;
  31. }
  32. #define HK_MONITOR_TYPE_TIMER "t"
  33. #define HK_MONITOR_TYPE_SINGLE "f"
  34. #define HK_MONITOR_TYPE_INT "i"
  35. #define HK_MONITOR_COMMAND_PUSH_DIR "Pd"
  36. #define HK_MONITOR_COMMAND_POP_DIR "pd"
  37. #define HK_MONITOR_COMMAND_BEGIN_TIMER "T"
  38. #define HK_MONITOR_COMMAND_END_TIMER "E"
  39. #define HK_MONITOR_COMMAND_BEGIN_LIST "L"
  40. #define HK_MONITOR_COMMAND_SPLIT_LIST "S"
  41. #define HK_MONITOR_COMMAND_END_LIST "l"
  42. #define HK_MONITOR_COMMAND_NOP "N" // nops added when monitor stream transfers have to be of certain alignment (eg: on SPUs)
  43. #if HK_CONFIG_MONITORS == HK_CONFIG_MONITORS_ENABLED
  44. # define HK_MONITOR_ADD_VALUE( NAME, VALUE, MONITOR_TYPE ){   
  45. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  46. if ( mStream.memoryAvailable() )
  47. {
  48.  hkMonitorStream::AddValueCommand* h = reinterpret_cast<hkMonitorStream::AddValueCommand*>(mStream.getEnd());
  49.  h->m_commandAndMonitor = "M" MONITOR_TYPE NAME;
  50.  h->m_value = VALUE;
  51.  mStream.setEnd( (char*)(h+1) );
  52. } }
  53. # define HK_TIMER_INTERN( NAME, COMMAND, OBJECT ) {
  54. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  55. if ( mStream.memoryAvailable() )
  56. {
  57. hkMonitorStream::TimerCommand* h = reinterpret_cast<hkMonitorStream::TimerCommand*>(mStream.getEnd());
  58.  h->m_commandAndMonitor = COMMAND HK_MONITOR_TYPE_TIMER NAME;
  59.  h->setTime();
  60.  mStream.setEnd( (char*)(h+1) );
  61. } }
  62. # define HK_TIMER_INTERN_LIST( NAME1, NAME2, COMMAND, OBJECT ) {
  63. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  64. if ( mStream.memoryAvailable() )
  65. {
  66. hkMonitorStream::TimerBeginListCommand* h = reinterpret_cast<hkMonitorStream::TimerBeginListCommand*>(mStream.getEnd());
  67.  h->m_commandAndMonitor = COMMAND HK_MONITOR_TYPE_TIMER NAME1;
  68.  h->m_nameOfFirstSplit = HK_MONITOR_COMMAND_SPLIT_LIST HK_MONITOR_TYPE_TIMER NAME2; 
  69.  h->setTime();
  70.  mStream.setEnd( (char*)(h+1) );
  71. } }
  72. # define HK_TIMER_BEGIN( NAME, OBJECT ) HK_TIMER_INTERN( NAME, HK_MONITOR_COMMAND_BEGIN_TIMER, OBJECT )
  73. # define HK_TIMER_END(  ) HK_TIMER_INTERN( "", HK_MONITOR_COMMAND_END_TIMER, HK_NULL )
  74. /// Timer end call which also checks for matching timer begin call
  75. # define HK_TIMER_NAMED_END( NAME ) HK_TIMER_INTERN( NAME, HK_MONITOR_COMMAND_END_TIMER, HK_NULL )
  76. # define HK_TIMER_BEGIN_LIST( NAME, FIRSTITEM ) HK_TIMER_INTERN_LIST( NAME, FIRSTITEM, HK_MONITOR_COMMAND_BEGIN_LIST, HK_NULL )
  77. # define HK_TIMER_SPLIT_LIST( NEXTITEM ) HK_TIMER_INTERN( NEXTITEM, HK_MONITOR_COMMAND_SPLIT_LIST, HK_NULL )
  78. # define HK_TIMER_END_LIST( ) HK_TIMER_INTERN( "", HK_MONITOR_COMMAND_END_LIST, HK_NULL )
  79. # define HK_POSSIBLY_UNUSED
  80. class HK_POSSIBLY_UNUSED hkTimeFunctionHelper
  81. {
  82. public:
  83. HK_FORCE_INLINE ~hkTimeFunctionHelper() { HK_TIMER_END(); }
  84. };
  85. #define HK_TIME_CODE_BLOCK( NAME, OBJECT ) HK_TIMER_BEGIN(NAME, OBJECT); hkTimeFunctionHelper HK_PREPROCESSOR_JOIN_TOKEN(timeblock, __LINE__)
  86. # define HK_MONITOR_PUSH_DIR( PATH ) {
  87. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  88. if ( mStream.memoryAvailable() )
  89. {
  90.  hkMonitorStream::Command* h = (hkMonitorStream::Command*)( mStream.expandby( sizeof(hkMonitorStream::Command) ) );
  91.  h->m_commandAndMonitor = HK_MONITOR_COMMAND_PUSH_DIR PATH;
  92. } }
  93. # define HK_MONITOR_POP_DIR(  ) {
  94. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  95. if ( mStream.memoryAvailable() )
  96. {
  97.  hkMonitorStream::Command* h = (hkMonitorStream::Command*)( mStream.expandby( sizeof(hkMonitorStream::Command) ) );
  98.  h->m_commandAndMonitor = HK_MONITOR_COMMAND_POP_DIR;
  99. } }
  100. # define HK_MONITOR_NOP() {
  101. hkMonitorStream& mStream = hkMonitorStream::getInstance();
  102. if ( mStream.getEnd() <= (mStream.getCapacity() - sizeof(hkMonitorStream::Command)) )
  103. {
  104. hkMonitorStream::Command* h = (hkMonitorStream::Command*)( mStream.expandby( sizeof(hkMonitorStream::Command) ) );
  105. h->m_commandAndMonitor = HK_MONITOR_COMMAND_NOP;
  106. } }
  107. #else // HK_CONFIG_MONITORS == HK_CONFIG_MONITORS_DISABLED
  108. # define HK_MONITOR_PUSH_DIR( PATH )
  109. # define HK_MONITOR_POP_DIR()
  110. # define HK_MONITOR_ADD_VALUE( NAME, VALUE, MONITOR_TYPE )
  111. # define HK_MONITOR_NOP()
  112. # define HK_TIMER_BEGIN( NAME, OBJECT )
  113. # define HK_TIMER_END()
  114. # define HK_TIMER_NAMED_END(NAME)
  115. # define HK_TIMER_BEGIN_LIST( NAME, OBJECT )
  116. # define HK_TIMER_SPLIT_LIST( NAME )
  117. # define HK_TIMER_END_LIST(  )
  118. #define HK_TIME_CODE_BLOCK( NAME, OBJECT )
  119. #endif
  120. // Set this to 1 for extra detailed timers
  121. # define HK_INTERNAL_TIMER_BEGIN(NAME,OBJECT) {}
  122. # define HK_INTERNAL_TIMER_END() {}
  123. # define HK_INTERNAL_TIMER_BEGIN_LIST(a,b) {}
  124. # define HK_INTERNAL_TIMER_SPLIT_LIST(a) {}
  125. # define HK_INTERNAL_TIMER_END_LIST() {}
  126. # define HK_INTERNAL_MONITOR_ADD_VALUE(NAME, VALUE, MONITOR_TYPE) {}
  127. # define HK_USER_TIMER_BEGIN(NAME,OBJECT) HK_TIMER_BEGIN(NAME,HK_NULL)
  128. # define HK_USER_TIMER_END HK_TIMER_END
  129. # define HK_USER_TIMER_BEGIN_LIST(a,b) HK_TIMER_BEGIN_LIST(a,b)
  130. # define HK_USER_TIMER_SPLIT_LIST(a) HK_TIMER_SPLIT_LIST(a)
  131. # define HK_USER_TIMER_END_LIST HK_TIMER_END_LIST
  132. /*
  133. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  134. * Confidential Information of Havok.  (C) Copyright 1999-2009
  135. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  136. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  137. * rights, and intellectual property rights in the Havok software remain in
  138. * Havok and/or its suppliers.
  139. * Use of this software for evaluation purposes is subject to and indicates
  140. * acceptance of the End User licence Agreement for this product. A copy of
  141. * the license is included with this software and is also available at www.havok.com/tryhavok.
  142. */