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
32#ifndef PXC_NP_MEM_BLOCK_POOL_H
33#define PXC_NP_MEM_BLOCK_POOL_H
34
35#include "PxvConfig.h"
36#include "PsArray.h"
37#include "PxcScratchAllocator.h"
38
39namespace physx
40{
41struct PxcNpMemBlock
42{
43 enum
44 {
45 SIZE = 16384
46 };
47 PxU8 data[SIZE];
48};
49
50typedef Ps::Array<PxcNpMemBlock*> PxcNpMemBlockArray;
51
52class PxcNpMemBlockPool
53{
54 PX_NOCOPY(PxcNpMemBlockPool)
55public:
56 PxcNpMemBlockPool(PxcScratchAllocator& allocator);
57 ~PxcNpMemBlockPool();
58
59 void init(PxU32 initial16KDataBlocks, PxU32 maxBlocks);
60 void flush();
61 void setBlockCount(PxU32 count);
62 PxU32 getUsedBlockCount() const;
63 PxU32 getMaxUsedBlockCount() const;
64 PxU32 getPeakConstraintBlockCount() const;
65 void releaseUnusedBlocks();
66
67 PxcNpMemBlock* acquireConstraintBlock();
68 PxcNpMemBlock* acquireConstraintBlock(PxcNpMemBlockArray& memBlocks);
69 PxcNpMemBlock* acquireContactBlock();
70 PxcNpMemBlock* acquireFrictionBlock();
71 PxcNpMemBlock* acquireNpCacheBlock();
72
73 PxU8* acquireExceptionalConstraintMemory(PxU32 size);
74
75 void acquireConstraintMemory();
76 void releaseConstraintMemory();
77 void releaseConstraintBlocks(PxcNpMemBlockArray& memBlocks);
78 void releaseContacts();
79 void swapFrictionStreams();
80 void swapNpCacheStreams();
81
82 void flushUnused();
83
84private:
85
86
87 Ps::Mutex mLock;
88 PxcNpMemBlockArray mConstraints;
89 PxcNpMemBlockArray mContacts[2];
90 PxcNpMemBlockArray mFriction[2];
91 PxcNpMemBlockArray mNpCache[2];
92 PxcNpMemBlockArray mScratchBlocks;
93 Ps::Array<PxU8*> mExceptionalConstraints;
94
95 PxcNpMemBlockArray mUnused;
96
97 PxU32 mNpCacheActiveStream;
98 PxU32 mFrictionActiveStream;
99 PxU32 mCCDCacheActiveStream;
100 PxU32 mContactIndex;
101 PxU32 mAllocatedBlocks;
102 PxU32 mMaxBlocks;
103 PxU32 mInitialBlocks;
104 PxU32 mUsedBlocks;
105 PxU32 mMaxUsedBlocks;
106 PxcNpMemBlock* mScratchBlockAddr;
107 PxU32 mNbScratchBlocks;
108 PxcScratchAllocator& mScratchAllocator;
109
110 PxU32 mPeakConstraintAllocations;
111 PxU32 mConstraintAllocations;
112
113 PxcNpMemBlock* acquire(PxcNpMemBlockArray& trackingArray, PxU32* allocationCount = NULL, PxU32* peakAllocationCount = NULL, bool isScratchAllocation = false);
114 void release(PxcNpMemBlockArray& deadArray, PxU32* allocationCount = NULL);
115};
116
117}
118
119#endif
120

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