From 6004faf3ea1073303f2c89648b3fe4941294060c Mon Sep 17 00:00:00 2001 From: Jaby Date: Sun, 2 Oct 2022 11:01:42 +0200 Subject: [PATCH] Include SplashImage and detect right type --- include/PSX/File/File_Types.hpp | 4 ++ include/PSX/File/Processor/File_Processor.hpp | 8 ++- src/Library/src/BootLoader/gpu_boot.cpp | 6 +- src/Library/src/File/Processor/SimpleRead.hpp | 18 +++++ .../src/File/Processor/TIM_Processor.cpp | 70 +++++++++++++++---- 5 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 src/Library/src/File/Processor/SimpleRead.hpp diff --git a/include/PSX/File/File_Types.hpp b/include/PSX/File/File_Types.hpp index 8452c396..358e6ac9 100644 --- a/include/PSX/File/File_Types.hpp +++ b/include/PSX/File/File_Types.hpp @@ -9,6 +9,10 @@ struct __no_align SimpleTIM : private ComplexBitMap { static constexpr auto ClutX = BitRange(17, 22); static constexpr auto ClutY = BitRange(23, 31); + constexpr SimpleTIM() { + this->raw = 0; + } + constexpr SimpleTIM(uint16_t texX, uint16_t texY, uint16_t clutX, uint16_t clutY) : ComplexBitMap(ComplexBitMap::with(TextureX.with(texX), TextureY.with(texY), ClutX.with(clutX), ClutY.with(clutY))) { } diff --git a/include/PSX/File/Processor/File_Processor.hpp b/include/PSX/File/Processor/File_Processor.hpp index 783afb02..b0eb8108 100644 --- a/include/PSX/File/Processor/File_Processor.hpp +++ b/include/PSX/File/Processor/File_Processor.hpp @@ -6,7 +6,7 @@ namespace FileProcessor { class State { private: struct Reserved { - uint32_t reserved[2]; + uint32_t reserved[4]; }; struct Configuration; @@ -26,6 +26,12 @@ namespace FileProcessor { Configuration config; Reserved reserved; + template + static __always_inline State from(const T& reserved, const uint32_t* data_adr, bool (*process_routine)(Configuration&, T&, size_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); diff --git a/src/Library/src/BootLoader/gpu_boot.cpp b/src/Library/src/BootLoader/gpu_boot.cpp index b3cc7743..272065fe 100644 --- a/src/Library/src/BootLoader/gpu_boot.cpp +++ b/src/Library/src/BootLoader/gpu_boot.cpp @@ -2,6 +2,8 @@ #include #include +#include "splash_image_boot.hpp" + namespace GPU { static const Color TestSequence[] = { Color::from(Color24::Blue()), Color::from(Color24::Red()), Color::from(Color24::Green()), Color::from(Color24::Blue()), Color::from(Color24::Red()), Color::from(Color24::Green()), Color::from(Color24::Blue()), Color::from(Color24::Red()), Color::from(Color24::Green()), Color::from(Color24::Blue()), Color::from(Color24::Red()), Color::from(Color24::Green()), @@ -36,8 +38,8 @@ namespace GPU { Display::enable(); //For now - auto state = FileProcessor::create(nullptr, SimpleTIM(0, 0, 0, 0)); - while(state.process(0ull)); + auto state = FileProcessor::create(reinterpret_cast(SplashScreen), SimpleTIM(0, 0, 0, 0)); + while(state.process((sizeof(SplashScreen)/sizeof(uint32_t)))); } void setup() { diff --git a/src/Library/src/File/Processor/SimpleRead.hpp b/src/Library/src/File/Processor/SimpleRead.hpp new file mode 100644 index 00000000..5ecd8c24 --- /dev/null +++ b/src/Library/src/File/Processor/SimpleRead.hpp @@ -0,0 +1,18 @@ +#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 256fb086..fa61ac6b 100644 --- a/src/Library/src/File/Processor/TIM_Processor.cpp +++ b/src/Library/src/File/Processor/TIM_Processor.cpp @@ -1,28 +1,70 @@ #define private public -#include +#include "../../../include/GPU/GPU.h" +#include "SimpleRead.hpp" #include namespace FileProcessor { - union SimpleTIMState { - State::Reserved _reserved; - struct { - uint32_t test; - }; + using GPU::PositionU16; + using GPU::SizeU16; - constexpr SimpleTIMState(uint32_t test = 0) : test(test) { + struct SimpleTIMSize : private SimpleTIM { + constexpr SimpleTIMSize() { + } + + constexpr uint16_t getTextureWidth() const { + return SimpleTIM::getTextureX(); + } + + constexpr uint16_t getTextureHeight() const { + return SimpleTIM::getTextureY(); + } + + constexpr uint16_t getClutWidth() const { + return SimpleTIM::getClutX(); + } + + constexpr uint16_t getClutHeight() const { + return SimpleTIM::getClutY(); + } + }; + + struct SimpleTIMState { + SimpleTIM dst_info; + SimpleTIMSize size_info; + + constexpr SimpleTIMState(const SimpleTIM& dst_info) : dst_info(dst_info) { } }; static_assert(sizeof(SimpleTIMState) <= sizeof(State::Reserved)); - static bool process(State::Configuration& config, SimpleTIMState& state, size_t size) { - printf("Dino: %i\n", state.test); - return false; + 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(); + GPU::DMA::Receive::set_dst(PositionU16(x, y), SizeU16(w, h)); + GPU::DMA::Receive::set_src(reinterpret_cast(src)); } - State create(const uint32_t* data_adr, const SimpleTIM& file) { - SimpleTIMState test(123); - - return State{.config = State::Configuration::from(process, data_adr), .reserved = test._reserved}; + static bool parse_header(State::Configuration& config, SimpleTIMState& state, size_t size) { + if(size >= sizeof(SimpleTIMSize)) { + size -= 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"); + } + + //We have direct data + else { + printf("We found direct data!\n"); + } + } + + return false; + static_assert(sizeof(SimpleTIMSize) == sizeof(uint32_t)); + } + + State create(const uint32_t* data_adr, const SimpleTIM& file) { + return State::from(SimpleTIMState(file), data_adr, parse_header); } }