1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30
31#ifndef PXC_CONSTRAINTBLOCKPOOL_H
32#define PXC_CONSTRAINTBLOCKPOOL_H
33
34#include "PxvConfig.h"
35#include "PsArray.h"
36#include "PsMutex.h"
37#include "PxcNpMemBlockPool.h"
38
39namespace physx
40{
41class PxsConstraintBlockManager
42{
43public:
44 PxsConstraintBlockManager(PxcNpMemBlockPool & blockPool):
45 mBlockPool(blockPool)
46 {
47 }
48
49 PX_FORCE_INLINE void reset()
50 {
51 mBlockPool.releaseConstraintBlocks(memBlocks&: mTrackingArray);
52 }
53
54 PxcNpMemBlockArray mTrackingArray;
55 PxcNpMemBlockPool& mBlockPool;
56
57private:
58 PxsConstraintBlockManager& operator=(const PxsConstraintBlockManager&);
59};
60
61class PxcConstraintBlockStream
62{
63 PX_NOCOPY(PxcConstraintBlockStream)
64public:
65 PxcConstraintBlockStream(PxcNpMemBlockPool & blockPool) :
66 mBlockPool (blockPool),
67 mBlock (NULL),
68 mUsed (0)
69 {
70 }
71
72 PX_FORCE_INLINE PxU8* reserve(PxU32 size, PxsConstraintBlockManager& manager)
73 {
74 size = (size+15)&~15;
75 if(size>PxcNpMemBlock::SIZE)
76 return mBlockPool.acquireExceptionalConstraintMemory(size);
77
78 if(mBlock == NULL || size+mUsed>PxcNpMemBlock::SIZE)
79 {
80 mBlock = mBlockPool.acquireConstraintBlock(memBlocks&: manager.mTrackingArray);
81 PX_ASSERT(0==mBlock || mBlock->data == reinterpret_cast<PxU8*>(mBlock));
82 mUsed = size;
83 return reinterpret_cast<PxU8*>(mBlock);
84 }
85 PX_ASSERT(mBlock && mBlock->data == reinterpret_cast<PxU8*>(mBlock));
86 PxU8* PX_RESTRICT result = mBlock->data+mUsed;
87 mUsed += size;
88 return result;
89 }
90
91 PX_FORCE_INLINE void reset()
92 {
93 mBlock = NULL;
94 mUsed = 0;
95 }
96
97 PX_FORCE_INLINE PxcNpMemBlockPool& getMemBlockPool() { return mBlockPool; }
98
99private:
100 PxcNpMemBlockPool& mBlockPool;
101 PxcNpMemBlock* mBlock; // current constraint block
102 PxU32 mUsed; // number of bytes used in constraint block
103 //Tracking peak allocations
104 PxU32 mPeakUsed;
105};
106
107class PxcContactBlockStream
108{
109 PX_NOCOPY(PxcContactBlockStream)
110public:
111 PxcContactBlockStream(PxcNpMemBlockPool & blockPool):
112 mBlockPool(blockPool),
113 mBlock(NULL),
114 mUsed(0)
115 {
116 }
117
118 PX_FORCE_INLINE PxU8* reserve(PxU32 size)
119 {
120 size = (size+15)&~15;
121
122 if(size>PxcNpMemBlock::SIZE)
123 return mBlockPool.acquireExceptionalConstraintMemory(size);
124
125 PX_ASSERT(size <= PxcNpMemBlock::SIZE);
126
127 if(mBlock == NULL || size+mUsed>PxcNpMemBlock::SIZE)
128 {
129 mBlock = mBlockPool.acquireContactBlock();
130 PX_ASSERT(0==mBlock || mBlock->data == reinterpret_cast<PxU8*>(mBlock));
131 mUsed = size;
132 return reinterpret_cast<PxU8*>(mBlock);
133 }
134 PX_ASSERT(mBlock && mBlock->data == reinterpret_cast<PxU8*>(mBlock));
135 PxU8* PX_RESTRICT result = mBlock->data+mUsed;
136 mUsed += size;
137 return result;
138 }
139
140 PX_FORCE_INLINE void reset()
141 {
142 mBlock = NULL;
143 mUsed = 0;
144 }
145
146 PX_FORCE_INLINE PxcNpMemBlockPool& getMemBlockPool() { return mBlockPool; }
147
148private:
149 PxcNpMemBlockPool& mBlockPool;
150 PxcNpMemBlock* mBlock; // current constraint block
151 PxU32 mUsed; // number of bytes used in constraint block
152};
153
154}
155
156#endif
157

source code of qtquick3dphysics/src/3rdparty/PhysX/source/lowlevel/common/include/pipeline/PxcConstraintBlockStream.h