Skip to content

Commit

Permalink
Added vertex batching
Browse files Browse the repository at this point in the history
  • Loading branch information
AngelTomkins committed Feb 29, 2024
1 parent 280d070 commit 88f1f32
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions src/nds/nds_renderer.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ static uint16_t fog_max;
static int no_texture;
static int frame_count;

static Vtx_t* vertex_batch[32 * 3];
static uint8_t num_verts_batched = 0;


struct Sprite sprites[MAX_SPRITES];

struct {
Expand Down Expand Up @@ -468,26 +472,20 @@ static void g_vtx(Gwords *words) {
}

static void g_tri1(Gwords *words) {
// Draw a triangle
const Vtx_t *v[] = {
&vertex_buffer[((words->w0 >> 16) & 0xFF) >> 1].v,
&vertex_buffer[((words->w0 >> 8) & 0xFF) >> 1].v,
&vertex_buffer[((words->w0 >> 0) & 0xFF) >> 1].v
};
draw_vertices(v, 3);
// Batch a triangle to render
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 16) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 8) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 0) & 0xFF) >> 1].v;
}

static void g_tri2(Gwords *words) {
// Draw two triangles at once
const Vtx_t *v[] = {
&vertex_buffer[((words->w0 >> 16) & 0xFF) >> 1].v,
&vertex_buffer[((words->w0 >> 8) & 0xFF) >> 1].v,
&vertex_buffer[((words->w0 >> 0) & 0xFF) >> 1].v,
&vertex_buffer[((words->w1 >> 16) & 0xFF) >> 1].v,
&vertex_buffer[((words->w1 >> 8) & 0xFF) >> 1].v,
&vertex_buffer[((words->w1 >> 0) & 0xFF) >> 1].v
};
draw_vertices(v, 6);
// Batch triangles to render
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 16) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 8) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w0 >> 0) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w1 >> 16) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w1 >> 8) & 0xFF) >> 1].v;
vertex_batch[num_verts_batched++] = &vertex_buffer[((words->w1 >> 0) & 0xFF) >> 1].v;
}

static void g_texture(Gwords *words) {
Expand Down Expand Up @@ -939,6 +937,12 @@ static void execute(Gfx* cmd) {
while (true) {
const uint8_t opcode = cmd->words.w0 >> 24;

// Draw the batched verticies
if ((opcode != G_TRI1 && opcode != G_TRI2 && num_verts_batched > 0) || num_verts_batched >= 90) {
draw_vertices(vertex_batch, num_verts_batched);
num_verts_batched = 0;
}

switch (opcode) {
case G_VTX: g_vtx(&cmd->words); break;
case G_TRI1: g_tri1(&cmd->words); break;
Expand Down

0 comments on commit 88f1f32

Please sign in to comment.