moved predictUnconstraintMotion to SPU
This commit is contained in:
@@ -27,10 +27,12 @@ subject to the following restrictions:
|
|||||||
#define spu_printf printf
|
#define spu_printf printf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MAX_NUM_BODIES 8192
|
||||||
|
|
||||||
struct SampleTask_LocalStoreMemory
|
struct SampleTask_LocalStoreMemory
|
||||||
{
|
{
|
||||||
ATTRIBUTE_ALIGNED16(char gLocalRigidBody [sizeof(btRigidBody)+16]);
|
ATTRIBUTE_ALIGNED16(char gLocalRigidBody [sizeof(btRigidBody)+16]);
|
||||||
ATTRIBUTE_ALIGNED16(void* gPointerArray[1024]); //at max upload 1024 pointers
|
ATTRIBUTE_ALIGNED16(void* gPointerArray[MAX_NUM_BODIES]);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -55,6 +57,11 @@ void processSampleTask(void* userPtr, void* lsMemory)
|
|||||||
btCollisionObject** eaPtr = (btCollisionObject**)taskDesc.m_mainMemoryPtr;
|
btCollisionObject** eaPtr = (btCollisionObject**)taskDesc.m_mainMemoryPtr;
|
||||||
|
|
||||||
int batchSize = taskDesc.m_sampleValue;
|
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*);
|
int dmaArraySize = batchSize*sizeof(void*);
|
||||||
|
|
||||||
uint64_t ppuArrayAddress = reinterpret_cast<uint64_t>(eaPtr);
|
uint64_t ppuArrayAddress = reinterpret_cast<uint64_t>(eaPtr);
|
||||||
@@ -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;
|
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<uint64_t>(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;i<batchSize;i++)
|
||||||
|
{
|
||||||
|
///DMA rigid body
|
||||||
|
|
||||||
|
void* localPtr = &localMemory->gLocalRigidBody[0];
|
||||||
|
void* shortAdd = localMemory->gPointerArray[i];
|
||||||
|
uint64_t ppuRigidBodyAddress = reinterpret_cast<uint64_t>(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:
|
default:
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CMD_SAMPLE_INTEGRATE_BODIES = 1
|
CMD_SAMPLE_INTEGRATE_BODIES = 1,
|
||||||
|
CMD_SAMPLE_PREDICT_MOTION_BODIES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user