diff --git a/include/PSX/File/Processor/cd_file_processor.hpp b/include/PSX/File/Processor/cd_file_processor.hpp index 552541b4..42b408c5 100644 --- a/include/PSX/File/Processor/cd_file_processor.hpp +++ b/include/PSX/File/Processor/cd_file_processor.hpp @@ -12,6 +12,18 @@ extern "C" uint32_t __heap_base; namespace JabyEngine { class CDFileProcessor { public: + struct BufferConfiguration { + static constexpr size_t SmallSectorCount = 5; + static constexpr size_t MediumSectorCount = 16; + + uint32_t* adr = nullptr; + size_t sector_count = 0; + + static constexpr BufferConfiguration new_default() { + return {&__heap_base, BufferConfiguration::MediumSectorCount}; + } + }; + struct JobArray { const CDFile* files = nullptr; size_t size = 0; @@ -29,27 +41,25 @@ namespace JabyEngine { CircularBuffer circular_buffer; LZ4Decompressor lz4_decomp; JobArray jobs; - const AutoLBAEntry* lba = nullptr; - uint32_t* tmp_area = nullptr; - void start_cur_job(); + void start_cur_job(const AutoLBAEntry* lba, const BufferConfiguration& buf_cfg); bool process_data(); public: CDFileProcessor() = default; - void setup(const volatile AutoLBAEntry* lba, JobArray jobs, uint32_t* tmp_area = &__heap_base); - + void setup(const volatile AutoLBAEntry* lba, JobArray jobs, const BufferConfiguration& buf_cfg); + template - void setup(const volatile AutoLBAEntry* lba, const CDFile (&file_array)[N], uint32_t* tmp_area = &__heap_base) { - CDFileProcessor::setup(lba, JobArray{file_array, N}, tmp_area); + void setup(const volatile AutoLBAEntry* lba, const CDFile (&file_array)[N], const BufferConfiguration& buf_cfg) { + CDFileProcessor::setup(lba, JobArray{file_array, N}, buf_cfg); } Progress process(); - bool next() { + bool next(const volatile AutoLBAEntry* lba, const BufferConfiguration& buf_cfg) { if(this->jobs.next()) { - CDFileProcessor::start_cur_job(); + CDFileProcessor::start_cur_job(const_cast(lba), buf_cfg); return true; } @@ -58,8 +68,4 @@ namespace JabyEngine { }; } -// This will be used as the file processor but will work on cd types -// Will probably use file_processor -// Will also setup the circular buffer for the CD code - #endif //!__JABYENGINE_CD_FILE_PROCESSOR_HPP__ \ No newline at end of file diff --git a/src/Library/src/File/Processor/cd_file_processor.cpp b/src/Library/src/File/Processor/cd_file_processor.cpp index 5d62d3f7..3ff5c844 100644 --- a/src/Library/src/File/Processor/cd_file_processor.cpp +++ b/src/Library/src/File/Processor/cd_file_processor.cpp @@ -3,13 +3,12 @@ #include namespace JabyEngine { - static constexpr auto NormalCircularBufferSize = 5; static constexpr auto DisabledCircularBufferSize = 512; - void CDFileProcessor :: start_cur_job() { + void CDFileProcessor :: start_cur_job(const AutoLBAEntry* lba, const BufferConfiguration& buf_cfg) { using CD::internal::SectorBufferAllocator; - const auto configurate_for = [this](const CDFile& file, bool is_lz4) -> FileProcessor::State { - const uint32_t* data_adr = [this](const CDFile& file, bool is_lz4) -> const uint32_t* { + const auto configurate_for = [this](const CDFile& file, const BufferConfiguration& buf_cfg, bool is_lz4) -> FileProcessor::State { + const uint32_t* data_adr = [this](const CDFile& file, const BufferConfiguration& buf_cfg, bool is_lz4) -> const uint32_t* { const auto disable_lz4 = [this](uint32_t* work_area, size_t size, uint32_t* overwrite_dst = nullptr) -> uint32_t* { uint8_t*const dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); @@ -29,13 +28,13 @@ namespace JabyEngine { }; if(file.type == CDFileType::CopyTo) { - return is_lz4 ? enable_lz4(this->tmp_area, NormalCircularBufferSize, file.payload.overlay.dst) : disable_lz4(file.payload.copy_to.dst, DisabledCircularBufferSize); + return is_lz4 ? enable_lz4(buf_cfg.adr, buf_cfg.sector_count, file.payload.overlay.dst) : disable_lz4(file.payload.copy_to.dst, DisabledCircularBufferSize); } else { - return is_lz4 ? enable_lz4(this->tmp_area, NormalCircularBufferSize) : disable_lz4(this->tmp_area, DisabledCircularBufferSize); + return is_lz4 ? enable_lz4(buf_cfg.adr, buf_cfg.sector_count) : disable_lz4(buf_cfg.adr, DisabledCircularBufferSize); } - }(file, is_lz4); + }(file, buf_cfg, is_lz4); switch(file.type) { case CDFileType::SimpleTIM: @@ -48,9 +47,9 @@ namespace JabyEngine { }; const auto& cur_job = *this->jobs.files; - const auto& cur_lba = this->lba[cur_job.rel_lba_idx]; + const auto& cur_lba = lba[cur_job.rel_lba_idx]; - this->file_state = configurate_for(cur_job, cur_lba.is_lz4()); + this->file_state = configurate_for(cur_job, buf_cfg, cur_lba.is_lz4()); CD::internal::read_file(cur_lba, SectorBufferAllocator::create(this, [](void* ctx) -> CD_IO::DataSector* { CDFileProcessor &self = *reinterpret_cast(ctx); @@ -82,12 +81,9 @@ namespace JabyEngine { return true; } - void CDFileProcessor :: setup(const volatile AutoLBAEntry* lba, JobArray jobs, uint32_t* tmp_area) { - this->lba = const_cast(lba); - this->jobs = jobs; - - this->tmp_area = tmp_area; - CDFileProcessor::start_cur_job(); + void CDFileProcessor :: setup(const volatile AutoLBAEntry* lba, JobArray jobs, const BufferConfiguration& buf_cfg) { + this->jobs = jobs; + CDFileProcessor::start_cur_job(const_cast(lba), buf_cfg); } Progress CDFileProcessor :: process() { @@ -100,7 +96,7 @@ namespace JabyEngine { We are done now! The user decides if he wants the next value */ - //while(this->file_state.process(0) != Progress::Done); + //while(this->file_state.process(0) != Progress::Done); return Progress::Done; case CD::internal::State::BufferFull: