diff --git a/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp b/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp index 32909f9dc..17b81965e 100644 --- a/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp +++ b/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp @@ -27,10 +27,12 @@ subject to the following restrictions: #define spu_printf printf #endif +#define MAX_NUM_BODIES 8192 + struct SampleTask_LocalStoreMemory { ATTRIBUTE_ALIGNED16(char gLocalRigidBody [sizeof(btRigidBody)+16]); - ATTRIBUTE_ALIGNED16(void* gPointerArray[1024]); //at max upload 1024 pointers + ATTRIBUTE_ALIGNED16(void* gPointerArray[MAX_NUM_BODIES]); }; @@ -40,7 +42,7 @@ struct SampleTask_LocalStoreMemory //-- MAIN METHOD void processSampleTask(void* userPtr, void* lsMemory) { -// BT_PROFILE("processSampleTask"); + // BT_PROFILE("processSampleTask"); SampleTask_LocalStoreMemory* localMemory = (SampleTask_LocalStoreMemory*)lsMemory; @@ -55,11 +57,16 @@ void processSampleTask(void* userPtr, void* lsMemory) btCollisionObject** eaPtr = (btCollisionObject**)taskDesc.m_mainMemoryPtr; int batchSize = taskDesc.m_sampleValue; + if (batchSize>MAX_NUM_BODIES) + { + spu_printf("SPU Error: exceed number of bodies, see MAX_NUM_BODIES in SpuSampleTask.cpp\n"); + break; + } int dmaArraySize = batchSize*sizeof(void*); uint64_t ppuArrayAddress = reinterpret_cast(eaPtr); - -// spu_printf("array location is at %llx, batchSize = %d, DMA size = %d\n",ppuArrayAddress,batchSize,dmaArraySize); + + // spu_printf("array location is at %llx, batchSize = %d, DMA size = %d\n",ppuArrayAddress,batchSize,dmaArraySize); if (dmaArraySize>=16) { @@ -69,24 +76,24 @@ void processSampleTask(void* userPtr, void* lsMemory) { stallingUnalignedDmaSmallGet((void*)&localMemory->gPointerArray[0], ppuArrayAddress , dmaArraySize); } - - + + for ( int i=0;igLocalRigidBody[0]; void* shortAdd = localMemory->gPointerArray[i]; uint64_t ppuRigidBodyAddress = reinterpret_cast(shortAdd); - - // spu_printf("cellDmaGet at CMD_SAMPLE_INTEGRATE_BODIES from %llx to %llx\n",ppuRigidBodyAddress,localPtr); + + // spu_printf("cellDmaGet at CMD_SAMPLE_INTEGRATE_BODIES from %llx to %llx\n",ppuRigidBodyAddress,localPtr); int dmaBodySize = sizeof(btRigidBody); - + cellDmaGet((void*)localPtr, ppuRigidBodyAddress , dmaBodySize, DMA_TAG(1), 0, 0); cellDmaWaitTagStatusAll(DMA_MASK(1)); - + float timeStep = 1.f/60.f; btRigidBody* body = (btRigidBody*) localPtr;//btRigidBody::upcast(colObj); @@ -97,7 +104,7 @@ void processSampleTask(void* userPtr, void* lsMemory) body->predictIntegratedTransform(timeStep, predictedTrans); body->proceedToTransform( predictedTrans); void* ptr = (void*)localPtr; - // spu_printf("cellDmaLargePut from %llx to LS %llx\n",ptr,ppuRigidBodyAddress); + // spu_printf("cellDmaLargePut from %llx to LS %llx\n",ptr,ppuRigidBodyAddress); cellDmaLargePut(ptr, ppuRigidBodyAddress , dmaBodySize, DMA_TAG(1), 0, 0); cellDmaWaitTagStatusAll(DMA_MASK(1)); @@ -106,17 +113,82 @@ void processSampleTask(void* userPtr, void* lsMemory) } } - - /* -#ifdef __SPU__ - spu_printf("hello SPU world\n"); -#else - printf("hello world\n"); -#endif - */ - break; } + + + case CMD_SAMPLE_PREDICT_MOTION_BODIES: + { + btTransform predictedTrans; + btCollisionObject** eaPtr = (btCollisionObject**)taskDesc.m_mainMemoryPtr; + + int batchSize = taskDesc.m_sampleValue; + int dmaArraySize = batchSize*sizeof(void*); + + if (batchSize>MAX_NUM_BODIES) + { + spu_printf("SPU Error: exceed number of bodies, see MAX_NUM_BODIES in SpuSampleTask.cpp\n"); + break; + } + + uint64_t ppuArrayAddress = reinterpret_cast(eaPtr); + + // spu_printf("array location is at %llx, batchSize = %d, DMA size = %d\n",ppuArrayAddress,batchSize,dmaArraySize); + + if (dmaArraySize>=16) + { + cellDmaLargeGet((void*)&localMemory->gPointerArray[0], ppuArrayAddress , dmaArraySize, DMA_TAG(1), 0, 0); + cellDmaWaitTagStatusAll(DMA_MASK(1)); + } else + { + stallingUnalignedDmaSmallGet((void*)&localMemory->gPointerArray[0], ppuArrayAddress , dmaArraySize); + } + + + for ( int i=0;igLocalRigidBody[0]; + void* shortAdd = localMemory->gPointerArray[i]; + uint64_t ppuRigidBodyAddress = reinterpret_cast(shortAdd); + + // spu_printf("cellDmaGet at CMD_SAMPLE_INTEGRATE_BODIES from %llx to %llx\n",ppuRigidBodyAddress,localPtr); + + int dmaBodySize = sizeof(btRigidBody); + + cellDmaGet((void*)localPtr, ppuRigidBodyAddress , dmaBodySize, DMA_TAG(1), 0, 0); + cellDmaWaitTagStatusAll(DMA_MASK(1)); + + + float timeStep = 1.f/60.f; + + btRigidBody* body = (btRigidBody*) localPtr;//btRigidBody::upcast(colObj); + if (body) + { + if (!body->isStaticOrKinematicObject()) + { + if (body->isActive()) + { + body->integrateVelocities( timeStep); + //damping + body->applyDamping(timeStep); + + body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform()); + + void* ptr = (void*)localPtr; + cellDmaLargePut(ptr, ppuRigidBodyAddress , dmaBodySize, DMA_TAG(1), 0, 0); + cellDmaWaitTagStatusAll(DMA_MASK(1)); + } + } + } + + } + break; + } + + + default: { @@ -136,7 +208,7 @@ void* createSampleLocalStoreMemory() #else void* createSampleLocalStoreMemory() { - return new SampleTask_LocalStoreMemory; + return new SampleTask_LocalStoreMemory; }; #endif diff --git a/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.h b/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.h index e3ca4d2bc..900be99c4 100644 --- a/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.h +++ b/Extras/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.h @@ -26,7 +26,8 @@ subject to the following restrictions: enum { - CMD_SAMPLE_INTEGRATE_BODIES = 1 + CMD_SAMPLE_INTEGRATE_BODIES = 1, + CMD_SAMPLE_PREDICT_MOTION_BODIES };