From 100449d76fb71ffa62359046a20512480f11c596 Mon Sep 17 00:00:00 2001 From: erwin coumans Date: Sat, 8 Jun 2013 11:08:44 -0700 Subject: [PATCH] faster scene construction when not using instancing (avoid copy individual vertices/shapes to GPU, but do it afterwards in a batch), copy GPU data in 'writeAllBodiesToGpu' method add option --no_instanced_collision_shapes, this only applies to the 2 benchmark screnes at the moment always use the user specified b3Config file, so the settings can be set at runtime, not just at compile time adjust default constants in b3Config (needs more tweaking, ideally at run-time) --- Demos3/GpuDemos/GpuDemo.h | 2 + Demos3/GpuDemos/main_opengl3core.cpp | 5 +- Demos3/GpuDemos/rigidbody/ConcaveScene.cpp | 45 ++++++++++-- Demos3/GpuDemos/rigidbody/GpuConvexScene.cpp | 47 +++++++++--- .../GpuDemos/rigidbody/GpuRigidBodyDemo.cpp | 2 +- Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp | 2 +- src/Bullet3OpenCL/RigidBody/b3Config.h | 14 ++-- .../RigidBody/b3GpuNarrowPhase.cpp | 72 +++++++++++-------- .../RigidBody/b3GpuRigidBodyPipeline.cpp | 7 +- .../RigidBody/b3GpuRigidBodyPipeline.h | 3 +- .../b3GpuRigidBodyPipelineInternalData.h | 2 + 11 files changed, 140 insertions(+), 61 deletions(-) diff --git a/Demos3/GpuDemos/GpuDemo.h b/Demos3/GpuDemos/GpuDemo.h index 4e73ddbab..9da95daaf 100644 --- a/Demos3/GpuDemos/GpuDemo.h +++ b/Demos3/GpuDemos/GpuDemo.h @@ -31,6 +31,7 @@ public: float gapX; float gapY; float gapZ; + bool m_useInstancedCollisionShapes; GLInstancingRenderer* m_instancingRenderer; GLPrimitiveRenderer* m_primRenderer; @@ -48,6 +49,7 @@ public: gapX(14.3), gapY(14.0), gapZ(14.3), + m_useInstancedCollisionShapes(true), m_instancingRenderer(0), m_window(0), m_gui(0) diff --git a/Demos3/GpuDemos/main_opengl3core.cpp b/Demos3/GpuDemos/main_opengl3core.cpp index f53c0e42e..dfbb6ed07 100644 --- a/Demos3/GpuDemos/main_opengl3core.cpp +++ b/Demos3/GpuDemos/main_opengl3core.cpp @@ -79,6 +79,7 @@ GpuDemo::CreateFunc* allDemos[]= //GpuRaytraceScene::MyCreateFunc, + GpuBoxPlaneScene::MyCreateFunc, GpuConvexPlaneScene::MyCreateFunc, @@ -332,7 +333,7 @@ sth_stash* initFont(GLPrimitiveRenderer* primRender) void Usage() { - printf("\nprogram.exe [--selected_demo=] [--cl_device=] [--benchmark] [--dump_timings] [--disable_opencl] [--cl_platform=] [--x_dim=] [--y_dim=] [--z_dim=] [--x_gap=] [--y_gap=] [--z_gap=] [--use_concave_mesh] [--new_batching]\n"); + printf("\nprogram.exe [--selected_demo=] [--cl_device=] [--benchmark] [--dump_timings] [--disable_opencl] [--cl_platform=] [--x_dim=] [--y_dim=] [--z_dim=] [--x_gap=] [--y_gap=] [--z_gap=] [--use_concave_mesh] [--new_batching] [--no_instanced_collision_shapes]\n"); }; @@ -443,7 +444,7 @@ int main(int argc, char* argv[]) { enableExperimentalCpuConcaveCollision = true; } - + ci.m_useInstancedCollisionShapes = !args.CheckCmdLineFlag("no_instanced_collision_shapes"); args.GetCmdLineArgument("cl_device", ci.preferredOpenCLDeviceIndex); args.GetCmdLineArgument("cl_platform", ci.preferredOpenCLPlatformIndex); args.GetCmdLineArgument("x_dim", ci.arraySizeX); diff --git a/Demos3/GpuDemos/rigidbody/ConcaveScene.cpp b/Demos3/GpuDemos/rigidbody/ConcaveScene.cpp index 4acbba70d..092e6f260 100644 --- a/Demos3/GpuDemos/rigidbody/ConcaveScene.cpp +++ b/Demos3/GpuDemos/rigidbody/ConcaveScene.cpp @@ -18,6 +18,8 @@ #include "GpuRigidBodyDemoInternalData.h" #include"../../Wavefront/objLoader.h" #include "Bullet3Common/b3Transform.h" +#include "Bullet3OpenCL/NarrowphaseCollision/b3ConvexUtility.h" + #include "OpenGLWindow/GLInstanceGraphicsShape.h" #define CONCAVE_GAPX 16 @@ -323,21 +325,50 @@ void ConcaveScene::createDynamicObjects(const ConstructionInfo& ci) { int curColor = 0; b3Vector4 colors[4] = - { - b3Vector4(1,1,1,1), - b3Vector4(1,1,0.3,1), - b3Vector4(0.3,1,1,1), - b3Vector4(0.3,0.3,1,1), - }; + { + b3Vector4(1,1,1,1), + b3Vector4(1,1,0.3,1), + b3Vector4(0.3,1,1,1), + b3Vector4(0.3,0.3,1,1), + }; + + b3ConvexUtility* utilPtr = new b3ConvexUtility(); b3Vector4 scaling(1,1,1,1); - int colIndex = m_data->m_np->registerConvexHullShape(&cube_vertices[0],strideInBytes,numVertices, scaling); + + { + b3AlignedObjectArray verts; + + unsigned char* vts = (unsigned char*) cube_vertices; + for (int i=0;iinitializePolyhedralFeatures(&verts[0],verts.size(),merge); + } + } + +// int colIndex = m_data->m_np->registerConvexHullShape(&cube_vertices[0],strideInBytes,numVertices, scaling); + + int colIndex=-1; + if (ci.m_useInstancedCollisionShapes) + colIndex = m_data->m_np->registerConvexHullShape(utilPtr); + for (int i=0;im_np->registerConvexHullShape(utilPtr); + float mass = 1; //b3Vector3 position(-2*ci.gapX+i*ci.gapX,25+j*ci.gapY,-2*ci.gapZ+k*ci.gapZ); diff --git a/Demos3/GpuDemos/rigidbody/GpuConvexScene.cpp b/Demos3/GpuDemos/rigidbody/GpuConvexScene.cpp index 1a8cbdca5..7d876fad6 100644 --- a/Demos3/GpuDemos/rigidbody/GpuConvexScene.cpp +++ b/Demos3/GpuDemos/rigidbody/GpuConvexScene.cpp @@ -20,6 +20,7 @@ #include "Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h" #include "OpenGLWindow/GLPrimitiveRenderer.h" #include "Bullet3OpenCL/Raycast/b3GpuRaycast.h" +#include "Bullet3OpenCL/NarrowphaseCollision/b3ConvexUtility.h" void GpuConvexScene::setupScene(const ConstructionInfo& ci) @@ -88,26 +89,56 @@ int GpuConvexScene::createDynamicsObjects2(const ConstructionInfo& ci, const flo { b3Vector4 colors[4] = - { - b3Vector4(1,0,0,1), - b3Vector4(0,1,0,1), - b3Vector4(0,1,1,1), - b3Vector4(1,1,0,1), - }; + { + b3Vector4(1,0,0,1), + b3Vector4(0,1,0,1), + b3Vector4(0,1,1,1), + b3Vector4(1,1,0,1), + }; int curColor = 0; float scaling[4] = {1,1,1,1}; int prevBody = -1; int insta = 0; - int colIndex = m_data->m_np->registerConvexHullShape(&vertices[0],strideInBytes,numVertices, scaling); + b3ConvexUtility* utilPtr = new b3ConvexUtility(); + + { + b3AlignedObjectArray verts; + + unsigned char* vts = (unsigned char*) vertices; + for (int i=0;iinitializePolyhedralFeatures(&verts[0],verts.size(),merge); + } + } + + int colIndex=-1; + if (ci.m_useInstancedCollisionShapes) + colIndex = m_data->m_np->registerConvexHullShape(utilPtr); + //int colIndex = m_data->m_np->registerSphereShape(1); for (int i=0;im_np->registerConvexHullShape(&vertices[0],strideInBytes,numVertices, scaling); + if (!ci.m_useInstancedCollisionShapes) + colIndex = m_data->m_np->registerConvexHullShape(utilPtr); + float mass = 1.f; if (j==0)//ci.arraySizeY-1) { @@ -128,7 +159,7 @@ int GpuConvexScene::createDynamicsObjects2(const ConstructionInfo& ci, const flo if (prevBody>=0) { - b3Point2PointConstraint* p2p = new b3Point2PointConstraint(pid,prevBody,b3Vector3(0,-1.1,0),b3Vector3(0,1.1,0)); + //b3Point2PointConstraint* p2p = new b3Point2PointConstraint(pid,prevBody,b3Vector3(0,-1.1,0),b3Vector3(0,1.1,0)); // m_data->m_rigidBodyPipeline->addConstraint(p2p);//,false); } prevBody = pid; diff --git a/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp b/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp index 08fe726cb..e66b96358 100644 --- a/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp +++ b/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp @@ -114,7 +114,7 @@ void GpuRigidBodyDemo::initPhysics(const ConstructionInfo& ci) m_data->m_bp = bp; b3DynamicBvhBroadphase* broadphaseDbvt = new b3DynamicBvhBroadphase(config.m_maxConvexBodies); - m_data->m_rigidBodyPipeline = new b3GpuRigidBodyPipeline(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue, np, bp,broadphaseDbvt); + m_data->m_rigidBodyPipeline = new b3GpuRigidBodyPipeline(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue, np, bp,broadphaseDbvt,config); setupScene(ci); diff --git a/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp b/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp index 0e1e6f08e..3c566a50e 100644 --- a/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp +++ b/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp @@ -118,7 +118,7 @@ void GpuSoftBodyDemo::initPhysics(const ConstructionInfo& ci) m_data->m_bp = bp; b3DynamicBvhBroadphase* broadphaseDbvt = new b3DynamicBvhBroadphase(config.m_maxConvexBodies); - m_data->m_rigidBodyPipeline = new b3GpuRigidBodyPipeline(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue, np, bp,broadphaseDbvt); + m_data->m_rigidBodyPipeline = new b3GpuRigidBodyPipeline(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue, np, bp,broadphaseDbvt,config); err = glGetError(); assert(err==GL_NO_ERROR); diff --git a/src/Bullet3OpenCL/RigidBody/b3Config.h b/src/Bullet3OpenCL/RigidBody/b3Config.h index 10cffe0d3..2886f6a7c 100644 --- a/src/Bullet3OpenCL/RigidBody/b3Config.h +++ b/src/Bullet3OpenCL/RigidBody/b3Config.h @@ -20,17 +20,17 @@ struct b3Config b3Config() #ifdef __APPLE__ - :m_maxConvexBodies(64*1024), + :m_maxConvexBodies(32*1024), #else - :m_maxConvexBodies(128*1024), + :m_maxConvexBodies(32*1024), #endif - m_maxConvexShapes(8192), + m_maxConvexShapes(81920), m_maxVerticesPerFace(64), m_maxFacesPerShape(64), - m_maxConvexVertices(8192), - m_maxConvexIndices(8192), - m_maxConvexUniqueEdges(8192), - m_maxCompoundChildShapes(8192), + m_maxConvexVertices(8192000), + m_maxConvexIndices(8192000), + m_maxConvexUniqueEdges(819200), + m_maxCompoundChildShapes(81920), m_maxTriConvexPairCapacity(512*1024) //m_maxTriConvexPairCapacity(256*1024) { diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp b/src/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp index 8824589d5..9404a66b5 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp +++ b/src/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp @@ -83,7 +83,6 @@ struct b3GpuNarrowPhaseInternalData - b3GpuNarrowPhase::b3GpuNarrowPhase(cl_context ctx, cl_device_id device, cl_command_queue queue, const b3Config& config) :m_data(0) ,m_planeBodyIndex(-1),m_static0Index(-1), m_context(ctx), @@ -94,6 +93,7 @@ m_queue(queue) m_data = new b3GpuNarrowPhaseInternalData(); memset(m_data,0,sizeof(b3GpuNarrowPhaseInternalData)); + m_data->m_config = config; m_data->m_gpuSatCollision = new GpuSatCollision(ctx,device,queue); @@ -115,6 +115,7 @@ m_queue(queue) m_data->m_inertiaBufferGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexBodies,false); m_data->m_collidablesGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexShapes); + m_data->m_collidablesCPU.reserve(config.m_maxConvexShapes); m_data->m_localShapeAABBCPU = new b3AlignedObjectArray; m_data->m_localShapeAABBGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexShapes); @@ -124,13 +125,23 @@ m_queue(queue) m_data->m_bodyBufferGPU = new b3OpenCLArray(ctx,queue, config.m_maxConvexBodies,false); m_data->m_convexFacesGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexShapes*config.m_maxFacesPerShape,false); + m_data->m_convexFaces.reserve(config.m_maxConvexShapes*config.m_maxFacesPerShape); + m_data->m_gpuChildShapes = new b3OpenCLArray(ctx,queue,config.m_maxCompoundChildShapes,false); m_data->m_convexPolyhedraGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexShapes,false); + m_data->m_convexPolyhedra.reserve(config.m_maxConvexShapes); + m_data->m_uniqueEdgesGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexUniqueEdges,true); + m_data->m_uniqueEdges.reserve(config.m_maxConvexUniqueEdges); + + + m_data->m_convexVerticesGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexVertices,true); + m_data->m_convexVertices.reserve(config.m_maxConvexVertices); + m_data->m_convexIndicesGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexIndices,true); - + m_data->m_convexIndices.reserve(config.m_maxConvexIndices); m_data->m_worldVertsB1GPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexBodies*config.m_maxVerticesPerFace); m_data->m_clippingFacesOutGPU = new b3OpenCLArray(ctx,queue,config.m_maxConvexBodies); @@ -141,7 +152,6 @@ m_queue(queue) m_data->m_convexData = new b3AlignedObjectArray(); - m_data->m_convexData->resize(config.m_maxConvexShapes); m_data->m_convexPolyhedra.resize(config.m_maxConvexShapes); @@ -237,7 +247,7 @@ int b3GpuNarrowPhase::registerSphereShape(float radius) aabb.m_signedMaxIndices[3] = 0; m_data->m_localShapeAABBCPU->push_back(aabb); - m_data->m_localShapeAABBGPU->push_back(aabb); +// m_data->m_localShapeAABBGPU->push_back(aabb); clFinish(m_queue); } @@ -253,7 +263,6 @@ int b3GpuNarrowPhase::registerFace(const b3Vector3& faceNormal, float faceConsta face.m_plane[1] = faceNormal.getY(); face.m_plane[2] = faceNormal.getZ(); face.m_plane[3] = faceConstant; - m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces); return faceOffset; } @@ -280,7 +289,7 @@ int b3GpuNarrowPhase::registerPlaneShape(const b3Vector3& planeNormal, float pl aabb.m_signedMaxIndices[3] = 0; m_data->m_localShapeAABBCPU->push_back(aabb); - m_data->m_localShapeAABBGPU->push_back(aabb); +// m_data->m_localShapeAABBGPU->push_back(aabb); clFinish(m_queue); } @@ -290,6 +299,7 @@ int b3GpuNarrowPhase::registerPlaneShape(const b3Vector3& planeNormal, float pl int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* convexPtr,b3Collidable& col) { + m_data->m_convexData->resize(m_data->m_numAcceleratedShapes+1); m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes+1); @@ -317,7 +327,10 @@ int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* convexPtr,b3Colli int faceOffset = m_data->m_convexFaces.size(); convex.m_faceOffset = faceOffset; convex.m_numFaces = convexPtr->m_faces.size(); + m_data->m_convexFaces.resize(faceOffset+convex.m_numFaces); + + for (i=0;im_faces.size();i++) { m_data->m_convexFaces[convex.m_faceOffset+i].m_plane[0] = convexPtr->m_faces[i].m_plane[0]; @@ -338,6 +351,7 @@ int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* convexPtr,b3Colli convex.m_numVertices = convexPtr->m_vertices.size(); int vertexOffset = m_data->m_convexVertices.size(); convex.m_vertexOffset =vertexOffset; + m_data->m_convexVertices.resize(vertexOffset+convex.m_numVertices); for (int i=0;im_vertices.size();i++) { @@ -346,12 +360,6 @@ int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* convexPtr,b3Colli (*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = convexPtr; - m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces); - - m_data->m_convexPolyhedraGPU->copyFromHost(m_data->m_convexPolyhedra); - m_data->m_uniqueEdgesGPU->copyFromHost(m_data->m_uniqueEdges); - m_data->m_convexVerticesGPU->copyFromHost(m_data->m_convexVertices); - m_data->m_convexIndicesGPU->copyFromHost(m_data->m_convexIndices); return m_data->m_numAcceleratedShapes++; @@ -361,7 +369,7 @@ int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* convexPtr,b3Colli int b3GpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling) { b3AlignedObjectArray verts; - + unsigned char* vts = (unsigned char*) vertices; for (int i=0;im_localShapeAABBCPU->push_back(aabb); - m_data->m_localShapeAABBGPU->push_back(aabb); +// m_data->m_localShapeAABBGPU->push_back(aabb); } return collidableIndex; @@ -442,8 +450,6 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArraym_cpuChildShapes.push_back(childShapes->at(i)); } - //if writing the data directly is too slow, we can delay it and do it all at once in - m_data->m_gpuChildShapes->copyFromHost(m_data->m_cpuChildShapes); } @@ -492,7 +498,7 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArraym_localShapeAABBCPU->push_back(aabbWS); - m_data->m_localShapeAABBGPU->push_back(aabbWS); +// m_data->m_localShapeAABBGPU->push_back(aabbWS); clFinish(m_queue); return collidableIndex; @@ -534,7 +540,7 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray* vert aabb.m_signedMaxIndices[3]= 0; m_data->m_localShapeAABBCPU->push_back(aabb); - m_data->m_localShapeAABBGPU->push_back(aabb); +// m_data->m_localShapeAABBGPU->push_back(aabb); b3OptimizedBvh* bvh = new b3OptimizedBvh(); //void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax) @@ -554,7 +560,6 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray* vert m_data->m_bvhData.push_back(bvh); int numNodes = bvh->getQuantizedNodeArray().size(); //b3OpenCLArray* treeNodesGPU = new b3OpenCLArray(this->m_context,this->m_queue,numNodes); - //treeNodesGPU->copyFromHost(bvh->getQuantizedNodeArray()); int numSubTrees = bvh->getSubtreeInfoArray().size(); b3BvhInfo bvhInfo; @@ -568,7 +573,6 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray* vert bvhInfo.m_subTreeOffset = m_data->m_subTreesCPU.size(); m_data->m_bvhInfoCPU.push_back(bvhInfo); - m_data->m_bvhInfoGPU->copyFromHost(m_data->m_bvhInfoCPU); int numNewSubtrees = bvh->getSubtreeInfoArray().size(); @@ -584,11 +588,7 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray* vert m_data->m_treeNodesCPU.push_back(bvh->getQuantizedNodeArray()[i]); } - //b3OpenCLArray* subTreesGPU = new b3OpenCLArray(this->m_context,this->m_queue,numSubTrees); - //subTreesGPU->copyFromHost(bvh->getSubtreeInfoArray()); - m_data->m_treeNodesGPU->copyFromHost(m_data->m_treeNodesCPU); - m_data->m_subTreesGPU->copyFromHost(m_data->m_subTreesCPU); return collidableIndex; @@ -661,12 +661,6 @@ int b3GpuNarrowPhase::registerConcaveMeshShape(b3AlignedObjectArray* (*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = 0; - m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces); - - m_data->m_convexPolyhedraGPU->copyFromHost(m_data->m_convexPolyhedra); - m_data->m_uniqueEdgesGPU->copyFromHost(m_data->m_uniqueEdges); - m_data->m_convexVerticesGPU->copyFromHost(m_data->m_convexVertices); - m_data->m_convexIndicesGPU->copyFromHost(m_data->m_convexIndices); return m_data->m_numAcceleratedShapes++; } @@ -907,6 +901,24 @@ int b3GpuNarrowPhase::getNumRigidBodies() const void b3GpuNarrowPhase::writeAllBodiesToGpu() { + + if (m_data->m_localShapeAABBCPU->size()) + { + m_data->m_localShapeAABBGPU->copyFromHost(*m_data->m_localShapeAABBCPU); + } + + + m_data->m_gpuChildShapes->copyFromHost(m_data->m_cpuChildShapes); + m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces); + m_data->m_convexPolyhedraGPU->copyFromHost(m_data->m_convexPolyhedra); + m_data->m_uniqueEdgesGPU->copyFromHost(m_data->m_uniqueEdges); + m_data->m_convexVerticesGPU->copyFromHost(m_data->m_convexVertices); + m_data->m_convexIndicesGPU->copyFromHost(m_data->m_convexIndices); + m_data->m_bvhInfoGPU->copyFromHost(m_data->m_bvhInfoCPU); + m_data->m_treeNodesGPU->copyFromHost(m_data->m_treeNodesCPU); + m_data->m_subTreesGPU->copyFromHost(m_data->m_subTreesCPU); + + m_data->m_bodyBufferGPU->resize(m_data->m_numAcceleratedRigidBodies); m_data->m_inertiaBufferGPU->resize(m_data->m_numAcceleratedRigidBodies); diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp index 3dd8f5231..3e4a86a6b 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp @@ -37,7 +37,7 @@ bool dumpContactStats = false; -b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q,class b3GpuNarrowPhase* narrowphase, class b3GpuSapBroadphase* broadphaseSap , struct b3DynamicBvhBroadphase* broadphaseDbvt) +b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q,class b3GpuNarrowPhase* narrowphase, class b3GpuSapBroadphase* broadphaseSap , struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config) { m_data = new b3GpuRigidBodyPipelineInternalData; m_data->m_context = ctx; @@ -45,7 +45,7 @@ b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id devic m_data->m_queue = q; m_data->m_solver = new b3PgsJacobiSolver(true); - b3Config config; + m_data->m_allAabbsGPU = new b3OpenCLArray(ctx,q,config.m_maxConvexBodies); m_data->m_overlappingPairsGPU = new b3OpenCLArray(ctx,q,config.m_maxBroadphasePairs); @@ -282,10 +282,9 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime) } else #endif //TEST_OTHER_GPU_SOLVER { - b3Config config; int static0Index = m_data->m_narrowphase->getStatic0Index(); - m_data->m_solver2->solveContacts(numBodies, gpuBodies.getBufferCL(),gpuInertias.getBufferCL(),numContacts, gpuContacts.getBufferCL(),config, static0Index); + m_data->m_solver2->solveContacts(numBodies, gpuBodies.getBufferCL(),gpuInertias.getBufferCL(),numContacts, gpuContacts.getBufferCL(),m_data->m_config, static0Index); //m_data->m_solver4->solveContacts(m_data->m_narrowphase->getNumBodiesGpu(), gpuBodies.getBufferCL(), gpuInertias.getBufferCL(), numContacts, gpuContacts.getBufferCL()); diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h index cd1f0f428..e84095524 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h @@ -2,6 +2,7 @@ #define B3_GPU_RIGIDBODY_PIPELINE_H #include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" +#include "b3Config.h" class b3GpuRigidBodyPipeline { @@ -13,7 +14,7 @@ protected: public: - b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q , class b3GpuNarrowPhase* narrowphase, class b3GpuSapBroadphase* broadphaseSap, struct b3DynamicBvhBroadphase* broadphaseDbvt); + b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q , class b3GpuNarrowPhase* narrowphase, class b3GpuSapBroadphase* broadphaseSap, struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config); virtual ~b3GpuRigidBodyPipeline(); void stepSimulation(float deltaTime); diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h index 866ebd729..d31467a0f 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h @@ -9,6 +9,7 @@ #include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h" #include "Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h" +#include "b3Config.h" @@ -39,6 +40,7 @@ struct b3GpuRigidBodyPipelineInternalData class b3GpuNarrowPhase* m_narrowphase; b3Vector3 m_gravity; + b3Config m_config; }; #endif //B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H