mirror of
https://github.com/encounter/aurora.git
synced 2026-07-09 18:19:33 -07:00
94 lines
2.3 KiB
C++
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
|