180 lines
3.9 KiB
C++
180 lines
3.9 KiB
C++
/*
|
|
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.
|
|
*/
|
|
|
|
#include "b3SequentialThreadSupport.h"
|
|
|
|
|
|
|
|
b3SequentialThreadSupport::b3SequentialThreadSupport(SequentialThreadConstructionInfo& threadConstructionInfo)
|
|
{
|
|
startThreads(threadConstructionInfo);
|
|
}
|
|
|
|
///cleanup/shutdown Libspe2
|
|
b3SequentialThreadSupport::~b3SequentialThreadSupport()
|
|
{
|
|
stopThreads();
|
|
}
|
|
|
|
#include <stdio.h>
|
|
|
|
///send messages to SPUs
|
|
void b3SequentialThreadSupport::sendRequest(int uiCommand, void* uiArgument0, int taskId)
|
|
{
|
|
switch (uiCommand)
|
|
{
|
|
case B3_THREAD_SCHEDULE_TASK:
|
|
{
|
|
btSpuStatus& spuStatus = m_activeSpuStatus[0];
|
|
spuStatus.m_userPtr=(void*)uiArgument0;
|
|
spuStatus.m_userThreadFunc(spuStatus.m_userPtr,spuStatus.m_lsMemory);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
///not implemented
|
|
b3Assert(0 && "Not implemented");
|
|
}
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
///check for messages from SPUs
|
|
void b3SequentialThreadSupport::waitForResponse(unsigned int *puiArgument0, unsigned int *puiArgument1)
|
|
{
|
|
b3Assert(m_activeSpuStatus.size());
|
|
btSpuStatus& spuStatus = m_activeSpuStatus[0];
|
|
*puiArgument0 = spuStatus.m_taskId;
|
|
*puiArgument1 = spuStatus.m_status;
|
|
}
|
|
|
|
void b3SequentialThreadSupport::startThreads(SequentialThreadConstructionInfo& threadConstructionInfo)
|
|
{
|
|
m_activeSpuStatus.resize(1);
|
|
printf("STS: Not starting any threads\n");
|
|
btSpuStatus& spuStatus = m_activeSpuStatus[0];
|
|
spuStatus.m_userPtr = 0;
|
|
spuStatus.m_taskId = 0;
|
|
spuStatus.m_commandId = 0;
|
|
spuStatus.m_status = 0;
|
|
spuStatus.m_lsMemory = threadConstructionInfo.m_lsMemoryFunc();
|
|
spuStatus.m_userThreadFunc = threadConstructionInfo.m_userThreadFunc;
|
|
printf("STS: Created local store at %p for task %s\n", spuStatus.m_lsMemory, threadConstructionInfo.m_uniqueName);
|
|
}
|
|
|
|
void b3SequentialThreadSupport::startThreads()
|
|
{
|
|
}
|
|
|
|
void b3SequentialThreadSupport::stopThreads()
|
|
{
|
|
m_activeSpuStatus.clear();
|
|
}
|
|
|
|
void b3SequentialThreadSupport::setNumTasks(int numTasks)
|
|
{
|
|
printf("b3SequentialThreadSupport::setNumTasks(%d) is not implemented and has no effect\n",numTasks);
|
|
}
|
|
|
|
|
|
|
|
|
|
class btDummyBarrier : public b3Barrier
|
|
{
|
|
private:
|
|
|
|
public:
|
|
btDummyBarrier()
|
|
{
|
|
}
|
|
|
|
virtual ~btDummyBarrier()
|
|
{
|
|
}
|
|
|
|
void sync()
|
|
{
|
|
}
|
|
|
|
virtual void setMaxCount(int n) {}
|
|
virtual int getMaxCount() {return 1;}
|
|
};
|
|
|
|
class btDummyCriticalSection : public b3CriticalSection
|
|
{
|
|
|
|
public:
|
|
btDummyCriticalSection()
|
|
{
|
|
}
|
|
|
|
virtual ~btDummyCriticalSection()
|
|
{
|
|
}
|
|
|
|
unsigned int getSharedParam(int i)
|
|
{
|
|
b3Assert(i>=0&&i<31);
|
|
return mCommonBuff[i+1];
|
|
}
|
|
|
|
void setSharedParam(int i,unsigned int p)
|
|
{
|
|
b3Assert(i>=0&&i<31);
|
|
mCommonBuff[i+1] = p;
|
|
}
|
|
|
|
void lock()
|
|
{
|
|
mCommonBuff[0] = 1;
|
|
}
|
|
|
|
void unlock()
|
|
{
|
|
mCommonBuff[0] = 0;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
b3Barrier* b3SequentialThreadSupport::createBarrier()
|
|
{
|
|
return new btDummyBarrier();
|
|
}
|
|
|
|
b3CriticalSection* b3SequentialThreadSupport::createCriticalSection()
|
|
{
|
|
return new btDummyCriticalSection();
|
|
|
|
}
|
|
|
|
void b3SequentialThreadSupport::deleteBarrier(b3Barrier* barrier)
|
|
{
|
|
delete barrier;
|
|
}
|
|
|
|
void b3SequentialThreadSupport::deleteCriticalSection(b3CriticalSection* criticalSection)
|
|
{
|
|
delete criticalSection;
|
|
}
|
|
|
|
|
|
|
|
|
|
|