genesis-3d_engine/Engine/foundation/jobs/base/jobbase.h

150 lines
4.1 KiB
C
Raw Normal View History

#pragma once
//------------------------------------------------------------------------------
/**
@class Base::JobBase
Job objects are asynchronous data crunchers.
A Job is setup from the following components:
- an input data buffer
- an output data buffer
- an uniform data buffer
- the job function
The job function will perform parallel processing of input data into
the output buffer. The input data will be split into independent slices
and slices will be processed in parallel. The uniform data is identical
for every slice and can be used to pass additional arguments to the
job function.
(C) 2009 Radon Labs GmbH
*/
#include "core/refcounted.h"
#include "jobs/jobuniformdesc.h"
#include "jobs/jobdatadesc.h"
#include "jobs/jobfuncdesc.h"
//------------------------------------------------------------------------------
namespace Base
{
class JobBase : public Core::RefCounted
{
__DeclareClass(JobBase);
public:
/// max size of a data slice is 16 kByte - 1 byte
static const SizeT MaxSliceSize = JobMaxSliceSize;
/// constructor
JobBase();
/// destructor
virtual ~JobBase();
/// allocate a single memory buffer associated with the job, may only be called once, and before Setup()!
void* AllocPrivateBuffer(Memory::HeapType heapType, SizeT size);
/// get pointer to job's optional private buffer
void* GetPrivateBuffer() const;
/// get size of job's optional private buffer
SizeT GetPrivateBufferSize() const;
/// setup the job
void Setup(const Jobs::JobUniformDesc& uniformDesc, const Jobs::JobDataDesc& inputDesc, const Jobs::JobDataDesc& outputDesc, const Jobs::JobFuncDesc& funcDesc);
/// discard the job
void Discard();
/// return true if job has been setup
bool IsValid() const;
/// patch input pointers after job has been setup
void PatchInputDesc(const Jobs::JobDataDesc& inputDesc);
/// patch output pointers after job has been setup
void PatchOutputDesc(const Jobs::JobDataDesc& outputDesc);
/// patch uniform pointer after job has been setup
void PatchUniformDesc(const Jobs::JobUniformDesc& uniformDesc);
/// get uniform data descriptor
const Jobs::JobUniformDesc& GetUniformDesc() const;
/// get input data descriptor
const Jobs::JobDataDesc& GetInputDesc() const;
/// get output data descriptor
const Jobs::JobDataDesc& GetOutputDesc() const;
/// get function descriptor
const Jobs::JobFuncDesc& GetFuncDesc() const;
protected:
Jobs::JobUniformDesc uniformDesc;
Jobs::JobDataDesc inputDesc;
Jobs::JobDataDesc outputDesc;
Jobs::JobFuncDesc funcDesc;
Memory::HeapType privateBufferHeapType;
SizeT privateBufferSize;
void* privateBuffer;
bool isValid;
};
//------------------------------------------------------------------------------
/**
*/
inline bool
JobBase::IsValid() const
{
return this->isValid;
}
//------------------------------------------------------------------------------
/**
*/
inline const Jobs::JobUniformDesc&
JobBase::GetUniformDesc() const
{
return this->uniformDesc;
}
//------------------------------------------------------------------------------
/**
*/
inline const Jobs::JobDataDesc&
JobBase::GetInputDesc() const
{
return this->inputDesc;
}
//------------------------------------------------------------------------------
/**
*/
inline const Jobs::JobDataDesc&
JobBase::GetOutputDesc() const
{
return this->outputDesc;
}
//------------------------------------------------------------------------------
/**
*/
inline const Jobs::JobFuncDesc&
JobBase::GetFuncDesc() const
{
return this->funcDesc;
}
//------------------------------------------------------------------------------
/**
*/
inline void*
JobBase::GetPrivateBuffer() const
{
return this->privateBuffer;
}
//------------------------------------------------------------------------------
/**
*/
inline SizeT
JobBase::GetPrivateBufferSize() const
{
return this->privateBufferSize;
}
} // namespace Jobs
//------------------------------------------------------------------------------