Files
2026-06-09 23:38:22 -06:00

94 lines
2.3 KiB
C++

#pragma once
#include "../internal.hpp"
#include <cstring>
namespace aurora::gx::fifo {
namespace detail {
extern uint8_t* sBufferData;
extern uint32_t sBufferSize;
extern uint32_t sBufferCapacity;
extern bool sInDisplayList;
extern uint8_t* sDlBuffer;
extern uint32_t sDlSize;
extern uint32_t sDlWritePos;
} // namespace detail
void init();
// Out-of-line slow path: grows internal buffer then appends data
void write_data_grow(const void* data, uint32_t length);
inline void write_data(const void* data, const uint32_t length) {
if (!detail::sInDisplayList)
LIKELY {
if (detail::sBufferSize + length <= detail::sBufferCapacity)
LIKELY {
std::memcpy(detail::sBufferData + detail::sBufferSize, data, length);
detail::sBufferSize += length;
return;
}
write_data_grow(data, length);
}
else if (detail::sDlWritePos + length <= detail::sDlSize) {
std::memcpy(detail::sDlBuffer + detail::sDlWritePos, data, length);
detail::sDlWritePos += length;
}
}
inline void write_u8(const uint8_t val) {
if (!detail::sInDisplayList)
LIKELY {
if (detail::sBufferSize < detail::sBufferCapacity)
LIKELY {
detail::sBufferData[detail::sBufferSize++] = val;
return;
}
write_data_grow(&val, 1);
}
else if (detail::sDlWritePos < detail::sDlSize) {
detail::sDlBuffer[detail::sDlWritePos++] = val;
}
}
inline void write_u16(const uint16_t val) {
const auto out = bswap(val);
write_data(&out, sizeof(out));
}
inline void write_u32(const uint32_t val) {
const auto out = bswap(val);
write_data(&out, sizeof(out));
}
inline void write_u64(const uint64_t val) {
const auto out = bswap(val);
write_data(&out, sizeof(out));
}
inline void write_f32(const float val) {
const auto out = bswap(val);
write_data(&out, sizeof(out));
}
// Overwrites a u32 previously written to the FIFO buffer at the given offset.
// Not valid during display list recording.
void patch_u32(uint32_t offset, uint32_t val);
// Display list recording
void begin_display_list(uint8_t* buf, uint32_t size);
uint32_t end_display_list();
bool in_display_list();
// Drain the internal FIFO buffer through the command processor
void drain();
// Internal buffer inspection
const uint8_t* get_buffer_data();
uint32_t get_buffer_size();
void clear_buffer();
} // namespace aurora::gx::fifo