28struct GPUTrackingInOutPointers;
29class GPUReconstruction;
65 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
68 static_assert((alignment & (alignment - 1)) == 0,
"Invalid alignment, not power of 2");
72 return addr & (alignment - 1);
74 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
77 size_t mod = getAlignmentMod<alignment>(addr);
81 return (alignment - mod);
83 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
86 return size + getAlignment<alignment>(
size);
88 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
91 return (
reinterpret_cast<void*
>(nextMultipleOf<alignment>(
reinterpret_cast<size_t>(
ptr))));
93 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
96 return (getAlignmentMod<alignment>(
reinterpret_cast<size_t>(addr)));
98 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
101 return (getAlignment<alignment>(
reinterpret_cast<size_t>(addr)));
103 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class S>
109 constexpr const size_t maxAlign = (
alignof(
S) > alignment) ?
alignof(
S) : alignment;
110 basePtr += getAlignment<maxAlign>(basePtr);
112 basePtr += nEntries *
sizeof(
S);
116 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class S>
119 size_t tmp = (size_t)basePtr;
120 auto retVal = getPointerWithAlignment<alignment, S>(tmp, nEntries);
121 basePtr = (
void*)tmp;
125 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class T,
class S>
128 size_t tmp = (size_t)basePtr;
129 objPtr = getPointerWithAlignment<alignment, S>(tmp, nEntries);
133 template <
class T,
class S>
139 size_t tmp = (size_t)basePtr;
140 objPtr =
reinterpret_cast<S*
>(getPointerWithAlignment<1, char>(tmp, nEntries *
sizeof(
S)));
154 bool mAllocateAndInitializeLate;
#define GPUCA_BUFFER_ALIGNMENT
GPUProcessor & operator=(const GPUProcessor &)=delete
uint32_t uint32_t uint32_t param3
GPUconstantref() const GPUConstantMem *mConstantMem
GPUd() GPUconstantref() const GPUConstantMem *GetConstantMem() const
static size_t getAlignmentMod(size_t addr)
static S * getPointerWithAlignment(size_t &basePtr, size_t nEntries=1)
static size_t getAlignmentMod(void *addr)
GPUProcessor(const GPUProcessor &)=delete
static void computePointerWithAlignment(T *&basePtr, S *&objPtr, size_t nEntries=1)
static size_t getAlignment(size_t addr)
void InitGPUProcessor(GPUReconstruction *rec, ProcessorType type=PROCESSOR_TYPE_CPU, GPUProcessor *slaveProcessor=nullptr)
static S * getPointerWithAlignment(void *&basePtr, size_t nEntries=1)
static void * alignPointer(void *ptr)
ProcessorType mGPUProcessorType
static size_t getAlignment(void *addr)
void AllocateAndInitializeLate()
static size_t nextMultipleOf(size_t size)
GPUProcessor * mLinkedProcessor
const GPUReconstruction & GetRec() const
static void computePointerWithoutAlignment(T *&basePtr, S *&objPtr, size_t nEntries=1)
GLint GLint GLsizei GLint GLenum GLenum type