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);
90 if (alignment & (alignment - 1)) {
91 size_t tmp =
size % alignment;
93 size += alignment - tmp;
97 return (
size + alignment - 1) & ~(alignment - 1);
100 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
103 return (
reinterpret_cast<void*
>(nextMultipleOf<alignment>(
reinterpret_cast<size_t>(
ptr))));
105 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
108 return (getAlignmentMod<alignment>(
reinterpret_cast<size_t>(addr)));
110 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT>
113 return (getAlignment<alignment>(
reinterpret_cast<size_t>(addr)));
115 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class S>
121 constexpr const size_t maxAlign = (
alignof(
S) > alignment) ?
alignof(
S) : alignment;
122 basePtr += getAlignment<maxAlign>(basePtr);
124 basePtr += nEntries *
sizeof(
S);
128 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class S>
131 size_t tmp = (size_t)basePtr;
132 auto retVal = getPointerWithAlignment<alignment, S>(tmp, nEntries);
133 basePtr = (
void*)tmp;
137 template <
size_t alignment = GPUCA_BUFFER_ALIGNMENT,
class T,
class S>
140 size_t tmp = (size_t)basePtr;
141 objPtr = getPointerWithAlignment<alignment, S>(tmp, nEntries);
145 template <
class T,
class S>
151 size_t tmp = (size_t)basePtr;
152 objPtr =
reinterpret_cast<S*
>(getPointerWithAlignment<1, char>(tmp, nEntries *
sizeof(
S)));
166 bool mAllocateAndInitializeLate;
#define GPUCA_BUFFER_ALIGNMENT
static constexpr size_t nextMultipleOf(size_t size, size_t alignment)
GPUProcessor & operator=(const GPUProcessor &)=delete
uint32_t uint32_t uint32_t param3
GPUconstantref() const GPUConstantMem *mConstantMem
GPUd() GPUconstantref() const GPUConstantMem *GetConstantMem() const
static S * getPointerWithAlignment(size_t &basePtr, size_t nEntries=1)
static size_t getAlignmentMod(void *addr)
GPUProcessor(const GPUProcessor &)=delete
static constexpr size_t getAlignmentMod(size_t addr)
static void computePointerWithAlignment(T *&basePtr, S *&objPtr, size_t nEntries=1)
void InitGPUProcessor(GPUReconstruction *rec, ProcessorType type=PROCESSOR_TYPE_CPU, GPUProcessor *slaveProcessor=nullptr)
static constexpr size_t nextMultipleOf(size_t size)
static S * getPointerWithAlignment(void *&basePtr, size_t nEntries=1)
static void * alignPointer(void *ptr)
ProcessorType mGPUProcessorType
static size_t getAlignment(void *addr)
static constexpr size_t getAlignment(size_t addr)
void AllocateAndInitializeLate()
GPUProcessor * mLinkedProcessor
const GPUReconstruction & GetRec() const
static void computePointerWithoutAlignment(T *&basePtr, S *&objPtr, size_t nEntries=1)
GLint GLint GLsizei GLint GLenum GLenum type