From 0b8f07f307198c6e71aaf20a616bd94a04295655 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 3 May 2024 23:07:41 +1000 Subject: [PATCH] Add right version of last commit --- .../dreamcast/DrawColouredQuads.S | 254 +++++++++-------- .../dreamcast/DrawTexturedQuads.S | 258 +++++++++--------- misc/dreamcast/Makefile | 10 +- src/Graphics_Dreamcast.c | 39 ++- third_party/gldc/src/draw.c | 21 -- 5 files changed, 291 insertions(+), 291 deletions(-) rename third_party/gldc/src/DrawColoured.S => misc/dreamcast/DrawColouredQuads.S (93%) rename third_party/gldc/src/DrawTextured.S => misc/dreamcast/DrawTexturedQuads.S (93%) diff --git a/third_party/gldc/src/DrawColoured.S b/misc/dreamcast/DrawColouredQuads.S similarity index 93% rename from third_party/gldc/src/DrawColoured.S rename to misc/dreamcast/DrawColouredQuads.S index 49718b6d8..fb298bd00 100644 --- a/third_party/gldc/src/DrawColoured.S +++ b/misc/dreamcast/DrawColouredQuads.S @@ -1,128 +1,126 @@ -!r0 = prefetch address -!r1 = GPU VERT command -!r2 = GPU EOS command -!r3 = colour -!r4 = src pointer ARG -!r5 = dst pointer ARG -!r6 = quads count ARG - -!fr4 = x -!fr5 = y -!fr6 = z -!fr7 = w -!fr9 = 0 -!fr10 = ? -!fr11 = ? - -!fv4 = XYZW - -.globl DrawColouredQuads -.align 4 -.type DrawColouredQuads,%function - -! See https://shared-ptr.com/sh_insns.html -! Although there is fmov.s @Rm+,FRn, there isn't fmov.s FRn,@Rm+ -! So have to use fmov.s FRn,@-Rm instead - -DrawColouredQuads: -.fnstart -! Setup - mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command - mov.l CMD_COL_EOS, r2 ! r2 = GPU EOS command - fldi0 fr9 ! fr9 = 0 - mov r4,r0 ! r0 = src - add #-32, r5 ! r5 -= sizeof(VERTEX) - nop ! align loop - -.TRANSFORM_QUAD: -! TRANSFORM VERTEX 1 - add #16, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr9,@-r5 ! dst->v = 0.0 - fmov.s fr9,@-r5 ! dst->u = 0.0 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 2 - add #16, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr9,@-r5 ! dst->v = 0.0 - fmov.s fr9,@-r5 ! dst->u = 0.0 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 3 - add #16, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr9,@-r5 ! dst->v = 0.0 - fmov.s fr9,@-r5 ! dst->u = 0.0 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 4 - add #16, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr9,@-r5 ! dst->v = 0.0 - fmov.s fr9,@-r5 ! dst->u = 0.0 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r2,@-r5 ! dst->flags = CMD_EOS - - dt r6 ! r6--; T = 1 if r6 == 0, else 0 - bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD - nop - - rts ! return - nop -.fnend - -.align 2 -CMD_COL_VERT: .long 0xe0000000 -CMD_COL_EOS: .long 0xf0000000 \ No newline at end of file +!r0 = prefetch address +!r1 = GPU VERT command +!r2 = GPU EOS command +!r3 = colour +!r4 = src pointer ARG +!r5 = dst pointer ARG +!r6 = quads count ARG + +!fr4 = x +!fr5 = y +!fr6 = z +!fr7 = w +!fr9 = 0 +!fr10 = ? +!fr11 = ? + +!fv4 = XYZW + +.globl _DrawColouredQuads +.align 4 +.type _DrawColouredQuads,%function + +! See https://shared-ptr.com/sh_insns.html +! Although there is fmov.s @Rm+,FRn, there isn't fmov.s FRn,@Rm+ +! So have to use fmov.s FRn,@-Rm instead + +_DrawColouredQuads: +! Setup + mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command + mov.l CMD_COL_EOS, r2 ! r2 = GPU EOS command + fldi0 fr9 ! fr9 = 0 + mov r4,r0 ! r0 = src + add #-32, r5 ! r5 -= sizeof(VERTEX) + nop ! align loop + +.TRANSFORM_QUAD: +! TRANSFORM VERTEX 1 + add #16, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr9,@-r5 ! dst->v = 0.0 + fmov.s fr9,@-r5 ! dst->u = 0.0 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 2 + add #16, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr9,@-r5 ! dst->v = 0.0 + fmov.s fr9,@-r5 ! dst->u = 0.0 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 3 + add #16, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr9,@-r5 ! dst->v = 0.0 + fmov.s fr9,@-r5 ! dst->u = 0.0 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 4 + add #16, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr9,@-r5 ! dst->v = 0.0 + fmov.s fr9,@-r5 ! dst->u = 0.0 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r2,@-r5 ! dst->flags = CMD_EOS + + dt r6 ! r6--; T = 1 if r6 == 0, else 0 + bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD + nop + + rts ! return + nop + +.align 2 +CMD_COL_VERT: .long 0xe0000000 +CMD_COL_EOS: .long 0xf0000000 diff --git a/third_party/gldc/src/DrawTextured.S b/misc/dreamcast/DrawTexturedQuads.S similarity index 93% rename from third_party/gldc/src/DrawTextured.S rename to misc/dreamcast/DrawTexturedQuads.S index 38866afd5..113553ef1 100644 --- a/third_party/gldc/src/DrawTextured.S +++ b/misc/dreamcast/DrawTexturedQuads.S @@ -1,130 +1,128 @@ -!r0 = prefetch address -!r1 = GPU VERT command -!r2 = GPU EOS command -!r3 = colour -!r4 = src pointer ARG -!r5 = dst pointer ARG -!r6 = quads count ARG - -!fr4 = x -!fr5 = y -!fr6 = z -!fr7 = w -!fr9 = ? -!fr10 = u -!fr11 = v - -!fv4 = XYZW - -.globl DrawTexturedQuads -.align 4 -.type DrawTexturedQuads,%function - -DrawTexturedQuads: -.fnstart -! Setup - mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command - mov.l CMD_TEX_EOS, r2 ! r2 = GPU EOS command - mov r4,r0 ! r0 = src - add #-32, r5 ! r5 -= sizeof(VERTEX) - -.TRANSFORM_QUAD: -! TRANSFORM VERTEX 1 - add #24, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov @r4+,fr10! fr10 = src->u - fmov @r4+,fr11! fr11 = src->v - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr11,@-r5 ! dst->v = fr11 - fmov.s fr10,@-r5 ! dst->u = fr10 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 2 - add #24, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov @r4+,fr10! fr10 = src->u - fmov @r4+,fr11! fr11 = src->v - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr11,@-r5 ! dst->v = fr11 - fmov.s fr10,@-r5 ! dst->u = fr10 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 3 - add #24, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov @r4+,fr10! fr10 = src->u - fmov @r4+,fr11! fr11 = src->v - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr11,@-r5 ! dst->v = fr11 - fmov.s fr10,@-r5 ! dst->u = fr10 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r1,@-r5 ! dst->flags = CMD_VERT - -! TRANSFORM VERTEX 4 - add #24, r0 ! r0 += VERTEX_STRIDE - add #64, r5 ! r5 += 2 * sizeof(VERTEX) - pref @r0 ! PREFETCH r0 (next vertex) - fmov @r4+, fr4 ! fr4 = src->x - fmov @r4+, fr5 ! fr5 = src->y - fmov @r4+, fr6 ! fr6 = src->z - fldi1 fr7 ! fr7 = 1.0 - ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) - - mov.l @r4+,r3 ! r3 = src->color - fmov @r4+,fr10! fr10 = src->u - fmov @r4+,fr11! fr11 = src->v - fmov.s fr7,@-r5 ! dst->w = fr7 - mov.l r3,@-r5 ! dst->bgra = r3 - fmov.s fr11,@-r5 ! dst->v = fr11 - fmov.s fr10,@-r5 ! dst->u = fr10 - fmov.s fr6,@-r5 ! dst->z = fr6 - fmov.s fr5,@-r5 ! dst->y = fr5 - fmov.s fr4,@-r5 ! dst->x = fr4 - mov.l r2,@-r5 ! dst->flags = CMD_EOS - - dt r6 ! r6--; T = 1 if r6 == 0, else 0 - bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD - nop - - rts ! return - nop -.fnend - -.align 2 -CMD_TEX_VERT: .long 0xe0000000 -CMD_TEX_EOS: .long 0xf0000000 \ No newline at end of file +!r0 = prefetch address +!r1 = GPU VERT command +!r2 = GPU EOS command +!r3 = colour +!r4 = src pointer ARG +!r5 = dst pointer ARG +!r6 = quads count ARG + +!fr4 = x +!fr5 = y +!fr6 = z +!fr7 = w +!fr9 = ? +!fr10 = u +!fr11 = v + +!fv4 = XYZW + +.globl _DrawTexturedQuads +.align 4 +.type _DrawTexturedQuads,%function + +_DrawTexturedQuads: +! Setup + mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command + mov.l CMD_TEX_EOS, r2 ! r2 = GPU EOS command + mov r4,r0 ! r0 = src + add #-32, r5 ! r5 -= sizeof(VERTEX) + +.TRANSFORM_QUAD: +! TRANSFORM VERTEX 1 + add #24, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov @r4+,fr10! fr10 = src->u + fmov @r4+,fr11! fr11 = src->v + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr11,@-r5 ! dst->v = fr11 + fmov.s fr10,@-r5 ! dst->u = fr10 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 2 + add #24, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov @r4+,fr10! fr10 = src->u + fmov @r4+,fr11! fr11 = src->v + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr11,@-r5 ! dst->v = fr11 + fmov.s fr10,@-r5 ! dst->u = fr10 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 3 + add #24, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov @r4+,fr10! fr10 = src->u + fmov @r4+,fr11! fr11 = src->v + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr11,@-r5 ! dst->v = fr11 + fmov.s fr10,@-r5 ! dst->u = fr10 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r1,@-r5 ! dst->flags = CMD_VERT + +! TRANSFORM VERTEX 4 + add #24, r0 ! r0 += VERTEX_STRIDE + add #64, r5 ! r5 += 2 * sizeof(VERTEX) + pref @r0 ! PREFETCH r0 (next vertex) + fmov @r4+, fr4 ! fr4 = src->x + fmov @r4+, fr5 ! fr5 = src->y + fmov @r4+, fr6 ! fr6 = src->z + fldi1 fr7 ! fr7 = 1.0 + ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7) + + mov.l @r4+,r3 ! r3 = src->color + fmov @r4+,fr10! fr10 = src->u + fmov @r4+,fr11! fr11 = src->v + fmov.s fr7,@-r5 ! dst->w = fr7 + mov.l r3,@-r5 ! dst->bgra = r3 + fmov.s fr11,@-r5 ! dst->v = fr11 + fmov.s fr10,@-r5 ! dst->u = fr10 + fmov.s fr6,@-r5 ! dst->z = fr6 + fmov.s fr5,@-r5 ! dst->y = fr5 + fmov.s fr4,@-r5 ! dst->x = fr4 + mov.l r2,@-r5 ! dst->flags = CMD_EOS + + dt r6 ! r6--; T = 1 if r6 == 0, else 0 + bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD + nop + + rts ! return + nop + +.align 2 +CMD_TEX_VERT: .long 0xe0000000 +CMD_TEX_EOS: .long 0xf0000000 diff --git a/misc/dreamcast/Makefile b/misc/dreamcast/Makefile index 54920960f..937129ebf 100644 --- a/misc/dreamcast/Makefile +++ b/misc/dreamcast/Makefile @@ -1,8 +1,9 @@ BUILD_DIR := build-dc -SOURCE_DIRS := src third_party/bearssl/src +SOURCE_DIRS := src third_party/bearssl/src misc/dreamcast +S_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S)) C_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c)) -OBJS := $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o))) +OBJS := $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o))) CFLAGS :=-g -O1 -pipe -fno-math-errno -Ithird_party/bearssl/inc GLDC_LIB=third_party/gldc/libGLdc.a @@ -31,6 +32,9 @@ $(CC_TEXTURES): $(BUILD_DIR)/%.o: src/%.c kos-cc $(CFLAGS) -c $< -o $@ +$(BUILD_DIR)/%.o: misc/dreamcast/%.S + kos-cc -c $< -o $@ + $(BUILD_DIR)/%.o: third_party/bearssl/src/%.c kos-cc $(CFLAGS) -c $< -o $@ @@ -58,4 +62,4 @@ $(TARGET).iso: $(TARGET)-scr.bin # genisoimage -V ClassiCube -G IP.BIN -joliet -rock -l -o $(TARGET).iso ISO_FILES $(TARGET).cdi: $(TARGET).iso - cdi4dc $(TARGET).iso $(TARGET).cdi \ No newline at end of file + cdi4dc $(TARGET).iso $(TARGET).cdi diff --git a/src/Graphics_Dreamcast.c b/src/Graphics_Dreamcast.c index 29f9e3145..baaa9f0d3 100644 --- a/src/Graphics_Dreamcast.c +++ b/src/Graphics_Dreamcast.c @@ -5,6 +5,7 @@ #include "Logger.h" #include "Window.h" #include "../third_party/gldc/gldc.h" +#include "../third_party/gldc/src/draw.c" #include #include #include @@ -465,6 +466,22 @@ cc_bool Gfx_WarnIfNecessary(void) { *----------------------------------------------------------Drawing--------------------------------------------------------* *#########################################################################################################################*/ #define VB_PTR gfx_vertices +static const void* VERTEX_PTR; + +extern void DrawColouredQuads(const void* src, Vertex* dst, int numQuads); +extern void DrawTexturedQuads(const void* src, Vertex* dst, int numQuads); + +void DrawQuads(int count) { + if (!count) return; + Vertex* start = submitVertices(count); + + if (TEXTURES_ENABLED) { + DrawTexturedQuads(VERTEX_PTR, start, count >> 2); + } else { + DrawColouredQuads(VERTEX_PTR, start, count >> 2); + } +} + static void SetupVertices(int startVertex) { if (gfx_format == VERTEX_FORMAT_TEXTURED) { @@ -489,29 +506,33 @@ void Gfx_SetVertexFormat(VertexFormat fmt) { } void Gfx_DrawVb_Lines(int verticesCount) { - SetupVertices(0); + //SetupVertices(0); //glDrawArrays(GL_LINES, 0, verticesCount); } void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { - SetupVertices(startVertex); - glDrawArrays(GL_QUADS, 0, verticesCount); + if (gfx_format == VERTEX_FORMAT_TEXTURED) { + VERTEX_PTR = gfx_vertices + startVertex * SIZEOF_VERTEX_TEXTURED; + } else { + VERTEX_PTR = gfx_vertices + startVertex * SIZEOF_VERTEX_COLOURED; + } + + DrawQuads(verticesCount); } void Gfx_DrawVb_IndexedTris(int verticesCount) { - SetupVertices(0); - + VERTEX_PTR = gfx_vertices; + if (textureOffset) ShiftTextureCoords(verticesCount); - glDrawArrays(GL_QUADS, 0, verticesCount); + DrawQuads(verticesCount); if (textureOffset) UnshiftTextureCoords(verticesCount); } void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { if (renderingDisabled) return; - cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED; - gldcVertexPointer(SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset)); - glDrawArrays(GL_QUADS, 0, verticesCount); + VERTEX_PTR = gfx_vertices + startVertex * SIZEOF_VERTEX_TEXTURED; + DrawQuads(verticesCount); } diff --git a/third_party/gldc/src/draw.c b/third_party/gldc/src/draw.c index 7b6ae73bc..da6efd8ae 100644 --- a/third_party/gldc/src/draw.c +++ b/third_party/gldc/src/draw.c @@ -2,8 +2,6 @@ #include "private.h" #include "platform.h" -static const GLubyte* VERTEX_PTR; - extern void apply_poly_header(PolyHeader* header, PolyList* activePolyList); GL_FORCE_INLINE Vertex* submitVertices(GLuint vertexCount) { @@ -28,22 +26,3 @@ GL_FORCE_INLINE Vertex* submitVertices(GLuint vertexCount) { } return aligned_vector_at(&output->vector, start_offset); } - -extern void DrawColouredQuads(Vertex* dst, const GLubyte* src, const GLuint numQuads); -extern void DrawTexturedQuads(Vertex* dst, const GLubyte* src, const GLuint numQuads); - -void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) { - TRACE(); - if (!count) return; - Vertex* start = submitVertices(count); - - if (TEXTURES_ENABLED) { - DrawTexturedQuads(start, VERTEX_PTR + (first * 24), count >> 2); - } else { - DrawColouredQuads(start, VERTEX_PTR + (first * 16), count >> 2); - } -} - -void APIENTRY gldcVertexPointer(GLsizei stride, const GLvoid * pointer) { - VERTEX_PTR = pointer; -} \ No newline at end of file