Added libspe2 parallel Cell SPE support contribution by IBM Germany 'Extreme Blue' project:
Thanks to Benjamin Hoeferlin, Minh Cuong Tran,Martina Huellmann,Frederick Roth.
This commit is contained in:
@@ -1,44 +1,72 @@
|
|||||||
#ifndef TYPE_DEFINITIONS_H
|
#ifndef TYPE_DEFINITIONS_H
|
||||||
#define TYPE_DEFINITIONS_H
|
#define TYPE_DEFINITIONS_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///This file provides some platform/compiler checks for common definitions
|
///This file provides some platform/compiler checks for common definitions
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300)
|
|
||||||
#else
|
typedef union
|
||||||
#endif //__MINGW32__
|
{
|
||||||
|
unsigned int u;
|
||||||
typedef unsigned char uint8_t;
|
void *p;
|
||||||
typedef unsigned long int uint64_t;
|
} addr64;
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
typedef unsigned short uint16_t;
|
#if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300)
|
||||||
|
#else
|
||||||
#include <malloc.h>
|
#endif //__MINGW32__
|
||||||
#define memalign(alignment, size) malloc(size);
|
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
#include <string.h> //memcpy
|
typedef unsigned long int uint64_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
#define USE_WIN32_THREADING 1
|
typedef unsigned short uint16_t;
|
||||||
|
|
||||||
#else
|
#include <malloc.h>
|
||||||
#if defined (__CELLOS_LV2__)
|
#define memalign(alignment, size) malloc(size);
|
||||||
///Playstation 3 Cell SDK
|
|
||||||
#include <spu_printf.h>
|
#include <string.h> //memcpy
|
||||||
#else
|
|
||||||
//non-windows systems
|
#define USE_WIN32_THREADING 1
|
||||||
|
|
||||||
#define USE_PTHREADS 1
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#define spu_printf printf
|
||||||
#endif //__CELLOS_LV2__
|
|
||||||
|
#else
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h> //for memcpy
|
#include <string.h> //for memcpy
|
||||||
|
|
||||||
#endif
|
#if defined (__CELLOS_LV2__)
|
||||||
|
// Playstation 3 Cell SDK
|
||||||
|
#include <spu_printf.h>
|
||||||
#endif //TYPE_DEFINITIONS_H
|
|
||||||
|
#else
|
||||||
|
// posix system
|
||||||
|
|
||||||
|
#define USE_PTHREADS
|
||||||
|
|
||||||
|
#ifdef USE_LIBSPE2
|
||||||
|
#include <stdio.h>
|
||||||
|
#define spu_printf printf
|
||||||
|
#define DWORD unsigned int
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
unsigned long long ull;
|
||||||
|
unsigned int ui[2];
|
||||||
|
void *p;
|
||||||
|
} addr64;
|
||||||
|
|
||||||
|
|
||||||
|
#endif // USE_LIBSPE2
|
||||||
|
|
||||||
|
#endif //__CELLOS_LV2__
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif //TYPE_DEFINITIONS_H
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,288 +1,273 @@
|
|||||||
/*
|
/*
|
||||||
Bullet Continuous Collision Detection and Physics Library
|
Bullet Continuous Collision Detection and Physics Library
|
||||||
Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
|
Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied warranty.
|
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.
|
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,
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
including commercial applications, and to alter it and redistribute it freely,
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
subject to the following restrictions:
|
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.
|
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.
|
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.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//#define DEBUG_SPU_TASK_SCHEDULING 1
|
//#define DEBUG_SPU_TASK_SCHEDULING 1
|
||||||
|
|
||||||
#include "btThreadSupportInterface.h"
|
|
||||||
|
//class OptimizedBvhNode;
|
||||||
//#include "SPUAssert.h"
|
|
||||||
#include <string.h>
|
#include "SpuCollisionTaskProcess.h"
|
||||||
|
|
||||||
//class OptimizedBvhNode;
|
|
||||||
|
|
||||||
#include "SpuCollisionTaskProcess.h"
|
|
||||||
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
|
|
||||||
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
|
|
||||||
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
SpuCollisionTaskProcess::SpuCollisionTaskProcess(class btThreadSupportInterface* threadInterface, unsigned int maxNumOutstandingTasks)
|
||||||
#include "SpuLibspe2Support.h"
|
:m_threadInterface(threadInterface),
|
||||||
#include "SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" // for definitions processCollisionTask and createCollisionLocalStoreMemory
|
m_maxNumOutstandingTasks(maxNumOutstandingTasks)
|
||||||
|
{
|
||||||
|
m_workUnitTaskBuffers = (unsigned char *)0;
|
||||||
#include <stdio.h>
|
m_taskBusy.resize(m_maxNumOutstandingTasks);
|
||||||
|
m_spuGatherTaskDesc.resize(m_maxNumOutstandingTasks);
|
||||||
|
|
||||||
|
for (int i = 0; i < m_maxNumOutstandingTasks; i++)
|
||||||
|
{
|
||||||
|
m_taskBusy[i] = false;
|
||||||
|
}
|
||||||
|
m_numBusyTasks = 0;
|
||||||
SpuCollisionTaskProcess::SpuCollisionTaskProcess(class btThreadSupportInterface* threadInterface, unsigned int maxNumOutstandingTasks)
|
m_currentTask = 0;
|
||||||
:m_threadInterface(threadInterface),
|
m_currentPage = 0;
|
||||||
m_maxNumOutstandingTasks(maxNumOutstandingTasks)
|
m_currentPageEntry = 0;
|
||||||
{
|
|
||||||
m_workUnitTaskBuffers = (unsigned char *)0;
|
#ifdef DEBUG_SpuCollisionTaskProcess
|
||||||
|
m_initialized = false;
|
||||||
m_taskBusy.resize(m_maxNumOutstandingTasks);
|
#endif
|
||||||
m_spuGatherTaskDesc.resize(m_maxNumOutstandingTasks);
|
|
||||||
|
m_threadInterface->startSPU();
|
||||||
for (int i = 0; i < m_maxNumOutstandingTasks; i++)
|
|
||||||
{
|
//printf("sizeof vec_float4: %d\n", sizeof(vec_float4));
|
||||||
m_taskBusy[i] = false;
|
printf("sizeof SpuGatherAndProcessWorkUnitInput: %d\n", sizeof(SpuGatherAndProcessWorkUnitInput));
|
||||||
}
|
|
||||||
m_numBusyTasks = 0;
|
}
|
||||||
m_currentTask = 0;
|
|
||||||
m_currentPage = 0;
|
SpuCollisionTaskProcess::~SpuCollisionTaskProcess()
|
||||||
m_currentPageEntry = 0;
|
{
|
||||||
|
|
||||||
#ifdef DEBUG_SpuCollisionTaskProcess
|
if (m_workUnitTaskBuffers != 0)
|
||||||
m_initialized = false;
|
{
|
||||||
#endif
|
btAlignedFree(m_workUnitTaskBuffers);
|
||||||
|
m_workUnitTaskBuffers = 0;
|
||||||
m_threadInterface->startSPU();
|
}
|
||||||
|
|
||||||
//printf("sizeof vec_float4: %d\n", sizeof(vec_float4));
|
|
||||||
printf("sizeof SpuGatherAndProcessWorkUnitInput: %d\n", sizeof(SpuGatherAndProcessWorkUnitInput));
|
|
||||||
|
m_threadInterface->stopSPU();
|
||||||
}
|
|
||||||
|
}
|
||||||
SpuCollisionTaskProcess::~SpuCollisionTaskProcess()
|
|
||||||
{
|
|
||||||
if (m_workUnitTaskBuffers != 0)
|
|
||||||
{
|
void SpuCollisionTaskProcess::initialize2()
|
||||||
free(m_workUnitTaskBuffers);
|
{
|
||||||
m_workUnitTaskBuffers = 0;
|
|
||||||
}
|
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
||||||
|
printf("SpuCollisionTaskProcess::initialize()\n");
|
||||||
|
#endif //DEBUG_SPU_TASK_SCHEDULING
|
||||||
|
if (!m_workUnitTaskBuffers)
|
||||||
m_threadInterface->stopSPU();
|
{
|
||||||
|
m_workUnitTaskBuffers = (unsigned char *)btAlignedAlloc(MIDPHASE_WORKUNIT_TASK_SIZE*m_maxNumOutstandingTasks, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < m_maxNumOutstandingTasks; i++)
|
||||||
|
{
|
||||||
void
|
m_taskBusy[i] = false;
|
||||||
SpuCollisionTaskProcess::initialize2()
|
}
|
||||||
{
|
m_numBusyTasks = 0;
|
||||||
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
m_currentTask = 0;
|
||||||
printf("SpuCollisionTaskProcess::initialize()\n");
|
m_currentPage = 0;
|
||||||
#endif //DEBUG_SPU_TASK_SCHEDULING
|
m_currentPageEntry = 0;
|
||||||
if (!m_workUnitTaskBuffers)
|
|
||||||
{
|
#ifdef DEBUG_SpuCollisionTaskProcess
|
||||||
m_workUnitTaskBuffers = (unsigned char *)memalign(128, MIDPHASE_WORKUNIT_TASK_SIZE*m_maxNumOutstandingTasks);
|
m_initialized = true;
|
||||||
}
|
assert(MIDPHASE_NUM_WORKUNITS_PER_TASK*sizeof(SpuGatherAndProcessWorkUnitInput) <= MIDPHASE_WORKUNIT_TASK_SIZE);
|
||||||
|
#endif
|
||||||
for (int i = 0; i < m_maxNumOutstandingTasks; i++)
|
}
|
||||||
{
|
|
||||||
m_taskBusy[i] = false;
|
|
||||||
}
|
void SpuCollisionTaskProcess::issueTask2()
|
||||||
m_numBusyTasks = 0;
|
{
|
||||||
m_currentTask = 0;
|
|
||||||
m_currentPage = 0;
|
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
||||||
m_currentPageEntry = 0;
|
printf("SpuCollisionTaskProcess::issueTask (m_currentTask= %d\n)", m_currentTask);
|
||||||
|
#endif //DEBUG_SPU_TASK_SCHEDULING
|
||||||
#ifdef DEBUG_SpuCollisionTaskProcess
|
|
||||||
m_initialized = true;
|
m_taskBusy[m_currentTask] = true;
|
||||||
assert(MIDPHASE_NUM_WORKUNITS_PER_TASK*sizeof(SpuGatherAndProcessWorkUnitInput) <= MIDPHASE_WORKUNIT_TASK_SIZE);
|
m_numBusyTasks++;
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
SpuGatherAndProcessPairsTaskDesc& taskDesc = m_spuGatherTaskDesc[m_currentTask];
|
||||||
|
{
|
||||||
void SpuCollisionTaskProcess::issueTask2()
|
// send task description in event message
|
||||||
{
|
// no error checking here...
|
||||||
|
// but, currently, event queue can be no larger than NUM_WORKUNIT_TASKS.
|
||||||
|
|
||||||
|
taskDesc.inPtr = reinterpret_cast<uint64_t>(MIDPHASE_TASK_PTR(m_currentTask));
|
||||||
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
|
||||||
printf("SpuCollisionTaskProcess::issueTask (m_currentTask= %d\)n", m_currentTask);
|
taskDesc.taskId = m_currentTask;
|
||||||
#endif //DEBUG_SPU_TASK_SCHEDULING
|
taskDesc.numPages = m_currentPage+1;
|
||||||
|
taskDesc.numOnLastPage = m_currentPageEntry;
|
||||||
m_taskBusy[m_currentTask] = true;
|
}
|
||||||
m_numBusyTasks++;
|
|
||||||
|
|
||||||
|
|
||||||
SpuGatherAndProcessPairsTaskDesc& taskDesc = m_spuGatherTaskDesc[m_currentTask];
|
m_threadInterface->sendRequest(CMD_GATHER_AND_PROCESS_PAIRLIST, (uint32_t) &taskDesc,m_currentTask);
|
||||||
{
|
|
||||||
// send task description in event message
|
// if all tasks busy, wait for spu event to clear the task.
|
||||||
// no error checking here...
|
|
||||||
// but, currently, event queue can be no larger than NUM_WORKUNIT_TASKS.
|
|
||||||
|
if (m_numBusyTasks >= m_maxNumOutstandingTasks)
|
||||||
taskDesc.inPtr = reinterpret_cast<uint64_t>(MIDPHASE_TASK_PTR(m_currentTask));
|
{
|
||||||
|
unsigned int taskId;
|
||||||
taskDesc.taskId = m_currentTask;
|
unsigned int outputSize;
|
||||||
taskDesc.numPages = m_currentPage+1;
|
|
||||||
taskDesc.numOnLastPage = m_currentPageEntry;
|
m_threadInterface->waitForResponse(&taskId, &outputSize);
|
||||||
}
|
|
||||||
|
//printf("PPU: after issue, received event: %u %d\n", taskId, outputSize);
|
||||||
|
|
||||||
|
//postProcess(taskId, outputSize);
|
||||||
m_threadInterface->sendRequest(CMD_GATHER_AND_PROCESS_PAIRLIST, (uint32_t) &taskDesc,m_currentTask);
|
|
||||||
|
m_taskBusy[taskId] = false;
|
||||||
// if all tasks busy, wait for spu event to clear the task.
|
|
||||||
|
m_numBusyTasks--;
|
||||||
|
}
|
||||||
if (m_numBusyTasks >= m_maxNumOutstandingTasks)
|
|
||||||
{
|
}
|
||||||
unsigned int taskId;
|
|
||||||
unsigned int outputSize;
|
void SpuCollisionTaskProcess::addWorkToTask(void* pairArrayPtr,int startIndex,int endIndex)
|
||||||
|
{
|
||||||
m_threadInterface->waitForResponse(&taskId, &outputSize);
|
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
||||||
|
printf("#");
|
||||||
//printf("PPU: after issue, received event: %u %d\n", taskId, outputSize);
|
#endif //DEBUG_SPU_TASK_SCHEDULING
|
||||||
|
|
||||||
//postProcess(taskId, outputSize);
|
#ifdef DEBUG_SpuCollisionTaskProcess
|
||||||
|
assert(m_initialized);
|
||||||
m_taskBusy[taskId] = false;
|
assert(m_workUnitTaskBuffers);
|
||||||
|
|
||||||
m_numBusyTasks--;
|
#endif
|
||||||
}
|
|
||||||
|
bool batch = true;
|
||||||
}
|
|
||||||
|
if (batch)
|
||||||
void SpuCollisionTaskProcess::addWorkToTask(void* pairArrayPtr,int startIndex,int endIndex)
|
{
|
||||||
{
|
if (m_currentPageEntry == MIDPHASE_NUM_WORKUNITS_PER_PAGE)
|
||||||
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
{
|
||||||
printf("#");
|
if (m_currentPage == MIDPHASE_NUM_WORKUNIT_PAGES-1)
|
||||||
#endif //DEBUG_SPU_TASK_SCHEDULING
|
{
|
||||||
|
// task buffer is full, issue current task.
|
||||||
#ifdef DEBUG_SpuCollisionTaskProcess
|
// if all task buffers busy, this waits until SPU is done.
|
||||||
assert(m_initialized);
|
issueTask2();
|
||||||
assert(m_workUnitTaskBuffers);
|
|
||||||
|
// find new task buffer
|
||||||
#endif
|
for (unsigned int i = 0; i < m_maxNumOutstandingTasks; i++)
|
||||||
|
{
|
||||||
bool batch = true;
|
if (!m_taskBusy[i])
|
||||||
|
{
|
||||||
if (batch)
|
m_currentTask = i;
|
||||||
{
|
//init the task data
|
||||||
if (m_currentPageEntry == MIDPHASE_NUM_WORKUNITS_PER_PAGE)
|
|
||||||
{
|
break;
|
||||||
if (m_currentPage == MIDPHASE_NUM_WORKUNIT_PAGES-1)
|
}
|
||||||
{
|
}
|
||||||
// task buffer is full, issue current task.
|
|
||||||
// if all task buffers busy, this waits until SPU is done.
|
m_currentPage = 0;
|
||||||
issueTask2();
|
}
|
||||||
|
else
|
||||||
// find new task buffer
|
{
|
||||||
for (unsigned int i = 0; i < m_maxNumOutstandingTasks; i++)
|
m_currentPage++;
|
||||||
{
|
}
|
||||||
if (!m_taskBusy[i])
|
|
||||||
{
|
m_currentPageEntry = 0;
|
||||||
m_currentTask = i;
|
}
|
||||||
//init the task data
|
}
|
||||||
|
|
||||||
break;
|
{
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_currentPage = 0;
|
SpuGatherAndProcessWorkUnitInput &wuInput =
|
||||||
}
|
*(reinterpret_cast<SpuGatherAndProcessWorkUnitInput*>
|
||||||
else
|
(MIDPHASE_ENTRY_PTR(m_currentTask, m_currentPage, m_currentPageEntry)));
|
||||||
{
|
|
||||||
m_currentPage++;
|
wuInput.m_pairArrayPtr = reinterpret_cast<uint64_t>(pairArrayPtr);
|
||||||
}
|
wuInput.m_startIndex = startIndex;
|
||||||
|
wuInput.m_endIndex = endIndex;
|
||||||
m_currentPageEntry = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
m_currentPageEntry++;
|
||||||
{
|
|
||||||
|
if (!batch)
|
||||||
|
{
|
||||||
|
issueTask2();
|
||||||
SpuGatherAndProcessWorkUnitInput &wuInput =
|
|
||||||
*(reinterpret_cast<SpuGatherAndProcessWorkUnitInput*>
|
// find new task buffer
|
||||||
(MIDPHASE_ENTRY_PTR(m_currentTask, m_currentPage, m_currentPageEntry)));
|
for (unsigned int i = 0; i < m_maxNumOutstandingTasks; i++)
|
||||||
|
{
|
||||||
wuInput.m_pairArrayPtr = reinterpret_cast<uint64_t>(pairArrayPtr);
|
if (!m_taskBusy[i])
|
||||||
wuInput.m_startIndex = startIndex;
|
{
|
||||||
wuInput.m_endIndex = endIndex;
|
m_currentTask = i;
|
||||||
|
//init the task data
|
||||||
|
|
||||||
|
break;
|
||||||
m_currentPageEntry++;
|
}
|
||||||
|
}
|
||||||
if (!batch)
|
|
||||||
{
|
m_currentPage = 0;
|
||||||
issueTask2();
|
m_currentPageEntry =0;
|
||||||
|
}
|
||||||
// find new task buffer
|
}
|
||||||
for (unsigned int i = 0; i < m_maxNumOutstandingTasks; i++)
|
}
|
||||||
{
|
|
||||||
if (!m_taskBusy[i])
|
|
||||||
{
|
void
|
||||||
m_currentTask = i;
|
SpuCollisionTaskProcess::flush2()
|
||||||
//init the task data
|
{
|
||||||
|
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
||||||
break;
|
printf("\nSpuCollisionTaskProcess::flush()\n");
|
||||||
}
|
#endif //DEBUG_SPU_TASK_SCHEDULING
|
||||||
}
|
|
||||||
|
// if there's a partially filled task buffer, submit that task
|
||||||
m_currentPage = 0;
|
if (m_currentPage > 0 || m_currentPageEntry > 0)
|
||||||
m_currentPageEntry =0;
|
{
|
||||||
}
|
issueTask2();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
// all tasks are issued, wait for all tasks to be complete
|
||||||
void
|
while(m_numBusyTasks > 0)
|
||||||
SpuCollisionTaskProcess::flush2()
|
{
|
||||||
{
|
// Consolidating SPU code
|
||||||
#ifdef DEBUG_SPU_TASK_SCHEDULING
|
unsigned int taskId;
|
||||||
printf("\nSpuCollisionTaskProcess::flush()\n");
|
unsigned int outputSize;
|
||||||
#endif //DEBUG_SPU_TASK_SCHEDULING
|
|
||||||
|
{
|
||||||
// if there's a partially filled task buffer, submit that task
|
|
||||||
if (m_currentPage > 0 || m_currentPageEntry > 0)
|
// SPURS support.
|
||||||
{
|
m_threadInterface->waitForResponse(&taskId, &outputSize);
|
||||||
issueTask2();
|
}
|
||||||
}
|
|
||||||
|
//printf("PPU: flushing, received event: %u %d\n", taskId, outputSize);
|
||||||
|
|
||||||
// all tasks are issued, wait for all tasks to be complete
|
//postProcess(taskId, outputSize);
|
||||||
while(m_numBusyTasks > 0)
|
|
||||||
{
|
m_taskBusy[taskId] = false;
|
||||||
// Consolidating SPU code
|
|
||||||
unsigned int taskId;
|
m_numBusyTasks--;
|
||||||
unsigned int outputSize;
|
}
|
||||||
|
|
||||||
{
|
|
||||||
|
}
|
||||||
// SPURS support.
|
|
||||||
m_threadInterface->waitForResponse(&taskId, &outputSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
//printf("PPU: flushing, received event: %u %d\n", taskId, outputSize);
|
|
||||||
|
|
||||||
//postProcess(taskId, outputSize);
|
|
||||||
|
|
||||||
m_taskBusy[taskId] = false;
|
|
||||||
|
|
||||||
m_numBusyTasks--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,134 +1,152 @@
|
|||||||
/*
|
/*
|
||||||
Bullet Continuous Collision Detection and Physics Library
|
Bullet Continuous Collision Detection and Physics Library
|
||||||
Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
|
Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied warranty.
|
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.
|
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,
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
including commercial applications, and to alter it and redistribute it freely,
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
subject to the following restrictions:
|
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.
|
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.
|
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.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SPU_COLLISION_TASK_PROCESS_H
|
#ifndef SPU_COLLISION_TASK_PROCESS_H
|
||||||
#define SPU_COLLISION_TASK_PROCESS_H
|
#define SPU_COLLISION_TASK_PROCESS_H
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <LinearMath/btScalar.h>
|
#include <LinearMath/btScalar.h>
|
||||||
|
|
||||||
#include "PlatformDefinitions.h"
|
#include "PlatformDefinitions.h"
|
||||||
#include "LinearMath/btAlignedObjectArray.h"
|
#include "LinearMath/btAlignedObjectArray.h"
|
||||||
|
#include "SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" // for definitions processCollisionTask and createCollisionLocalStoreMemory
|
||||||
//#define DEBUG_SpuCollisionTaskProcess 1
|
|
||||||
|
#include "btThreadSupportInterface.h"
|
||||||
|
|
||||||
#define CMD_GATHER_AND_PROCESS_PAIRLIST 1
|
|
||||||
|
//#include "SPUAssert.h"
|
||||||
class btCollisionObject;
|
#include <string.h>
|
||||||
class btPersistentManifold;
|
|
||||||
class btDispatcher;
|
|
||||||
|
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
|
||||||
///Task Description for SPU collision detection
|
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
||||||
struct SpuGatherAndProcessPairsTaskDesc
|
|
||||||
{
|
#include <LinearMath/btAlignedAllocator.h>
|
||||||
uint64_t inPtr;//m_pairArrayPtr;
|
|
||||||
//mutex variable
|
#include <stdio.h>
|
||||||
uint32_t m_someMutexVariableInMainMemory;
|
|
||||||
|
|
||||||
uint64_t m_dispatcher;
|
#define DEBUG_SpuCollisionTaskProcess 1
|
||||||
|
|
||||||
uint32_t numOnLastPage;
|
|
||||||
|
#define CMD_GATHER_AND_PROCESS_PAIRLIST 1
|
||||||
uint16_t numPages;
|
|
||||||
uint16_t taskId;
|
class btCollisionObject;
|
||||||
|
class btPersistentManifold;
|
||||||
// struct CollisionTask_LocalStoreMemory* m_lsMemory;
|
class btDispatcher;
|
||||||
}
|
|
||||||
#ifdef __CELLOS_LV2__
|
|
||||||
__attribute__ ((aligned (16)))
|
/////Task Description for SPU collision detection
|
||||||
#endif
|
//struct SpuGatherAndProcessPairsTaskDesc
|
||||||
;
|
//{
|
||||||
|
// uint64_t inPtr;//m_pairArrayPtr;
|
||||||
|
// //mutex variable
|
||||||
///MidphaseWorkUnitInput stores individual primitive versus mesh collision detection input, to be processed by the SPU.
|
// uint32_t m_someMutexVariableInMainMemory;
|
||||||
struct SpuGatherAndProcessWorkUnitInput
|
//
|
||||||
{
|
// uint64_t m_dispatcher;
|
||||||
uint64_t m_pairArrayPtr;
|
//
|
||||||
int m_startIndex;
|
// uint32_t numOnLastPage;
|
||||||
int m_endIndex;
|
//
|
||||||
};
|
// uint16_t numPages;
|
||||||
|
// uint16_t taskId;
|
||||||
|
//
|
||||||
|
// struct CollisionTask_LocalStoreMemory* m_lsMemory;
|
||||||
|
//}
|
||||||
/// SpuCollisionTaskProcess handles SPU processing of collision pairs.
|
//
|
||||||
/// Maintains a set of task buffers.
|
//#if defined(__CELLOS_LV2__) || defined(USE_LIBSPE2)
|
||||||
/// When the task is full, the task is issued for SPUs to process. Contact output goes into btPersistentManifold
|
//__attribute__ ((aligned (16)))
|
||||||
/// associated with each task.
|
//#endif
|
||||||
/// When PPU issues a task, it will look for completed task buffers
|
//;
|
||||||
/// PPU will do postprocessing, dependent on workunit output (not likely)
|
|
||||||
class SpuCollisionTaskProcess
|
|
||||||
{
|
///MidphaseWorkUnitInput stores individual primitive versus mesh collision detection input, to be processed by the SPU.
|
||||||
|
struct SpuGatherAndProcessWorkUnitInput
|
||||||
unsigned char *m_workUnitTaskBuffers;
|
{
|
||||||
|
uint64_t m_pairArrayPtr;
|
||||||
|
int m_startIndex;
|
||||||
// track task buffers that are being used, and total busy tasks
|
int m_endIndex;
|
||||||
btAlignedObjectArray<bool> m_taskBusy;
|
};
|
||||||
btAlignedObjectArray<SpuGatherAndProcessPairsTaskDesc> m_spuGatherTaskDesc;
|
|
||||||
|
|
||||||
class btThreadSupportInterface* m_threadInterface;
|
|
||||||
|
|
||||||
unsigned int m_maxNumOutstandingTasks;
|
/// SpuCollisionTaskProcess handles SPU processing of collision pairs.
|
||||||
|
/// Maintains a set of task buffers.
|
||||||
unsigned int m_numBusyTasks;
|
/// When the task is full, the task is issued for SPUs to process. Contact output goes into btPersistentManifold
|
||||||
|
/// associated with each task.
|
||||||
// the current task and the current entry to insert a new work unit
|
/// When PPU issues a task, it will look for completed task buffers
|
||||||
unsigned int m_currentTask;
|
/// PPU will do postprocessing, dependent on workunit output (not likely)
|
||||||
unsigned int m_currentPage;
|
class SpuCollisionTaskProcess
|
||||||
unsigned int m_currentPageEntry;
|
{
|
||||||
|
|
||||||
#ifdef DEBUG_SpuCollisionTaskProcess
|
unsigned char *m_workUnitTaskBuffers;
|
||||||
bool m_initialized;
|
|
||||||
#endif
|
|
||||||
void issueTask2();
|
// track task buffers that are being used, and total busy tasks
|
||||||
//void postProcess(unsigned int taskId, int outputSize);
|
btAlignedObjectArray<bool> m_taskBusy;
|
||||||
|
btAlignedObjectArray<SpuGatherAndProcessPairsTaskDesc> m_spuGatherTaskDesc;
|
||||||
public:
|
|
||||||
SpuCollisionTaskProcess(btThreadSupportInterface* threadInterface, unsigned int maxNumOutstandingTasks);
|
class btThreadSupportInterface* m_threadInterface;
|
||||||
|
|
||||||
~SpuCollisionTaskProcess();
|
unsigned int m_maxNumOutstandingTasks;
|
||||||
|
|
||||||
///call initialize in the beginning of the frame, before addCollisionPairToTask
|
unsigned int m_numBusyTasks;
|
||||||
void initialize2();
|
|
||||||
|
// the current task and the current entry to insert a new work unit
|
||||||
///batch up additional work to a current task for SPU processing. When batch is full, it issues the task.
|
unsigned int m_currentTask;
|
||||||
void addWorkToTask(void* pairArrayPtr,int startIndex,int endIndex);
|
unsigned int m_currentPage;
|
||||||
|
unsigned int m_currentPageEntry;
|
||||||
///call flush to submit potential outstanding work to SPUs and wait for all involved SPUs to be finished
|
|
||||||
void flush2();
|
#ifdef DEBUG_SpuCollisionTaskProcess
|
||||||
};
|
bool m_initialized;
|
||||||
|
#endif
|
||||||
|
void issueTask2();
|
||||||
|
//void postProcess(unsigned int taskId, int outputSize);
|
||||||
#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)
|
public:
|
||||||
#define MIDPHASE_OUTPUT_PTR(task) (&m_contactOutputBuffers[0] + MIDPHASE_MAX_CONTACT_BUFFER_SIZE*task)
|
SpuCollisionTaskProcess(btThreadSupportInterface* threadInterface, unsigned int maxNumOutstandingTasks);
|
||||||
#define MIDPHASE_TREENODES_PTR(task) (&m_complexShapeBuffers[0] + MIDPHASE_COMPLEX_SHAPE_BUFFER_SIZE*task)
|
|
||||||
|
~SpuCollisionTaskProcess();
|
||||||
|
|
||||||
#define MIDPHASE_WORKUNIT_PAGE_SIZE (16)
|
///call initialize in the beginning of the frame, before addCollisionPairToTask
|
||||||
|
void initialize2();
|
||||||
#define MIDPHASE_NUM_WORKUNIT_PAGES 1
|
|
||||||
#define MIDPHASE_WORKUNIT_TASK_SIZE (MIDPHASE_WORKUNIT_PAGE_SIZE*MIDPHASE_NUM_WORKUNIT_PAGES)
|
///batch up additional work to a current task for SPU processing. When batch is full, it issues the task.
|
||||||
#define MIDPHASE_NUM_WORKUNITS_PER_PAGE (MIDPHASE_WORKUNIT_PAGE_SIZE / sizeof(SpuGatherAndProcessWorkUnitInput))
|
void addWorkToTask(void* pairArrayPtr,int startIndex,int endIndex);
|
||||||
#define MIDPHASE_NUM_WORKUNITS_PER_TASK (MIDPHASE_NUM_WORKUNITS_PER_PAGE*MIDPHASE_NUM_WORKUNIT_PAGES)
|
|
||||||
|
///call flush to submit potential outstanding work to SPUs and wait for all involved SPUs to be finished
|
||||||
|
void flush2();
|
||||||
#endif // SPU_COLLISION_TASK_PROCESS_H
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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_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 // SPU_COLLISION_TASK_PROCESS_H
|
||||||
|
|
||||||
|
|||||||
@@ -55,4 +55,4 @@ SpuContactManifoldCollisionAlgorithm::~SpuContactManifoldCollisionAlgorithm()
|
|||||||
{
|
{
|
||||||
if (m_manifoldPtr)
|
if (m_manifoldPtr)
|
||||||
m_dispatcher->releaseManifold(m_manifoldPtr);
|
m_dispatcher->releaseManifold(m_manifoldPtr);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user