19 #include "../SpuDoubleBuffer.h"
21 #include "../SpuCollisionTaskProcess.h"
22 #include "../SpuGatheringCollisionDispatcher.h"
25 #include "../SpuContactManifoldCollisionAlgorithm.h"
64 #if USE_SOFTWARE_CACHE
65 #include <spu_intrinsics.h>
66 #include <sys/spu_thread.h>
67 #include <sys/spu_event.h>
69 #define SPE_CACHE_NWAY 4
71 #define SPE_CACHE_NSETS 8
73 #define SPE_CACHELINE_SIZE 128
74 #define SPE_CACHE_SET_TAGID(set) 15
75 #include "../Extras/software_cache/cache/include/spe_cache.h"
82 #if 0 // Added to allow cache misses and hits to be tracked, change this to 1 to restore unmodified version
83 #define spe_cache_read(ea) _spe_cache_lookup_xfer_wait_(ea, 0, 1)
85 #define spe_cache_read(ea) \
87 int set, idx, line, byte; \
88 _spe_cache_nway_lookup_(ea, set, idx); \
90 if (btUnlikely(idx < 0)) { \
92 idx = _spe_cache_miss_(ea, set, -1); \
93 spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \
94 spu_mfcstat(MFC_TAG_UPDATE_ALL); \
100 line = _spe_cacheline_num_(set, idx); \
101 byte = _spe_cacheline_byte_offset_(ea); \
102 (void *) &spe_cache_mem[line + byte]; \
107 #endif // USE_SOFTWARE_CACHE
112 #include <LibSN_SPU.h>
113 #endif //USE_SN_TUNER
115 #if defined (__SPU__) && !defined (USE_LIBSPE2)
116 #include <spu_printf.h>
117 #elif defined (USE_LIBSPE2)
118 #define spu_printf(a)
120 #define IGNORE_ALIGNMENT 1
123 #define spu_printf printf
185 #if defined(__CELLOS_LV2__) || defined(USE_LIBSPE2)
191 return &gLocalStoreMemory;
203 sLocalStorePointers.
push_back(localStore);
209 for (
int i=0;i<sLocalStorePointers.
size();i++)
211 delete sLocalStorePointers[i];
213 sLocalStorePointers.
clear();
223 #if USE_SOFTWARE_CACHE
226 btAssert((ea & ~SPE_CACHELINE_MASK) == ((ea + size - 1) & ~SPE_CACHELINE_MASK));
228 void* ls = spe_cache_read(ea);
229 memcpy(buffer, ls, size);
249 char* localStore0 = (
char*)ls0;
250 uint32_t last4BitsOffset = ea0 & 0x0f;
251 char* tmpTarget0 = tmpBuffer0 + last4BitsOffset;
253 cellDmaSmallGet(tmpTarget0,ea0,size,
DMA_TAG(1),0,0);
259 char* localStore1 = (
char*)ls1;
260 last4BitsOffset = ea1 & 0x0f;
261 char* tmpTarget1 = tmpBuffer1 + last4BitsOffset;
263 cellDmaSmallGet(tmpTarget1,ea1,size,
DMA_TAG(1),0,0);
268 char* localStore2 = (
char*)ls2;
269 last4BitsOffset = ea2 & 0x0f;
270 char* tmpTarget2 = tmpBuffer2 + last4BitsOffset;
272 cellDmaSmallGet(tmpTarget2,ea2,size,
DMA_TAG(1),0,0);
283 localStore0[i] = tmpTarget0[i];
284 localStore1[i] = tmpTarget1[i];
285 localStore2[i] = tmpTarget2[i];
329 sizeof(
unsigned short int));
399 bool hasCollision =
false;
400 const btVector3& planeNormal = planeShape->getPlaneNormal();
401 const btScalar& planeConstant = planeShape->getPlaneConstant();
413 btVector3 vtxInPlane = convexInPlaneTrans(vtx);
414 btScalar distance = (planeNormal.
dot(vtxInPlane) - planeConstant);
416 btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
433 register int dmaSize = 0;
569 unsigned short int quantizedQueryAabbMin[3];
570 unsigned short int quantizedQueryAabbMax[3];
586 if (subTrees.
size() && indexArray.
size() == 1)
593 int numBatch = subTrees.
size();
594 for (
int i=0;i<numBatch;)
597 int remaining = subTrees.
size() - i;
606 for (
int j=0;j<nextBatch;j++)
641 #define MAX_DEGENERATE_STATS 15
642 int stats[
MAX_DEGENERATE_STATS]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
643 int degenerateStats[
MAX_DEGENERATE_STATS]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
651 register int dmaSize;
654 #ifdef DEBUG_SPU_COLLISION_DETECTION
656 #endif //DEBUG_SPU_COLLISION_DETECTION
661 bool genericGjk =
true;
679 penetrationSolver = &epaPenetrationSolver2;
777 btGjkPairDetector gjk(shape0Ptr,shape1Ptr,shapeType0,shapeType1,marginA,marginB,&simplexSolver,penetrationSolver);
785 #ifdef USE_SEPDISTANCE_UTIL
789 #endif //USE_SEPDISTANCE_UTIL
799 template<
typename T>
void DoSwap(T& a, T& b)
802 memcpy(tmp, &a,
sizeof(T));
803 memcpy(&a, &b,
sizeof(T));
804 memcpy(&b, tmp,
sizeof(T));
809 register int dmaSize;
834 ppu_address_t collisionShape1Ptr,
void* collisionShape1Loc,
bool dmaShapes =
true)
892 for (
int i = 0; i < childShapeCount0; ++i)
897 for (
int j = 0; j < childShapeCount1; ++j)
937 for (
int i = 0; i < childShapeCount; ++i)
952 collisionShape1Ptr, collisionShape1Loc,
false);
971 for (
int i = 0; i < childShapeCount; ++i)
984 collisionShape0Ptr, collisionShape0Loc,
992 bool handleConvexConcave =
false;
1000 DoSwap(collisionShape0Ptr, collisionShape1Ptr);
1001 DoSwap(collisionShape0Loc, collisionShape1Loc);
1012 handleConvexConcave =
true;
1014 if (handleConvexConcave)
1054 spuContacts.
flush();
1076 unsigned int numPages = taskDesc.
numPages;
1087 register unsigned char *inputPtr;
1088 register unsigned int numOnPage;
1089 register unsigned int j;
1091 register int dmaSize;
1099 for (
unsigned int i = 0;
btLikely(i < numPages); i++)
1106 numOnPage = nextNumOnPage;
1110 #if MIDPHASE_NUM_WORKUNIT_PAGES > 2
1124 for (j = 0;
btLikely( j < numOnPage ); j++)
1126 #ifdef DEBUG_SPU_COLLISION_DETECTION
1128 #endif //DEBUG_SPU_COLLISION_DETECTION
1141 for (p=0;p<numPairs;p++)
1147 #ifdef DEBUG_SPU_COLLISION_DETECTION
1148 spu_printf(
"pair->m_userInfo = %d\n",pair.m_userInfo);
1152 #endif //DEBUG_SPU_COLLISION_DETECTION
1173 #ifdef DEBUG_SPU_COLLISION_DETECTION
1176 #endif //DEBUG_SPU_COLLISION_DETECTION
1205 #ifdef USE_SEPDISTANCE_UTIL
1207 #endif //USE_SEPDISTANCE_UTIL
1209 #define USE_DEDICATED_BOX_BOX 1
1210 #ifdef USE_DEDICATED_BOX_BOX
1232 #ifdef USE_SEPDISTANCE_UTIL
1240 #ifdef USE_PE_BOX_BOX
1263 #ifdef USE_SEPDISTANCE_UTIL
1264 float distanceThreshold = FLT_MAX
1289 boxA, trA, boxB, trB,
1290 distanceThreshold );
1298 if(dist < spuManifold->getContactBreakingThreshold())
1326 m_spuContacts.setShapeIdentifiersA(partId0,index0);
1330 m_spuContacts.setShapeIdentifiersB(partId1,index1);
1334 m_spuContacts.addContactPoint(normalOnBInWorld,pointInWorld,depth);
1338 :m_spuContacts(spuContacts)
1344 SpuBridgeContactCollector bridgeOutput(spuContacts);
1356 #endif //USE_PE_BOX_BOX
1359 #ifdef USE_SEPDISTANCE_UTIL
1362 #endif //USE_SEPDISTANCE_UTIL
1369 spuContacts.
flush();
1373 #endif //USE_DEDICATED_BOX_BOX
1376 #ifdef USE_SEPDISTANCE_UTIL
1380 #endif //USE_SEPDISTANCE_UTIL
1399 spuContacts.
flush();
1408 #ifdef USE_SEPDISTANCE_UTIL
1409 #if defined (__SPU__) || defined (USE_LIBSPE2)
1418 #endif //#ifdef USE_SEPDISTANCE_UTIL