add basic CPU multi threading files from Bullet 2.x (still need to make it work)
This commit is contained in:
179
btgui/MultiThreading/b3SequentialThreadSupport.cpp
Normal file
179
btgui/MultiThreading/b3SequentialThreadSupport.cpp
Normal file
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user