From 31282ab85ecc1a9e23384a3984f627fffefad89b Mon Sep 17 00:00:00 2001 From: erwin coumans Date: Mon, 17 Jun 2013 13:23:41 -0700 Subject: [PATCH] don't crash if the maximum number of pairs is exceeded, but report an error using b3Error --- Demos3/GpuDemos/ParticleDemo.cpp | 2 +- Demos3/GpuDemos/broadphase/PairBench.cpp | 2 +- .../BroadphaseCollision/b3GpuSapBroadphase.cpp | 17 ++++++++++++----- .../BroadphaseCollision/b3GpuSapBroadphase.h | 4 ++-- .../RigidBody/b3GpuRigidBodyPipeline.cpp | 2 +- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Demos3/GpuDemos/ParticleDemo.cpp b/Demos3/GpuDemos/ParticleDemo.cpp index e226b8778..cf8d95908 100644 --- a/Demos3/GpuDemos/ParticleDemo.cpp +++ b/Demos3/GpuDemos/ParticleDemo.cpp @@ -397,7 +397,7 @@ void ParticleDemo::clientMoveAndDisplay() cl_mem pairsGPU = 0; { - m_data->m_broadphaseGPU->calculateOverlappingPairs(); + m_data->m_broadphaseGPU->calculateOverlappingPairs(64*numParticles); pairsGPU = m_data->m_broadphaseGPU->getOverlappingPairBuffer(); numPairsGPU = m_data->m_broadphaseGPU->getNumOverlap(); } diff --git a/Demos3/GpuDemos/broadphase/PairBench.cpp b/Demos3/GpuDemos/broadphase/PairBench.cpp index ed1d32ce4..f3d2077e6 100644 --- a/Demos3/GpuDemos/broadphase/PairBench.cpp +++ b/Demos3/GpuDemos/broadphase/PairBench.cpp @@ -308,7 +308,7 @@ void PairBench::clientMoveAndDisplay() } { B3_PROFILE("calculateOverlappingPairs"); - m_data->m_broadphaseGPU->calculateOverlappingPairs(); + m_data->m_broadphaseGPU->calculateOverlappingPairs(64*numObjects); //int numPairs = m_data->m_broadphaseGPU->getNumOverlap(); //printf("numPairs = %d\n", numPairs); } diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp index a38c12ee1..d6cb05890 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp @@ -155,7 +155,7 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap() } -void b3GpuSapBroadphase::calculateOverlappingPairsHost() +void b3GpuSapBroadphase::calculateOverlappingPairsHost(int maxPairs) { //test //if (m_currentBuffer>=0) @@ -236,6 +236,10 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHost() } } + if (hostPairs.size() > maxPairs) + { + hostPairs.resize(maxPairs); + } if (hostPairs.size()) { @@ -262,7 +266,7 @@ void b3GpuSapBroadphase::reset() } -void b3GpuSapBroadphase::calculateOverlappingPairs() +void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs) { int axis = 0;//todo on GPU for now hardcode @@ -398,8 +402,6 @@ void b3GpuSapBroadphase::calculateOverlappingPairs() } - int maxPairsPerBody = 64; - int maxPairs = maxPairsPerBody * numSmallAabbs;//todo m_overlappingPairs.resize(maxPairs); b3OpenCLArray pairCount(m_context, m_queue); @@ -423,8 +425,10 @@ void b3GpuSapBroadphase::calculateOverlappingPairs() numPairs = pairCount.at(0); if (numPairs >maxPairs) + { + b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs); numPairs =maxPairs; - + } } } if (m_gpuSmallSortedAabbs.size()) @@ -467,7 +471,10 @@ void b3GpuSapBroadphase::calculateOverlappingPairs() numPairs = pairCount.at(0); if (numPairs>maxPairs) + { + b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs); numPairs = maxPairs; + } } #else diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h index b53d4b4b1..cf5709435 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h @@ -49,8 +49,8 @@ class b3GpuSapBroadphase b3GpuSapBroadphase(cl_context ctx,cl_device_id device, cl_command_queue q ); virtual ~b3GpuSapBroadphase(); - void calculateOverlappingPairs(); - void calculateOverlappingPairsHost(); + void calculateOverlappingPairs(int maxPairs); + void calculateOverlappingPairsHost(int maxPairs); void reset(); diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp index 3e4a86a6b..29d2a8bee 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp @@ -144,7 +144,7 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime) numPairs = m_data->m_broadphaseDbvt->getOverlappingPairCache()->getNumOverlappingPairs(); } else { - m_data->m_broadphaseSap->calculateOverlappingPairs(); + m_data->m_broadphaseSap->calculateOverlappingPairs(m_data->m_config.m_maxBroadphasePairs); numPairs = m_data->m_broadphaseSap->getNumOverlap(); } }