Refactor FIFOs
This commit is contained in:
parent
69a5ed3396
commit
ac29b4391e
@ -9,12 +9,12 @@
|
|||||||
|
|
||||||
static inline unsigned fifo_size(GB_fifo_t *fifo)
|
static inline unsigned fifo_size(GB_fifo_t *fifo)
|
||||||
{
|
{
|
||||||
return (fifo->write_end - fifo->read_end) & (GB_FIFO_LENGTH - 1);
|
return fifo->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fifo_clear(GB_fifo_t *fifo)
|
static void fifo_clear(GB_fifo_t *fifo)
|
||||||
{
|
{
|
||||||
fifo->read_end = fifo->write_end = 0;
|
fifo->read_end = fifo->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GB_fifo_item_t *fifo_pop(GB_fifo_t *fifo)
|
static GB_fifo_item_t *fifo_pop(GB_fifo_t *fifo)
|
||||||
@ -22,14 +22,17 @@ static GB_fifo_item_t *fifo_pop(GB_fifo_t *fifo)
|
|||||||
GB_fifo_item_t *ret = &fifo->fifo[fifo->read_end];
|
GB_fifo_item_t *ret = &fifo->fifo[fifo->read_end];
|
||||||
fifo->read_end++;
|
fifo->read_end++;
|
||||||
fifo->read_end &= (GB_FIFO_LENGTH - 1);
|
fifo->read_end &= (GB_FIFO_LENGTH - 1);
|
||||||
|
fifo->size--;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fifo_push_bg_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint8_t palette, bool bg_priority, bool flip_x)
|
static void fifo_push_bg_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint8_t palette, bool bg_priority, bool flip_x)
|
||||||
{
|
{
|
||||||
|
assert(fifo->size == 0);
|
||||||
|
fifo->size = 8;
|
||||||
if (!flip_x) {
|
if (!flip_x) {
|
||||||
unrolled for (unsigned i = 8; i--;) {
|
unrolled for (unsigned i = 0; i < 8; i++) {
|
||||||
fifo->fifo[fifo->write_end] = (GB_fifo_item_t) {
|
fifo->fifo[i] = (GB_fifo_item_t) {
|
||||||
(lower >> 7) | ((upper >> 7) << 1),
|
(lower >> 7) | ((upper >> 7) << 1),
|
||||||
palette,
|
palette,
|
||||||
0,
|
0,
|
||||||
@ -37,14 +40,11 @@ static void fifo_push_bg_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint
|
|||||||
};
|
};
|
||||||
lower <<= 1;
|
lower <<= 1;
|
||||||
upper <<= 1;
|
upper <<= 1;
|
||||||
|
|
||||||
fifo->write_end++;
|
|
||||||
fifo->write_end &= (GB_FIFO_LENGTH - 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unrolled for (unsigned i = 8; i--;) {
|
unrolled for (unsigned i = 0; i < 8; i++) {
|
||||||
fifo->fifo[fifo->write_end] = (GB_fifo_item_t) {
|
fifo->fifo[i] = (GB_fifo_item_t) {
|
||||||
(lower & 1) | ((upper & 1) << 1),
|
(lower & 1) | ((upper & 1) << 1),
|
||||||
palette,
|
palette,
|
||||||
0,
|
0,
|
||||||
@ -52,19 +52,15 @@ static void fifo_push_bg_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint
|
|||||||
};
|
};
|
||||||
lower >>= 1;
|
lower >>= 1;
|
||||||
upper >>= 1;
|
upper >>= 1;
|
||||||
|
|
||||||
fifo->write_end++;
|
|
||||||
fifo->write_end &= (GB_FIFO_LENGTH - 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fifo_overlay_object_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint8_t palette, bool bg_priority, uint8_t priority, bool flip_x)
|
static void fifo_overlay_object_row(GB_fifo_t *fifo, uint8_t lower, uint8_t upper, uint8_t palette, bool bg_priority, uint8_t priority, bool flip_x)
|
||||||
{
|
{
|
||||||
while (fifo_size(fifo) < 8) {
|
while (fifo->size < GB_FIFO_LENGTH) {
|
||||||
fifo->fifo[fifo->write_end] = (GB_fifo_item_t) {0,};
|
fifo->fifo[(fifo->read_end + fifo->size) & (GB_FIFO_LENGTH - 1)] = (GB_fifo_item_t) {0,};
|
||||||
fifo->write_end++;
|
fifo->size++;
|
||||||
fifo->write_end &= (GB_FIFO_LENGTH - 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t flip_xor = flip_x? 0: 0x7;
|
uint8_t flip_xor = flip_x? 0: 0x7;
|
||||||
@ -557,22 +553,17 @@ static void render_pixel_if_possible(GB_gameboy_t *gb)
|
|||||||
bool draw_oam = false;
|
bool draw_oam = false;
|
||||||
bool bg_enabled = true, bg_priority = false;
|
bool bg_enabled = true, bg_priority = false;
|
||||||
|
|
||||||
if (fifo_size(&gb->bg_fifo)) {
|
fifo_item = fifo_pop(&gb->bg_fifo);
|
||||||
fifo_item = fifo_pop(&gb->bg_fifo);
|
bg_priority = fifo_item->bg_priority;
|
||||||
bg_priority = fifo_item->bg_priority;
|
|
||||||
|
|
||||||
if (fifo_size(&gb->oam_fifo)) {
|
if (fifo_size(&gb->oam_fifo)) {
|
||||||
oam_fifo_item = fifo_pop(&gb->oam_fifo);
|
oam_fifo_item = fifo_pop(&gb->oam_fifo);
|
||||||
if (oam_fifo_item->pixel && (gb->io_registers[GB_IO_LCDC] & 2) && unlikely(!gb->objects_disabled)) {
|
if (oam_fifo_item->pixel && (gb->io_registers[GB_IO_LCDC] & 2) && unlikely(!gb->objects_disabled)) {
|
||||||
draw_oam = true;
|
draw_oam = true;
|
||||||
bg_priority |= oam_fifo_item->bg_priority;
|
bg_priority |= oam_fifo_item->bg_priority;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!fifo_item) return;
|
|
||||||
|
|
||||||
/* Drop pixels for scrollings */
|
/* Drop pixels for scrollings */
|
||||||
if (gb->position_in_line >= 160 || (gb->disable_rendering && !gb->sgb)) {
|
if (gb->position_in_line >= 160 || (gb->disable_rendering && !gb->sgb)) {
|
||||||
gb->position_in_line++;
|
gb->position_in_line++;
|
||||||
|
@ -311,11 +311,11 @@ typedef struct {
|
|||||||
bool bg_priority; // For object FIFO – the BG priority bit. For the BG FIFO – the CGB attributes priority bit
|
bool bg_priority; // For object FIFO – the BG priority bit. For the BG FIFO – the CGB attributes priority bit
|
||||||
} GB_fifo_item_t;
|
} GB_fifo_item_t;
|
||||||
|
|
||||||
#define GB_FIFO_LENGTH 16
|
#define GB_FIFO_LENGTH 8
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GB_fifo_item_t fifo[GB_FIFO_LENGTH];
|
GB_fifo_item_t fifo[GB_FIFO_LENGTH];
|
||||||
uint8_t read_end;
|
uint8_t read_end;
|
||||||
uint8_t write_end;
|
uint8_t size;
|
||||||
} GB_fifo_t;
|
} GB_fifo_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -342,10 +342,8 @@ static void sanitize_state(GB_gameboy_t *gb)
|
|||||||
GB_palette_changed(gb, true, i * 2);
|
GB_palette_changed(gb, true, i * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
gb->bg_fifo.read_end &= 0xF;
|
gb->bg_fifo.read_end &= GB_FIFO_LENGTH - 1;
|
||||||
gb->bg_fifo.write_end &= 0xF;
|
gb->oam_fifo.read_end &= GB_FIFO_LENGTH - 1;
|
||||||
gb->oam_fifo.read_end &= 0xF;
|
|
||||||
gb->oam_fifo.write_end &= 0xF;
|
|
||||||
gb->last_tile_index_address &= 0x1FFF;
|
gb->last_tile_index_address &= 0x1FFF;
|
||||||
gb->window_tile_x &= 0x1F;
|
gb->window_tile_x &= 0x1F;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user