123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /*
- Bullet Continuous Collision Detection and Physics Library
- Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it freely,
- subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #ifndef BT_SPU_COLLISION_TASK_PROCESS_H
- #define BT_SPU_COLLISION_TASK_PROCESS_H
- #include <assert.h>
- #include "bullet/LinearMath/btScalar.h"
- #include "PlatformDefinitions.h"
- #include "bullet/LinearMath/btAlignedObjectArray.h"
- #include "SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" // for definitions processCollisionTask and createCollisionLocalStoreMemory
- #include "btThreadSupportInterface.h"
- //#include "SPUAssert.h"
- #include <string.h>
- #include "bullet/BulletCollision//CollisionDispatch/btCollisionObject.h"
- #include "bullet/BulletCollision//CollisionShapes/btCollisionShape.h"
- #include "bullet/BulletCollision//CollisionShapes/btConvexShape.h"
- #include "bullet/LinearMath/btAlignedAllocator.h"
- #include <stdio.h>
- #define DEBUG_SpuCollisionTaskProcess 1
- #define CMD_GATHER_AND_PROCESS_PAIRLIST 1
- class btCollisionObject;
- class btPersistentManifold;
- class btDispatcher;
- /////Task Description for SPU collision detection
- //struct SpuGatherAndProcessPairsTaskDesc
- //{
- // uint64_t inPtr;//m_pairArrayPtr;
- // //mutex variable
- // uint32_t m_someMutexVariableInMainMemory;
- //
- // uint64_t m_dispatcher;
- //
- // uint32_t numOnLastPage;
- //
- // uint16_t numPages;
- // uint16_t taskId;
- //
- // struct CollisionTask_LocalStoreMemory* m_lsMemory;
- //}
- //
- //#if defined(__CELLOS_LV2__) || defined(USE_LIBSPE2)
- //__attribute__ ((aligned (16)))
- //#endif
- //;
- ///MidphaseWorkUnitInput stores individual primitive versus mesh collision detection input, to be processed by the SPU.
- ATTRIBUTE_ALIGNED16(struct) SpuGatherAndProcessWorkUnitInput
- {
- uint64_t m_pairArrayPtr;
- int m_startIndex;
- int m_endIndex;
- };
- /// SpuCollisionTaskProcess handles SPU processing of collision pairs.
- /// Maintains a set of task buffers.
- /// When the task is full, the task is issued for SPUs to process. Contact output goes into btPersistentManifold
- /// associated with each task.
- /// When PPU issues a task, it will look for completed task buffers
- /// PPU will do postprocessing, dependent on workunit output (not likely)
- class SpuCollisionTaskProcess
- {
- unsigned char *m_workUnitTaskBuffers;
- // track task buffers that are being used, and total busy tasks
- btAlignedObjectArray<bool> m_taskBusy;
- btAlignedObjectArray<SpuGatherAndProcessPairsTaskDesc> m_spuGatherTaskDesc;
- class btThreadSupportInterface* m_threadInterface;
- unsigned int m_maxNumOutstandingTasks;
- unsigned int m_numBusyTasks;
- // the current task and the current entry to insert a new work unit
- unsigned int m_currentTask;
- unsigned int m_currentPage;
- unsigned int m_currentPageEntry;
- bool m_useEpa;
- #ifdef DEBUG_SpuCollisionTaskProcess
- bool m_initialized;
- #endif
- void issueTask2();
- //void postProcess(unsigned int taskId, int outputSize);
- public:
- SpuCollisionTaskProcess(btThreadSupportInterface* threadInterface, unsigned int maxNumOutstandingTasks);
-
- ~SpuCollisionTaskProcess();
-
- ///call initialize in the beginning of the frame, before addCollisionPairToTask
- void initialize2(bool useEpa = false);
- ///batch up additional work to a current task for SPU processing. When batch is full, it issues the task.
- void addWorkToTask(void* pairArrayPtr,int startIndex,int endIndex);
- ///call flush to submit potential outstanding work to SPUs and wait for all involved SPUs to be finished
- void flush2();
- /// set the maximum number of SPU tasks allocated
- void setNumTasks(int maxNumTasks);
- int getNumTasks() const
- {
- return m_maxNumOutstandingTasks;
- }
- };
- #define MIDPHASE_TASK_PTR(task) (&m_workUnitTaskBuffers[0] + MIDPHASE_WORKUNIT_TASK_SIZE*task)
- #define MIDPHASE_ENTRY_PTR(task,page,entry) (MIDPHASE_TASK_PTR(task) + MIDPHASE_WORKUNIT_PAGE_SIZE*page + sizeof(SpuGatherAndProcessWorkUnitInput)*entry)
- #define MIDPHASE_OUTPUT_PTR(task) (&m_contactOutputBuffers[0] + MIDPHASE_MAX_CONTACT_BUFFER_SIZE*task)
- #define MIDPHASE_TREENODES_PTR(task) (&m_complexShapeBuffers[0] + MIDPHASE_COMPLEX_SHAPE_BUFFER_SIZE*task)
- #define MIDPHASE_WORKUNIT_PAGE_SIZE (16)
- //#define MIDPHASE_WORKUNIT_PAGE_SIZE (128)
- #define MIDPHASE_NUM_WORKUNIT_PAGES 1
- #define MIDPHASE_WORKUNIT_TASK_SIZE (MIDPHASE_WORKUNIT_PAGE_SIZE*MIDPHASE_NUM_WORKUNIT_PAGES)
- #define MIDPHASE_NUM_WORKUNITS_PER_PAGE (MIDPHASE_WORKUNIT_PAGE_SIZE / sizeof(SpuGatherAndProcessWorkUnitInput))
- #define MIDPHASE_NUM_WORKUNITS_PER_TASK (MIDPHASE_NUM_WORKUNITS_PER_PAGE*MIDPHASE_NUM_WORKUNIT_PAGES)
- #endif // BT_SPU_COLLISION_TASK_PROCESS_H
|