From fff709635eb01724655a2c249c9cd1d3affceb15 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Tue, 20 Dec 2011 18:02:48 +0000 Subject: [PATCH] Apply a patch that updates vertex position on GPU for the OpenCL version, by Dongsoo Han (saggita), work-in-progress Removed the unused OpenCL kernels Add example how to cache binary kernels, see SoftDemo compiled with OpenCL AMD using msvc/vs2008_opencl.bat --- Demos/SharedOpenCL/btOpenCLUtils.cpp | 325 +++++++++++++++++++++++---- Demos/SharedOpenCL/btOpenCLUtils.h | 5 +- Demos/SoftDemo/SoftDemo.cpp | 265 ++++++++++++++++++++-- Demos/premake4.lua | 2 +- 4 files changed, 524 insertions(+), 73 deletions(-) diff --git a/Demos/SharedOpenCL/btOpenCLUtils.cpp b/Demos/SharedOpenCL/btOpenCLUtils.cpp index b52544883..a81bacaa2 100644 --- a/Demos/SharedOpenCL/btOpenCLUtils.cpp +++ b/Demos/SharedOpenCL/btOpenCLUtils.cpp @@ -22,6 +22,12 @@ subject to the following restrictions: #include #include +#ifdef _WIN32 +#include +#include + +#define btAssert assert +#endif //Set the preferred platform vendor using the OpenCL SDK static char* spPlatformVendor = @@ -65,10 +71,9 @@ cl_platform_id btOpenCLUtils::getPlatform(int platformIndex, cl_int* pErrNum) { cl_platform_id platform = 0; - cl_uint clNumPlatforms; - cl_int ciErrNum = clGetPlatformIDs(0, NULL, &clNumPlatforms); - int numPlatforms = (int)clNumPlatforms; - + cl_uint numPlatforms; + cl_int ciErrNum = clGetPlatformIDs(0, NULL, &numPlatforms); + if (platformIndex>=0 && platformIndexlocalCreateRigidBody(10,startTransform,new btBoxShape(btVector3(2,2,2))); } +static void Init_CapsuleCollision(SoftDemo* pdemo) +{ +#ifdef USE_AMD_OPENCL + btAlignedObjectArray emptyArray; + if (g_openCLSIMDSolver) + g_openCLSIMDSolver->optimize(emptyArray); +#endif //USE_AMD_OPENCL + + //TRACEDEMO + const btScalar s=4; + const btScalar h=6; + const int r=20; + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,h-2,0)); + + btCollisionShape* capsuleShape= new btCapsuleShapeX(1,5); +// capsuleShape->setMargin( 0.5 ); + + // capsule->setLocalScaling(btVector3(5,1,1)); +// btRigidBody* body=pdemo->localCreateRigidBody(20,startTransform,capsuleShape); + btRigidBody* body=pdemo->localCreateRigidBody(0,startTransform,capsuleShape); +// body->setFriction( 0.8f ); + + int fixed=0;//4+8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,btVector3(-s,h,-s), + btVector3(+s,h,-s), + btVector3(-s,h,+s), + btVector3(+s,h,+s),r,r,fixed,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); +// psb->setTotalMass(1); + + psb->m_cfg.piterations = 10; + psb->m_cfg.citerations = 10; + psb->m_cfg.diterations = 10; +// psb->m_cfg.viterations = 10; + + + // psb->appendAnchor(0,body); +// psb->appendAnchor(r-1,body); +// pdemo->m_cutting=true; +} + // // Collide // @@ -1318,7 +1507,8 @@ static void Init_TetraCube(SoftDemo* pdemo) Init_Ropes, Init_RopeAttach, Init_ClothAttach, - Init_Sticks, + Init_Sticks, + Init_CapsuleCollision, Init_Collide, Init_Collide2, Init_Collide3, @@ -1499,6 +1689,11 @@ void SoftDemo::clientMoveAndDisplay() #endif +#ifdef USE_AMD_OPENCL + if (g_openCLSIMDSolver) + g_openCLSIMDSolver->copyBackToSoftBodies(); +#endif //USE_AMD_OPENCL + if(m_drag) { m_node->m_v*=0; @@ -1615,26 +1810,29 @@ void SoftDemo::renderme() /* Cast rays */ { m_clock.reset(); - btVector3* org=&origins[0]; - btScalar* fraction=&fractions[0]; - btSoftBody** psbs=&sbs[0]; - btSoftBody::sRayCast results; - for(int i=0,ni=origins.size(),nb=sbs.size();irayTest(rayFrom,rayTo,results)) + for(int ib=0;ibrayTest(rayFrom,rayTo,results)) + { + *fraction=results.fraction; + } } + ++org;++fraction; } - ++org;++fraction; + long ms=btMax(m_clock.getTimeMilliseconds(),1); + long rayperseconds=(1000*(origins.size()*sbs.size()))/ms; + printf("%d ms (%d rays/s)\r\n",int(ms),int(rayperseconds)); } - long ms=btMax(m_clock.getTimeMilliseconds(),1); - long rayperseconds=(1000*(origins.size()*sbs.size()))/ms; - printf("%d ms (%d rays/s)\r\n",int(ms),int(rayperseconds)); } /* Draw rays */ const btVector3 c[]={ origins[0], @@ -1994,7 +2192,35 @@ void SoftDemo::initPhysics() m_solver = solver; - btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + btSoftBodySolver* softBodySolver = 0; +#ifdef USE_AMD_OPENCL + + static bool once = true; + if (once) + { + once=false; + initCL(0,0); + } + + if( g_openCLSIMDSolver ) + delete g_openCLSIMDSolver; + if( g_softBodyOutput ) + delete g_softBodyOutput; + + if (0) + { + g_openCLSIMDSolver = new btOpenCLSoftBodySolverSIMDAware( g_cqCommandQue, g_cxMainContext); + // g_openCLSIMDSolver = new btOpenCLSoftBodySolver( g_cqCommandQue, g_cxMainContext); + g_openCLSIMDSolver->setCLFunctions(new CachingCLFunctions(g_cqCommandQue, g_cxMainContext)); + } + + + + softBodySolver = g_openCLSIMDSolver; + g_softBodyOutput = new btSoftBodySolverOutputCLtoCPU; +#endif //USE_AMD_OPENCL + + btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration,softBodySolver); m_dynamicsWorld = world; m_dynamicsWorld->setInternalTickCallback(pickingPreTickCallback,this,true); @@ -2003,11 +2229,6 @@ void SoftDemo::initPhysics() m_dynamicsWorld->setGravity(btVector3(0,-10,0)); m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); - - - - - // clientResetScene(); m_softBodyWorldInfo.m_sparsesdf.Initialize(); diff --git a/Demos/premake4.lua b/Demos/premake4.lua index d757aabfa..58cededdc 100644 --- a/Demos/premake4.lua +++ b/Demos/premake4.lua @@ -17,7 +17,7 @@ function createDemos( demos, incdirs, linknames) libdirs {"../Glut"} files { "../msvc/bullet.rc" } - configuration {"MaxOSX"} + configuration {"MacOSX"} --print "hello" linkoptions { "-framework Carbon -framework OpenGL -framework AGL -framework Glut" }