7 #ifndef PXR_USD_SDF_POOL_H
8 #define PXR_USD_SDF_POOL_H
19 #include <tbb/concurrent_queue.h>
33 static thread_local
T *theTPtr =
nullptr;
37 static thread_local
T theT;
61 unsigned ElemsPerSpan=16384>
64 static_assert(ElemSize >=
sizeof(uint32_t),
65 "ElemSize must be at least sizeof(uint32_t)");
75 static constexpr uint32_t
RegionMask = ((1 << RegionBits)-1);
81 constexpr
Handle() noexcept =
default;
84 :
value((index << RegionBits) | region) {}
87 inline char *
GetPtr() const noexcept {
94 return Sdf_Pool::_GetHandle(
ptr);
96 explicit operator bool()
const {
118 char *p = head.GetPtr();
125 char *p = h.GetPtr();
139 size_t size()
const {
return endIndex - beginIndex; }
141 return Handle(region, beginIndex++);
143 inline bool empty()
const {
144 return beginIndex == endIndex;
151 struct _PerThreadData {
162 struct _RegionState {
163 static constexpr uint32_t LockedState = ~0;
165 _RegionState() =
default;
166 constexpr _RegionState(
unsigned region, uint32_t
index)
167 : _state((index << RegionBits) | region) {}
171 inline _RegionState Reserve(
unsigned num)
const;
173 static constexpr _RegionState GetInitState() {
174 return _RegionState(0, 0);
177 static constexpr _RegionState GetLockedState() {
178 return _RegionState(LockedState, LockedState);
181 constexpr
bool operator==(_RegionState other)
const {
182 return _state == other._state;
186 return _state >> RegionBits;
189 unsigned GetRegion()
const {
193 bool IsLocked()
const {
194 return _state == LockedState;
208 static inline char *_GetPtr(
unsigned region, uint32_t
index) {
214 return _regionStarts[region] + (index * ElemSize);
220 static inline Handle _GetHandle(
char const *
ptr) {
222 for (
unsigned region = 1; region != NumRegions+1; ++region) {
236 region, static_cast<uint32_t>(diff / ElemSize));
244 static bool _TakeSharedFreeList(_FreeList &out) {
245 return _sharedFreeLists->try_pop(out);
249 static void _ShareFreeList(_FreeList &
in) {
250 _sharedFreeLists->push(in);
255 static inline void _ReserveSpan(_PoolSpan &out);
257 static constexpr
int NumRegions = 1 << RegionBits;
260 SDF_API static _ThreadData _threadData;
261 SDF_API static char *_regionStarts[NumRegions+1];
262 SDF_API static std::atomic<_RegionState> _regionState;
268 #endif // PXR_USD_SDF_POOL_H
void swap(UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &a, UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &b)
GLsizei const GLfloat * value
constexpr Handle(std::nullptr_t) noexcept
static constexpr uint32_t RegionMask
constexpr auto in(type t, int set) -> bool
bool operator==(const BaseDimensions< T > &a, const BaseDimensions< Y > &b)
bool operator!=(Handle const &r) const noexcept
#define ARCH_PRAGMA_UNDEFINED_VAR_TEMPLATE
GLfloat GLfloat GLfloat GLfloat h
void swap(Handle &r) noexcept
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define ARCH_PRAGMA_MAYBE_UNINITIALIZED
char * GetPtr() const noexcept
bool operator==(Handle const &r) const noexcept
#define PXR_NAMESPACE_CLOSE_SCOPE
static Handle GetHandle(char const *ptr) noexcept
bool operator<(Handle const &r) const noexcept
constexpr Handle() noexcept=default
Handle & operator=(std::nullptr_t)
Handle & operator=(Handle const &)=default
static constexpr uint64_t ElemsPerRegion
static void Free(Handle h)
GLenum GLenum GLsizei void GLsizei void void * span
static constexpr uint32_t MaxIndex
Handle(unsigned region, uint32_t index)