150 lines
4.1 KiB
C
150 lines
4.1 KiB
C
|
#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
|
||
|
//------------------------------------------------------------------------------
|
||
|
|