implement clipFacesAndFindContactsCPU, to track down OpenCL issue on Mac OSX

This commit is contained in:
erwin coumans
2013-12-13 10:05:07 -08:00
parent 33889a3dc9
commit 571b14787a
4 changed files with 225 additions and 11 deletions

View File

@@ -17,6 +17,9 @@ bool findSeparatingAxisOnGpu = true;
bool bvhTraversalKernelGPU = true;
bool findConcaveSeparatingAxisKernelGPU = true;
bool clipFacesAndFindContactsCPU = false;
///This file was written by Erwin Coumans
///Separating axis rest based on work from Pierre Terdiman, see
@@ -71,6 +74,7 @@ typedef b3AlignedObjectArray<b3Vector3> b3VertexArray;
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h"
@@ -3579,9 +3583,50 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
//clipFacesAndFindContacts
bool clipFacesAndFindContactsCPU = false;
if (clipFacesAndFindContactsCPU)
{
b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
clippingFacesOutGPU.copyToHost(clippingFacesOutCPU);
worldVertsA1GPU.copyToHost(worldVertsA1CPU);
worldNormalsAGPU.copyToHost(worldNormalsACPU);
worldVertsB1GPU.copyToHost(worldVertsB1CPU);
b3AlignedObjectArray<int>concaveHasSeparatingNormalsCPU;
m_concaveHasSeparatingNormals.copyToHost(concaveHasSeparatingNormalsCPU);
b3AlignedObjectArray<b3Vector3> concaveSepNormalsHost;
m_concaveSepNormals.copyToHost(concaveSepNormalsHost);
b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
worldVertsB2CPU.resize(worldVertsB2GPU.size());
for (int i=0;i<numConcavePairs;i++)
{
clipFacesAndFindContactsKernel( &concaveSepNormalsHost.at(0),
&concaveHasSeparatingNormalsCPU.at(0),
&clippingFacesOutCPU.at(0),
&worldVertsA1CPU.at(0),
&worldNormalsACPU.at(0),
&worldVertsB1CPU.at(0),
&worldVertsB2CPU.at(0),
vertexFaceCapacity,
i);
}
clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
worldVertsB2GPU.copyFromHost(worldVertsB2CPU);
} else
{
@@ -3589,6 +3634,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
{
B3_PROFILE("clipFacesAndFindContacts");
//nContacts = m_totalContactsOut.at(0);
//int h = m_hasSeparatingNormals.at(0);
@@ -3596,13 +3642,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
b3BufferInfoCL bInfo[] = {
b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
b3BufferInfoCL( contactOut->getBufferCL()),
b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
b3BufferInfoCL( worldNormalsAGPU.getBufferCL()),
b3BufferInfoCL( worldVertsB1GPU.getBufferCL()),
b3BufferInfoCL( worldVertsB2GPU.getBufferCL()),
b3BufferInfoCL( m_totalContactsOut.getBufferCL())
b3BufferInfoCL( worldVertsB2GPU.getBufferCL())
};
b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts,"m_clipFacesAndFindContacts");
launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
@@ -3749,13 +3793,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
b3BufferInfoCL bInfo[] = {
b3BufferInfoCL( m_sepNormals.getBufferCL()),
b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
b3BufferInfoCL( contactOut->getBufferCL()),
b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
b3BufferInfoCL( worldNormalsAGPU.getBufferCL()),
b3BufferInfoCL( worldVertsB1GPU.getBufferCL()),
b3BufferInfoCL( worldVertsB2GPU.getBufferCL()),
b3BufferInfoCL( m_totalContactsOut.getBufferCL())
b3BufferInfoCL( worldVertsB2GPU.getBufferCL())
};
b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts,"m_clipFacesAndFindContacts");

View File

@@ -1671,13 +1671,11 @@ __kernel void findClippingFacesKernel( __global const int4* pairs,
__kernel void clipFacesAndFindContactsKernel( __global const float4* separatingNormals,
__global const int* hasSeparatingAxis,
__global struct b3Contact4Data* globalContactsOut,
__global int4* clippingFacesOut,
__global float4* worldVertsA1,
__global float4* worldNormalsA1,
__global float4* worldVertsB1,
__global float4* worldVertsB2,
counter32_t nGlobalContactsOut,
int vertexFaceCapacity,
int numPairs,
int debugMode

View File

@@ -1865,13 +1865,11 @@ static const char* satClipKernelsCL= \
"}\n"
"__kernel void clipFacesAndFindContactsKernel( __global const float4* separatingNormals,\n"
" __global const int* hasSeparatingAxis,\n"
" __global struct b3Contact4Data* globalContactsOut,\n"
" __global int4* clippingFacesOut,\n"
" __global float4* worldVertsA1,\n"
" __global float4* worldNormalsA1,\n"
" __global float4* worldVertsB1,\n"
" __global float4* worldVertsB2,\n"
" counter32_t nGlobalContactsOut,\n"
" int vertexFaceCapacity,\n"
" int numPairs,\n"
" int debugMode\n"