Jolt Physics
A multi core friendly Game Physics Engine
|
#include <LargeIslandSplitter.h>
Classes | |
struct | Split |
Describes a split of constraints and contacts. More... | |
class | Splits |
Structure that describes the resulting splits from the large island splitter. More... | |
Public Types | |
enum class | EStatus { WaitingForBatch , BatchRetrieved , AllBatchesDone } |
Status code for retrieving a batch. More... | |
Public Member Functions | |
~LargeIslandSplitter () | |
Destructor. | |
void | Prepare (const IslandBuilder &inIslandBuilder, uint32 inNumActiveBodies, TempAllocator *inTempAllocator) |
Prepare the island splitter by allocating memory. | |
uint | AssignSplit (const Body *inBody1, const Body *inBody2) |
Assign two bodies to a split. Returns the split index. | |
uint | AssignToNonParallelSplit (const Body *inBody) |
Force a body to be in a non parallel split. Returns the split index. | |
bool | SplitIsland (uint32 inIslandIndex, const IslandBuilder &inIslandBuilder, const BodyManager &inBodyManager, const ContactConstraintManager &inContactManager, Constraint **inActiveConstraints, CalculateSolverSteps &ioStepsCalculator) |
Splits up an island, the created splits will be added to the list of batches and can be fetched with FetchNextBatch. Returns false if the island did not need splitting. | |
EStatus | FetchNextBatch (uint &outSplitIslandIndex, uint32 *&outConstraintsBegin, uint32 *&outConstraintsEnd, uint32 *&outContactsBegin, uint32 *&outContactsEnd, bool &outFirstIteration) |
Fetch the next batch to process, returns a handle in outSplitIslandIndex that must be provided to MarkBatchProcessed when complete. | |
void | MarkBatchProcessed (uint inSplitIslandIndex, const uint32 *inConstraintsBegin, const uint32 *inConstraintsEnd, const uint32 *inContactsBegin, const uint32 *inContactsEnd, bool &outLastIteration, bool &outFinalBatch) |
Mark a batch as processed. | |
uint32 | GetIslandIndex (uint inSplitIslandIndex) const |
Get the island index of the island that was split for a particular split island index. | |
void | PrepareForSolvePositions () |
Prepare the island splitter for iterating over the split islands again for position solving. Marks all batches as startable. | |
void | Reset (TempAllocator *inTempAllocator) |
Reset the island splitter. | |
Public Member Functions inherited from NonCopyable | |
NonCopyable ()=default | |
NonCopyable (const NonCopyable &)=delete | |
void | operator= (const NonCopyable &)=delete |
Static Public Attributes | |
static constexpr uint | cNumSplits = sizeof(SplitMask) * 8 |
static constexpr uint | cNonParallelSplitIdx = cNumSplits - 1 |
static constexpr uint | cLargeIslandTreshold = 128 |
If the number of constraints + contacts in an island is larger than this, we will try to split the island. | |
Assigns bodies in large islands to multiple groups that can run in parallel
This basically implements what is described in: High-Performance Physical Simulations on Next-Generation Architecture with Many Cores by Chen et al. See: http://web.eecs.umich.edu/~msmelyan/papers/physsim_onmanycore_itj.pdf section "PARALLELIZATION METHODOLOGY"
LargeIslandSplitter::~LargeIslandSplitter | ( | ) |
Destructor.
Assign two bodies to a split. Returns the split index.
Force a body to be in a non parallel split. Returns the split index.
LargeIslandSplitter::EStatus LargeIslandSplitter::FetchNextBatch | ( | uint & | outSplitIslandIndex, |
uint32 *& | outConstraintsBegin, | ||
uint32 *& | outConstraintsEnd, | ||
uint32 *& | outContactsBegin, | ||
uint32 *& | outContactsEnd, | ||
bool & | outFirstIteration ) |
Fetch the next batch to process, returns a handle in outSplitIslandIndex that must be provided to MarkBatchProcessed when complete.
Get the island index of the island that was split for a particular split island index.
void LargeIslandSplitter::MarkBatchProcessed | ( | uint | inSplitIslandIndex, |
const uint32 * | inConstraintsBegin, | ||
const uint32 * | inConstraintsEnd, | ||
const uint32 * | inContactsBegin, | ||
const uint32 * | inContactsEnd, | ||
bool & | outLastIteration, | ||
bool & | outFinalBatch ) |
Mark a batch as processed.
void LargeIslandSplitter::Prepare | ( | const IslandBuilder & | inIslandBuilder, |
uint32 | inNumActiveBodies, | ||
TempAllocator * | inTempAllocator ) |
Prepare the island splitter by allocating memory.
void LargeIslandSplitter::PrepareForSolvePositions | ( | ) |
Prepare the island splitter for iterating over the split islands again for position solving. Marks all batches as startable.
void LargeIslandSplitter::Reset | ( | TempAllocator * | inTempAllocator | ) |
Reset the island splitter.
bool LargeIslandSplitter::SplitIsland | ( | uint32 | inIslandIndex, |
const IslandBuilder & | inIslandBuilder, | ||
const BodyManager & | inBodyManager, | ||
const ContactConstraintManager & | inContactManager, | ||
Constraint ** | inActiveConstraints, | ||
CalculateSolverSteps & | ioStepsCalculator ) |
Splits up an island, the created splits will be added to the list of batches and can be fetched with FetchNextBatch. Returns false if the island did not need splitting.
If the number of constraints + contacts in an island is larger than this, we will try to split the island.
|
staticconstexpr |