mirror of
https://github.com/yuzu-emu/FasTC.git
synced 2026-07-06 01:24:44 +00:00
90 lines
1.9 KiB
C++
90 lines
1.9 KiB
C++
#ifndef __TEXCOMP_WORKDER_QUEUE_H__
|
|
#define __TEXCOMP_WORKDER_QUEUE_H__
|
|
|
|
// Forward declare...
|
|
class WorkerQueue;
|
|
|
|
// Necessary includes...
|
|
#include "TexCompTypes.h"
|
|
#include "TexComp.h"
|
|
#include "Thread.h"
|
|
#include "StopWatch.h"
|
|
|
|
struct WorkerThread : public TCCallable {
|
|
friend class WorkerQueue;
|
|
public:
|
|
|
|
WorkerThread(WorkerQueue *, uint32 idx);
|
|
virtual ~WorkerThread() { }
|
|
virtual void operator ()();
|
|
|
|
enum EAction {
|
|
eAction_Wait,
|
|
eAction_DoWork,
|
|
eAction_Quit,
|
|
|
|
kNumWorkerThreadActions
|
|
};
|
|
|
|
private:
|
|
uint32 m_ThreadIdx;
|
|
WorkerQueue *const m_Parent;
|
|
};
|
|
|
|
class WorkerQueue {
|
|
friend class WorkerThread;
|
|
public:
|
|
WorkerQueue(
|
|
uint32 numCompressions,
|
|
uint32 numThreads,
|
|
uint32 jobSize,
|
|
const uint8 *inBuf,
|
|
uint32 inBufSz,
|
|
CompressionFunc func,
|
|
uint8 *outBuf
|
|
);
|
|
|
|
~WorkerQueue() { }
|
|
|
|
// Runs the workers
|
|
void Run();
|
|
const StopWatch &GetStopWatch() const { return m_StopWatch; }
|
|
|
|
private:
|
|
uint32 m_NumCompressions;
|
|
const uint32 m_TotalNumCompressions;
|
|
uint32 m_NumThreads;
|
|
uint32 m_WaitingThreads;
|
|
uint32 m_ActiveThreads;
|
|
uint32 m_JobSize;
|
|
uint32 m_InBufSz;
|
|
const uint8 *m_InBuf;
|
|
uint8 *m_OutBuf;
|
|
|
|
TCConditionVariable m_CV;
|
|
TCMutex m_Mutex;
|
|
|
|
uint32 m_NextBlock;
|
|
|
|
static const int kMaxNumWorkerThreads = 256;
|
|
uint32 m_Offsets[kMaxNumWorkerThreads];
|
|
uint32 m_NumBlocks[kMaxNumWorkerThreads];
|
|
|
|
WorkerThread *m_Workers[kMaxNumWorkerThreads];
|
|
TCThread *m_ThreadHandles[kMaxNumWorkerThreads];
|
|
|
|
const uint8 *GetSrcForThread(const int threadIdx) const;
|
|
uint8 *GetDstForThread(const int threadIdx) const;
|
|
uint32 GetNumBlocksForThread(const int threadIdx) const;
|
|
|
|
const CompressionFunc m_CompressionFunc;
|
|
CompressionFunc GetCompressionFunc() const { return m_CompressionFunc; }
|
|
|
|
StopWatch m_StopWatch;
|
|
|
|
WorkerThread::EAction AcceptThreadData(uint32 threadIdx);
|
|
void NotifyWorkerFinished();
|
|
};
|
|
|
|
#endif //__TEXCOMP_WORKDER_QUEUE_H__
|