genesis-3d_engine/Engine/foundation/jobs/jobdatadesc.h

227 lines
6.4 KiB
C
Raw Normal View History

#pragma once
//------------------------------------------------------------------------------
/**
@class Jobs::JobDataDesc
Descriptor for input/output data of a job. Input/output data is
split into elements and slices. A job function may be called
with any number of elements, up to the MaxElementsPerSlice number.
Within a current slice, the job may perform random access on
elements. Slices may not depend on each other (the job system
may split a job into slices which are processed in parallel).
(C) 2009 Radon Labs GmbH
*/
//------------------------------------------------------------------------------
namespace Jobs
{
class JobDataDesc
{
public:
static const SizeT MaxNumBuffers = 4;
/// default constructor
JobDataDesc();
/// constructor with 1 data buffer
JobDataDesc(void* ptr, SizeT bufSize, SizeT sliceSize);
/// constructor with 2 data buffers
JobDataDesc(void* ptr0, SizeT bufSize0, SizeT sliceSize0, void* ptr1, SizeT bufSize1, SizeT sliceSize1);
/// constructor with 3 data buffers
JobDataDesc(void* ptr0, SizeT bufSize0, SizeT sliceSize0, void* ptr1, SizeT bufSize1, SizeT sliceSize1, void* ptr2, SizeT bufSize2, SizeT sliceSize2);
/// constructor with 4 data buffers
JobDataDesc(void* ptr0, SizeT bufSize0, SizeT sliceSize0, void* ptr1, SizeT bufSize1, SizeT sliceSize1, void* ptr2, SizeT bufSize2, SizeT sliceSize2, void* ptr3, SizeT bufSize3, SizeT sliceSize3);
/// update a parameter set
void Update(IndexT index, void* ptr, SizeT bufSize, SizeT sliceSize);
/// get number of buffers
SizeT GetNumBuffers() const;
/// get buffer pointer
void* GetPointer(IndexT i) const;
/// get buffer size
SizeT GetBufferSize(IndexT i) const;
/// get slice size
SizeT GetSliceSize(IndexT i) const;
private:
SizeT numBuffers;
void* ptr[MaxNumBuffers];
SizeT bufferSize[MaxNumBuffers];
SizeT sliceSize[MaxNumBuffers];
};
//------------------------------------------------------------------------------
/**
*/
inline
JobDataDesc::JobDataDesc() :
numBuffers(0)
{
IndexT i;
for (i = 0; i < MaxNumBuffers; i++)
{
this->ptr[i] = 0;
this->bufferSize[i] = 0;
this->sliceSize[i] = 0;
}
}
//------------------------------------------------------------------------------
/**
*/
inline
JobDataDesc::JobDataDesc(void* ptr_, SizeT bufSize_, SizeT sliceSize_) :
numBuffers(1)
{
this->ptr[0] = ptr_;
this->bufferSize[0] = bufSize_;
n_assert(sliceSize_ <= JobMaxSliceSize);
this->sliceSize[0] = sliceSize_;
IndexT i;
for (i = 1; i < MaxNumBuffers; i++)
{
this->ptr[i] = 0;
this->bufferSize[i] = 0;
this->sliceSize[i] = 0;
}
}
//------------------------------------------------------------------------------
/**
*/
inline
JobDataDesc::JobDataDesc(void* ptr0_, SizeT bufSize0_, SizeT sliceSize0_, void* ptr1_, SizeT bufSize1_, SizeT sliceSize1_) :
numBuffers(2)
{
this->ptr[0] = ptr0_;
this->bufferSize[0] = bufSize0_;
n_assert(sliceSize0_ <= JobMaxSliceSize);
this->sliceSize[0] = sliceSize0_;
this->ptr[1] = ptr1_;
this->bufferSize[1] = bufSize1_;
n_assert(sliceSize1_ <= JobMaxSliceSize);
this->sliceSize[1] = sliceSize1_;
IndexT i;
for (i = 2; i < MaxNumBuffers; i++)
{
this->ptr[i] = 0;
this->bufferSize[i] = 0;
this->sliceSize[i] = 0;
}
}
//------------------------------------------------------------------------------
/**
*/
inline
JobDataDesc::JobDataDesc(void* ptr0_, SizeT bufSize0_, SizeT sliceSize0_, void* ptr1_, SizeT bufSize1_, SizeT sliceSize1_, void* ptr2_, SizeT bufSize2_, SizeT sliceSize2_) :
numBuffers(3)
{
this->ptr[0] = ptr0_;
this->bufferSize[0] = bufSize0_;
n_assert(sliceSize0_ <= JobMaxSliceSize);
this->sliceSize[0] = sliceSize0_;
this->ptr[1] = ptr1_;
this->bufferSize[1] = bufSize1_;
n_assert(sliceSize1_ <= JobMaxSliceSize);
this->sliceSize[1] = sliceSize1_;
this->ptr[2] = ptr2_;
this->bufferSize[2] = bufSize2_;
n_assert(sliceSize2_ <= JobMaxSliceSize);
this->sliceSize[2] = sliceSize2_;
this->ptr[3] = 0;
this->bufferSize[3] = 0;
this->sliceSize[3] = 0;
}
//------------------------------------------------------------------------------
/**
*/
inline
JobDataDesc::JobDataDesc(void* ptr0_, SizeT bufSize0_, SizeT sliceSize0_, void* ptr1_, SizeT bufSize1_, SizeT sliceSize1_, void* ptr2_, SizeT bufSize2_, SizeT sliceSize2_, void* ptr3_, SizeT bufSize3_, SizeT sliceSize3_) :
numBuffers(4)
{
this->ptr[0] = ptr0_;
this->bufferSize[0] = bufSize0_;
n_assert(sliceSize0_ <= JobMaxSliceSize);
this->sliceSize[0] = sliceSize0_;
this->ptr[1] = ptr1_;
this->bufferSize[1] = bufSize1_;
n_assert(sliceSize1_ <= JobMaxSliceSize);
this->sliceSize[1] = sliceSize1_;
this->ptr[2] = ptr2_;
this->bufferSize[2] = bufSize2_;
n_assert(sliceSize2_ <= JobMaxSliceSize);
this->sliceSize[2] = sliceSize2_;
this->ptr[3] = ptr3_;
this->bufferSize[3] = bufSize3_;
n_assert(sliceSize3_ <= JobMaxSliceSize);
this->sliceSize[3] = sliceSize3_;
}
//------------------------------------------------------------------------------
/**
*/
inline void
JobDataDesc::Update(IndexT index, void* ptr_, SizeT bufSize_, SizeT sliceSize_)
{
n_assert(index < this->numBuffers);
this->ptr[index] = ptr_;
this->bufferSize[index] = bufSize_;
n_assert(sliceSize_ <= JobMaxSliceSize);
this->sliceSize[index] = sliceSize_;
}
//------------------------------------------------------------------------------
/**
*/
inline SizeT
JobDataDesc::GetNumBuffers() const
{
return this->numBuffers;
}
//------------------------------------------------------------------------------
/**
*/
inline void*
JobDataDesc::GetPointer(IndexT i) const
{
n_assert(i < MaxNumBuffers);
return this->ptr[i];
}
//------------------------------------------------------------------------------
/**
*/
inline SizeT
JobDataDesc::GetBufferSize(IndexT i) const
{
n_assert(i < MaxNumBuffers);
return this->bufferSize[i];
}
//------------------------------------------------------------------------------
/**
*/
inline SizeT
JobDataDesc::GetSliceSize(IndexT i) const
{
n_assert(i < MaxNumBuffers);
n_assert(this->sliceSize[i] <= JobMaxSliceSize);
return this->sliceSize[i];
}
} // namespace Jobs
//------------------------------------------------------------------------------