diff --git a/BPTCEncoder/src/ParallelStage.cpp b/BPTCEncoder/src/ParallelStage.cpp index 345a56a..a3ef7b9 100644 --- a/BPTCEncoder/src/ParallelStage.cpp +++ b/BPTCEncoder/src/ParallelStage.cpp @@ -64,13 +64,22 @@ // This is the total number of blocks in this particular stage. uint32 m_NumBlocks; */ -ParallelStage::ParallelStage(BC7ParallelStage stage, const unsigned char *inbuf, unsigned char *outbuf, uint32 numBlocks) +ParallelStage::ParallelStage( + BC7ParallelStage stage, + const unsigned char *inbuf, + unsigned char *outbuf, + uint32 numBlocks, + uint32 outBlockSz, + uint32 inBlockSz +) : m_Stage(stage) , m_InBuf(inbuf) , m_OutBuf(outbuf) , m_Blocks(new uint32[numBlocks]) , m_TotalNumBlocks(numBlocks) , m_NumBlocks(0) + , m_OutBlockSz(outBlockSz) + , m_InBlockSz(inBlockSz) { assert(numBlocks > 0); } @@ -82,6 +91,8 @@ ParallelStage::ParallelStage(const ParallelStage &other) , m_Blocks(new uint32[other.m_NumBlocks]) , m_TotalNumBlocks(other.m_TotalNumBlocks) , m_NumBlocks(other.m_NumBlocks) + , m_OutBlockSz(other.m_OutBlockSz) + , m_InBlockSz(other.m_InBlockSz) { memcpy(m_Blocks, other.m_Blocks, m_NumBlocks * sizeof(m_Blocks[0])); } @@ -92,14 +103,51 @@ ParallelStage &ParallelStage::operator=(const ParallelStage &other) { assert(m_OutBuf == other.m_OutBuf); assert(m_TotalNumBlocks == other.m_TotalNumBlocks); assert(m_NumBlocks == other.m_NumBlocks); + assert(m_OutBlockSz == other.m_OutBlockSz); + assert(m_InBlockSz == other.m_InBlockSz); memcpy(m_Blocks, other.m_Blocks, m_NumBlocks * sizeof(m_Blocks[0])); return *this; } - -void ParallelStage::AddBlock(int blockNum) { +void ParallelStage::AddBlock(uint32 blockNum) { assert(m_NumBlocks < m_TotalNumBlocks); m_Blocks[m_NumBlocks++] = blockNum; -} \ No newline at end of file +} + +uint32 ParallelStage::LoadBlocks(uint32 blockOffset, uint32 numBlocks, unsigned char *dst) { + + if(!dst) + return 0; + + if(blockOffset + numBlocks > m_NumBlocks) + return 0; + + int lastBlock = blockOffset + numBlocks; + for(int i = blockOffset; i < lastBlock; i++) + { + uint32 block = m_Blocks[i]; + uint32 bOffset = block * m_InBlockSz; + memcpy(dst + ((i - blockOffset) * m_InBlockSz), m_InBuf + bOffset, m_InBlockSz); + } + + return 0; +} + +bool ParallelStage::WriteBlocks(uint32 blockOffset, uint32 numBlocks, const unsigned char *src) { + if(!src) + return false; + + if(blockOffset + numBlocks > m_NumBlocks) + return false; + + int lastBlock = blockOffset + numBlocks; + for(int i = blockOffset; i < lastBlock; i++) { + uint32 block = m_Blocks[i]; + uint32 bOffset = block * m_OutBlockSz; + memcpy(m_OutBuf + bOffset, src + ((i-blockOffset) * m_OutBlockSz), m_OutBlockSz); + } + + return true; +} diff --git a/BPTCEncoder/src/ParallelStage.h b/BPTCEncoder/src/ParallelStage.h index 44e049e..54c7393 100644 --- a/BPTCEncoder/src/ParallelStage.h +++ b/BPTCEncoder/src/ParallelStage.h @@ -53,28 +53,47 @@ enum BC7ParallelStage { class ParallelStage { public: - ParallelStage(BC7ParallelStage stage, const unsigned char *inbuf, unsigned char *outbuf, uint32 numBlocks); + ParallelStage( + BC7ParallelStage stage, + const unsigned char *inbuf, + unsigned char *outbuf, + uint32 numBlocks, + uint32 outBlockSz = 16, + uint32 inBlockSz = 64 + ); ParallelStage(const ParallelStage &); ParallelStage &operator=(const ParallelStage &); - + const BC7ParallelStage m_Stage; - - void AddBlock(int blockNum); - + + // Adds the block number to the list of blocks for this parallel stage + void AddBlock(uint32 blockNum); + + // Loads the desired number of blocks into the destination buffer. Returns + // the number of blocks loaded. + uint32 LoadBlocks(uint32 blockOffset, uint32 numBlocks, unsigned char *dst); + + // Writes the block data from src into numBlocks blocks starting from + // the block given by blockOffset. + bool WriteBlocks(uint32 blockOffset, uint32 numBlocks, const unsigned char *src); + private: - + // This is the stream of data that will be used to read the block data. const unsigned char *const m_InBuf; - + // This is the destination buffer to which the block data will be written to. unsigned char *const m_OutBuf; - + // This is the array of block offsets that belong to this stage. uint32 *m_Blocks; - + // This is the total number of blocks in the given image. const uint32 m_TotalNumBlocks; - + // This is the total number of blocks in this particular stage. uint32 m_NumBlocks; + + const uint32 m_OutBlockSz; + const uint32 m_InBlockSz; }; \ No newline at end of file