From e5e622072a5c6edda7ca7cf8093db41a65b98857 Mon Sep 17 00:00:00 2001 From: jaby Date: Sun, 2 Oct 2022 11:49:55 +0200 Subject: [PATCH] Improvements to parse Texture data --- include/PSX/File/Processor/File_Processor.hpp | 12 +++++---- .../src/File/Processor/SimpleHelper.hpp | 27 +++++++++++++++++++ src/Library/src/File/Processor/SimpleRead.hpp | 18 ------------- .../src/File/Processor/TIM_Processor.cpp | 27 ++++++++++++------- 4 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 src/Library/src/File/Processor/SimpleHelper.hpp delete mode 100644 src/Library/src/File/Processor/SimpleRead.hpp diff --git a/include/PSX/File/Processor/File_Processor.hpp b/include/PSX/File/Processor/File_Processor.hpp index b0eb8108..2bab9f28 100644 --- a/include/PSX/File/Processor/File_Processor.hpp +++ b/include/PSX/File/Processor/File_Processor.hpp @@ -10,16 +10,17 @@ namespace FileProcessor { }; struct Configuration; - typedef bool (*ProcessRoutine)(Configuration&, Reserved&, size_t); + typedef bool (*ProcessRoutine)(Configuration&, Reserved&); struct Configuration { ProcessRoutine process_routine = nullptr; const uint32_t* data_adr = nullptr; + size_t data_size = 0ull; template - static __always_inline Configuration from(bool (*process_routine)(Configuration&, T&, size_t), const uint32_t* data_adr) { + static __always_inline Configuration from(bool (*process_routine)(Configuration&, T&), const uint32_t* data_adr) { return {reinterpret_cast(process_routine), data_adr}; - } + } }; private: @@ -27,14 +28,15 @@ namespace FileProcessor { Reserved reserved; template - static __always_inline State from(const T& reserved, const uint32_t* data_adr, bool (*process_routine)(Configuration&, T&, size_t)) { + static __always_inline State from(const T& reserved, const uint32_t* data_adr, bool (*process_routine)(Configuration&, T&)) { return {Configuration::from(process_routine, data_adr), *reinterpret_cast(&reserved)}; static_assert(sizeof(T) <= sizeof(Reserved)); } public: bool process(size_t size) { - return (*this->config.process_routine)(this->config, this->reserved, size); + this->config.data_size += size; + return (*this->config.process_routine)(this->config, this->reserved); } }; diff --git a/src/Library/src/File/Processor/SimpleHelper.hpp b/src/Library/src/File/Processor/SimpleHelper.hpp new file mode 100644 index 00000000..081af333 --- /dev/null +++ b/src/Library/src/File/Processor/SimpleHelper.hpp @@ -0,0 +1,27 @@ +#ifndef __JABYENGINE_INTERNAL_SIMPLE_HELPER_HPP__ +#define __JABYENGINE_INTERNAL_SIMPLE_HELPER_HPP__ +#define private public +#include + +namespace FileProcessor { + namespace Helper { + template + static void simple_read(T& dst, State::Configuration& config) { + static constexpr size_t UINT32_SIZE = (sizeof(T)/sizeof(uint32_t)); + + dst = *reinterpret_cast(config.data_adr); + config.data_adr += UINT32_SIZE; + config.data_size -= UINT32_SIZE; + + static_assert((UINT32_SIZE*sizeof(uint32_t)) == sizeof(T)); + } + + template + static bool exchange_and_execute_process_function(bool (*process_routine)(State::Configuration&, T&), State::Configuration& config, T& state) { + config.process_routine = reinterpret_cast(process_routine); + return process_routine(config, state); + } + } +} + +#endif // !__JABYENGINE_INTERNAL_SIMPLE_HELPER_HPP__ \ No newline at end of file diff --git a/src/Library/src/File/Processor/SimpleRead.hpp b/src/Library/src/File/Processor/SimpleRead.hpp deleted file mode 100644 index 5ecd8c24..00000000 --- a/src/Library/src/File/Processor/SimpleRead.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __JABYENGINE_INTERNAL_SIMPLE_READ_HPP__ -#define __JABYENGINE_INTERNAL_SIMPLE_READ_HPP__ -#include - -namespace FileProcessor { - template - static size_t simple_read(T& dst, State::Configuration& config) { - static constexpr size_t UINT32_SIZE = (sizeof(T)/sizeof(uint32_t)); - - dst = *reinterpret_cast(config.data_adr); - config.data_adr += UINT32_SIZE; - - return UINT32_SIZE; - static_assert((UINT32_SIZE*sizeof(uint32_t)) == sizeof(T)); - } -} - -#endif // !__JABYENGINE_INTERNAL_SIMPLE_READ_HPP__ \ No newline at end of file diff --git a/src/Library/src/File/Processor/TIM_Processor.cpp b/src/Library/src/File/Processor/TIM_Processor.cpp index fa61ac6b..1c9b1cee 100644 --- a/src/Library/src/File/Processor/TIM_Processor.cpp +++ b/src/Library/src/File/Processor/TIM_Processor.cpp @@ -1,6 +1,5 @@ -#define private public #include "../../../include/GPU/GPU.h" -#include "SimpleRead.hpp" +#include "SimpleHelper.hpp" #include namespace FileProcessor { @@ -35,7 +34,6 @@ namespace FileProcessor { constexpr SimpleTIMState(const SimpleTIM& dst_info) : dst_info(dst_info) { } }; - static_assert(sizeof(SimpleTIMState) <= sizeof(State::Reserved)); static void set_gpu_receive(const uint32_t* src, uint16_t x, uint16_t y, uint16_t w, uint16_t h) { GPU::DMA::Receive::prepare(); @@ -43,24 +41,33 @@ namespace FileProcessor { GPU::DMA::Receive::set_src(reinterpret_cast(src)); } - static bool parse_header(State::Configuration& config, SimpleTIMState& state, size_t size) { - if(size >= sizeof(SimpleTIMSize)) { - size -= simple_read(state.size_info, config); + static void set_gpu_receive_data(const uint32_t* src, const SimpleTIMState& state) { + set_gpu_receive(src, state.dst_info.getTextureX(), state.dst_info.getTextureY(), state.size_info.getTextureWidth(), state.size_info.getTextureWidth()); + } + + static bool parse_data(State::Configuration& config, SimpleTIMState& state) { + return false; + } + + static bool parse_header(State::Configuration& config, SimpleTIMState& state) { + if(config.data_size >= sizeof(SimpleTIMSize)) { + Helper::simple_read(state.size_info, config); //Check if we have a clut to care about if(state.size_info.getClutWidth() > 0) { //CLUTs are 16bit full color anyway - printf("We found a CLUT!\n"); + printf("We found a CLUT which is not yet implemented!\n"); + return false; } //We have direct data else { - printf("We found direct data!\n"); + set_gpu_receive_data(config.data_adr, state); + return Helper::exchange_and_execute_process_function(parse_data, config, state); } } - return false; - static_assert(sizeof(SimpleTIMSize) == sizeof(uint32_t)); + return true; } State create(const uint32_t* data_adr, const SimpleTIM& file) {