rts/src/gfx/ps1/src/sort.c

76 lines
1.3 KiB
C

#include <gfx.h>
#include <gfx_private.h>
#include <ps1/gfx_private.h>
#include <system/port.h>
#include <psxgpu.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
static union gfx_sznext *first, *last;
static void add_to_list(union gfx_sznext *const p)
{
if (!first)
first = p;
else if (last)
last->f.next = (uint32_t)p;
last = p;
}
void sprite_sort(struct sprite *const s)
{
add_to_list(&s->sznext);
}
void quad_sort(struct quad *const q)
{
add_to_list(&q->sznext);
}
void rect_sort(struct rect *const r)
{
add_to_list(&r->sznext);
}
void stp_4line_sort(struct stp_4line *const l)
{
add_to_list(&l->sznext);
}
static void gfx_sync(void)
{
/* Wait for the GPU to finish drawing primitives. */
while (!(GPU_CONTROL_PORT & (1 << 0x1a)))
;
/* Wait for the GPU to be free. */
while (!(GPU_CONTROL_PORT & (1 << 0x1c)))
;
while (!vblank_set)
;
vblank_set = false;
}
int gfx_draw(void)
{
static union gfx_sznext term = {.cmd_next = 0xffffff};
add_to_list(&term);
void gpu_ctrl(unsigned int command, unsigned int param);
gfx_sync();
gfx_swapbuffers();
gfx_swapheap();
gpu_ctrl(4, 2);
D2_MADR = (uint32_t)first;
D2_BCR = 0;
D2_CHCR = (1 << 0xa) | 1 | (1 << 0x18);
first = NULL;
return 0;
}