diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h index bcbf09a4f..09e271e6b 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h @@ -35,6 +35,7 @@ public: virtual b3OpenCLArray& getAllAabbsGPU()=0; virtual b3AlignedObjectArray& getAllAabbsCPU()=0; + virtual b3OpenCLArray& getOverlappingPairsGPU() = 0; virtual b3OpenCLArray& getSmallAabbIndicesGPU() = 0; virtual b3OpenCLArray& getLargeAabbIndicesGPU() = 0; diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp index 1e707f364..deb6d89d9 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp @@ -368,6 +368,10 @@ b3AlignedObjectArray& b3GpuGridBroadphase::getAllAabbsCPU() return m_allAabbsCPU1; } +b3OpenCLArray& b3GpuGridBroadphase::getOverlappingPairsGPU() +{ + return m_gpuPairs; +} b3OpenCLArray& b3GpuGridBroadphase::getSmallAabbIndicesGPU() { return m_smallAabbsMappingGPU; diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h index c2c66ce7c..9694a362b 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h @@ -79,6 +79,7 @@ public: virtual b3OpenCLArray& getAllAabbsGPU(); virtual b3AlignedObjectArray& getAllAabbsCPU(); + virtual b3OpenCLArray& getOverlappingPairsGPU(); virtual b3OpenCLArray& getSmallAabbIndicesGPU(); virtual b3OpenCLArray& getLargeAabbIndicesGPU(); diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp index a478f9e6f..641df9eb1 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp @@ -22,6 +22,7 @@ b3GpuParallelLinearBvh::b3GpuParallelLinearBvh(cl_context context, cl_device_id m_rootNodeIndex(context, queue), m_maxDistanceFromRoot(context, queue), + m_temp(context, queue), m_internalNodeAabbs(context, queue), m_internalNodeLeafIndexRanges(context, queue), @@ -41,6 +42,7 @@ b3GpuParallelLinearBvh::b3GpuParallelLinearBvh(cl_context context, cl_device_id { m_rootNodeIndex.resize(1); m_maxDistanceFromRoot.resize(1); + m_temp.resize(1); // const char CL_PROGRAM_PATH[] = "src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl"; @@ -287,14 +289,13 @@ void b3GpuParallelLinearBvh::build(const b3OpenCLArray& worldSpaceAab } } -void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_numPairs, b3OpenCLArray& out_overlappingPairs) +void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_overlappingPairs) { - b3Assert( out_numPairs.size() == 1 ); - int maxPairs = out_overlappingPairs.size(); - + b3OpenCLArray& numPairsGpu = m_temp; + int reset = 0; - out_numPairs.copyFromHostPointer(&reset, 1); + numPairsGpu.copyFromHostPointer(&reset, 1); // if( m_leafNodeAabbs.size() > 1 ) @@ -313,7 +314,7 @@ void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_n b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ), b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ), - b3BufferInfoCL( out_numPairs.getBufferCL() ), + b3BufferInfoCL( numPairsGpu.getBufferCL() ), b3BufferInfoCL( out_overlappingPairs.getBufferCL() ) }; @@ -338,7 +339,7 @@ void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_n b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), b3BufferInfoCL( m_largeAabbs.getBufferCL() ), - b3BufferInfoCL( out_numPairs.getBufferCL() ), + b3BufferInfoCL( numPairsGpu.getBufferCL() ), b3BufferInfoCL( out_overlappingPairs.getBufferCL() ) }; @@ -355,12 +356,12 @@ void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_n // int numPairs = -1; - out_numPairs.copyToHostPointer(&numPairs, 1); + numPairsGpu.copyToHostPointer(&numPairs, 1); if(numPairs > maxPairs) { b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs); numPairs = maxPairs; - out_numPairs.copyFromHostPointer(&maxPairs, 1); + numPairsGpu.copyFromHostPointer(&maxPairs, 1); } out_overlappingPairs.resize(numPairs); diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h index f1d1049df..effe617b7 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h @@ -76,6 +76,7 @@ class b3GpuParallelLinearBvh //1 element b3OpenCLArray m_rootNodeIndex; //Most significant bit(0x80000000) is set to indicate internal node b3OpenCLArray m_maxDistanceFromRoot; //Max number of internal nodes between an internal node and the root node + b3OpenCLArray m_temp; //Used to hold the number of pairs in calculateOverlappingPairs() //1 element per internal node (number_of_internal_nodes == number_of_leaves - 1) b3OpenCLArray m_internalNodeAabbs; @@ -101,15 +102,14 @@ public: b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue); virtual ~b3GpuParallelLinearBvh(); + ///Must be called before any other function void build(const b3OpenCLArray& worldSpaceAabbs, const b3OpenCLArray& smallAabbIndices, const b3OpenCLArray& largeAabbIndices); - ///b3GpuParallelLinearBvh::build() must be called before this function. calculateOverlappingPairs() uses - ///the worldSpaceAabbs parameter of b3GpuParallelLinearBvh::build() as the query AABBs. - ///@param out_numPairs If number of pairs exceeds the max number of pairs, this is clamped to the max number. + ///calculateOverlappingPairs() uses the worldSpaceAabbs parameter of b3GpuParallelLinearBvh::build() as the query AABBs. ///@param out_overlappingPairs The size() of this array is used to determine the max number of pairs. ///If the number of overlapping pairs is < out_overlappingPairs.size(), out_overlappingPairs is resized. - void calculateOverlappingPairs(b3OpenCLArray& out_numPairs, b3OpenCLArray& out_overlappingPairs); + void calculateOverlappingPairs(b3OpenCLArray& out_overlappingPairs); ///@param out_numRigidRayPairs Array of length 1; contains the number of detected ray-rigid AABB intersections; ///this value may be greater than out_rayRigidPairs.size() if out_rayRigidPairs is not large enough. diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp index b48c2c1de..78b625631 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp @@ -15,15 +15,13 @@ subject to the following restrictions: b3GpuParallelLinearBvhBroadphase::b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue) : m_plbvh(context, device, queue), - - m_numOverlappingPairs(context, queue), + m_overlappingPairsGpu(context, queue), m_aabbsGpu(context, queue), m_smallAabbsMappingGpu(context, queue), m_largeAabbsMappingGpu(context, queue) { - m_numOverlappingPairs.resize(1); } void b3GpuParallelLinearBvhBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, short int collisionFilterGroup, short int collisionFilterMask) @@ -64,7 +62,7 @@ void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairs(int maxPairs) // m_overlappingPairsGpu.resize(maxPairs); - m_plbvh.calculateOverlappingPairs(m_numOverlappingPairs, m_overlappingPairsGpu); + m_plbvh.calculateOverlappingPairs(m_overlappingPairsGpu); } void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairsHost(int maxPairs) { diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h index 9155bc1a7..284f6c780 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h @@ -22,7 +22,6 @@ class b3GpuParallelLinearBvhBroadphase : public b3GpuBroadphaseInterface { b3GpuParallelLinearBvh m_plbvh; - b3OpenCLArray m_numOverlappingPairs; b3OpenCLArray m_overlappingPairsGpu; b3OpenCLArray m_aabbsGpu; @@ -51,6 +50,8 @@ public: virtual cl_mem getAabbBufferWS() { return m_aabbsGpu.getBufferCL(); } virtual b3OpenCLArray& getAllAabbsGPU() { return m_aabbsGpu; } + + virtual b3OpenCLArray& getOverlappingPairsGPU() { return m_overlappingPairsGpu; } virtual b3OpenCLArray& getSmallAabbIndicesGPU() { return m_smallAabbsMappingGpu; } virtual b3OpenCLArray& getLargeAabbIndicesGPU() { return m_largeAabbsMappingGpu; } diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp index 5ab7bf0db..280503b34 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp @@ -1308,6 +1308,10 @@ cl_mem b3GpuSapBroadphase::getOverlappingPairBuffer() return m_overlappingPairs.getBufferCL(); } +b3OpenCLArray& b3GpuSapBroadphase::getOverlappingPairsGPU() +{ + return m_overlappingPairs; +} b3OpenCLArray& b3GpuSapBroadphase::getSmallAabbIndicesGPU() { return m_smallAabbsMappingGPU; diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h index 7cbf6c7fc..23e4d624d 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h @@ -143,6 +143,7 @@ public: virtual int getNumOverlap(); virtual cl_mem getOverlappingPairBuffer(); + virtual b3OpenCLArray& getOverlappingPairsGPU(); virtual b3OpenCLArray& getSmallAabbIndicesGPU(); virtual b3OpenCLArray& getLargeAabbIndicesGPU(); };