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

其他游戏

开发平台:

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. hkSpuStack::hkSpuStack()
  10. {
  11. m_next = HK_NULL;
  12. m_end = 0;
  13. #if defined (HK_PLATFORM_SIM)
  14. m_numAllocInfos = 0;
  15. #endif
  16. }
  17. HK_FORCE_INLINE hkSpuStack::~hkSpuStack()
  18. {
  19. #if defined (HK_PLATFORM_SIM)
  20. HK_ASSERT2(0x5f82931b, !m_numAllocInfos, "Not all allocations got freed");
  21. #endif
  22. }
  23. #endif
  24. void hkSpuStack::initMemory(void* p, int size)
  25. {
  26. m_next = p;
  27. m_end = hkAddByteOffset(p, size);
  28. #if defined (HK_PLATFORM_SIM)
  29. hkString::memSet(p, 0xcd, size);
  30. m_maxStackSize = size;
  31. #endif
  32. }
  33. void* hkSpuStack::allocateStackRoundSizeTo128WithCriticalAssert(int numBytes, const char* what)
  34. {
  35. int allocationSize = HK_NEXT_MULTIPLE_OF(128, numBytes);
  36. #if defined HK_DEBUG_SPU || defined HK_DEBUG
  37. int freeStackSize = getFreeStackSize(); 
  38. #endif
  39. HK_CRITICAL_ASSERT2(0xaf8365df, freeStackSize >= numBytes, "Out of stack memory.");
  40. return allocateStack( allocationSize, what );
  41. }
  42. void* hkSpuStack::allocateStackRoundSizeTo128(int numBytes, const char* what)
  43. {
  44. int allocationSize = HK_NEXT_MULTIPLE_OF(128, numBytes);
  45. return allocateStack( allocationSize, what );
  46. }
  47. void* hkSpuStack::allocateStack(int numBytes, const char* what)
  48. {
  49. HK_ASSERT2(0xaf8365de, !(numBytes & 0x7f) , "Allocation-size should be a multiple of 128.");
  50. HK_ON_DEBUG( int freeStackSize = getFreeStackSize(); )
  51. HK_ASSERT2(0xaf8365df, freeStackSize >= numBytes, "Out of stack memory.");
  52. void* current = m_next;
  53. m_next = hkAddByteOffset(current, numBytes);
  54. #if defined (HK_PLATFORM_SIM)
  55. {
  56. int currentlyAllocated = getUsedStackSize();
  57. AllocInfo& allocInfo = m_allocInfos[m_numAllocInfos++];
  58. {
  59. allocInfo.m_p = current;
  60. allocInfo.m_size = numBytes;
  61. hkString::snprintf(allocInfo.m_what, sizeof(allocInfo.m_what), "HighMark=%i  by %s=%i", currentlyAllocated, what, numBytes );
  62. allocInfo.m_what[ sizeof(allocInfo.m_what) - 1 ] = HK_NULL;
  63. }
  64. if ( currentlyAllocated > m_numBytesAllocatedHighMark )
  65. {
  66. m_numBytesAllocatedHighMark = currentlyAllocated;
  67. HK_WARN_ALWAYS( 0xf0231232, "***** SpuStackHighMark reset ****");
  68. for (int i =0; i < m_numAllocInfos; i++)
  69. {
  70. HK_WARN_ALWAYS( 0xf0231233, m_allocInfos[i].m_what );
  71. }
  72. }
  73. }
  74. #endif
  75. return current;
  76. }
  77. void hkSpuStack::deallocateStack(void* p)
  78. {
  79. #if defined (HK_PLATFORM_SIM)
  80. {
  81. AllocInfo& allocInfo = m_allocInfos[--m_numAllocInfos];
  82. HK_ASSERT2(0xaf83d35f, allocInfo.m_p == p, "Deallocating invalid memory pointer." );
  83. hkString::memSet(allocInfo.m_p, 0xcd, allocInfo.m_size);
  84. hkString::memSet(&allocInfo, 0x0, sizeof(AllocInfo));
  85. }
  86. #endif
  87. m_next = p;
  88. }
  89. void hkSpuStack::shrinkAllocatedStack(void* p, int newSize )
  90. {
  91. #if defined (HK_PLATFORM_SIM)
  92. {
  93. AllocInfo& allocInfo = m_allocInfos[m_numAllocInfos-1];
  94. HK_ASSERT2(0xaf83d35f, allocInfo.m_p == p, "Deallocating invalid memory pointer." );
  95. allocInfo.m_size = newSize;
  96. }
  97. #endif
  98. m_next = hkAddByteOffset(p, newSize);
  99. }
  100. void hkSpuStack::deallocateStack(int numBytes)
  101. {
  102. #if defined (HK_PLATFORM_SIM)
  103. {
  104. AllocInfo& allocInfo = m_allocInfos[--m_numAllocInfos];
  105. HK_ASSERT2(0xaf83d35f, allocInfo.m_size == numBytes, "Deallocating invalid memory size." );
  106. hkString::memSet(allocInfo.m_p, 0xcd, allocInfo.m_size);
  107. hkString::memSet(&allocInfo, 0x0, sizeof(AllocInfo));
  108. }
  109. #endif
  110. m_next = hkAddByteOffset(m_next.val(), -numBytes);
  111. }
  112. /*
  113. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  114. * Confidential Information of Havok.  (C) Copyright 1999-2009
  115. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  116. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  117. * rights, and intellectual property rights in the Havok software remain in
  118. * Havok and/or its suppliers.
  119. * Use of this software for evaluation purposes is subject to and indicates
  120. * acceptance of the End User licence Agreement for this product. A copy of
  121. * the license is included with this software and is also available at www.havok.com/tryhavok.
  122. */