mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-10 07:49:57 -04:00
Dreamcast: Move clipflag calculation into vertex transform code
This commit is contained in:
parent
1151eb473d
commit
8621415f50
2
.gitignore
vendored
2
.gitignore
vendored
@ -97,6 +97,8 @@ CMakeCache.txt
|
|||||||
|
|
||||||
#GCC object files
|
#GCC object files
|
||||||
*.o
|
*.o
|
||||||
|
# Build dependency files
|
||||||
|
*.d
|
||||||
|
|
||||||
# Roslyn cache directories
|
# Roslyn cache directories
|
||||||
*.ide/
|
*.ide/
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
!r0 = prefetch address
|
!r0 = clip flags
|
||||||
!r1 = GPU VERT command
|
!r1 = GPU command
|
||||||
!r2 = GPU EOS command
|
!r2 = temp
|
||||||
!r3 = colour
|
!r3 = prefetch address
|
||||||
!r4 = src pointer ARG
|
!r4 = src pointer ARG
|
||||||
!r5 = dst pointer ARG
|
!r5 = dst pointer ARG
|
||||||
!r6 = quads count ARG
|
!r6 = quads count ARG
|
||||||
@ -10,117 +10,124 @@
|
|||||||
!fr5 = y
|
!fr5 = y
|
||||||
!fr6 = z
|
!fr6 = z
|
||||||
!fr7 = w
|
!fr7 = w
|
||||||
!fr9 = 0
|
!fr9 = u (0.0)
|
||||||
!fr10 = ?
|
!fr10 = v (0.0)
|
||||||
!fr11 = ?
|
!fr11 = saved fr0 (for viewport transform)
|
||||||
|
|
||||||
!fv4 = XYZW
|
!fv4 = XYZW
|
||||||
|
|
||||||
.globl _DrawColouredQuads
|
#include "ViewportTransform.S"
|
||||||
|
.global _DrawColouredQuads
|
||||||
.align 4
|
.align 4
|
||||||
.type _DrawColouredQuads,%function
|
.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:
|
_DrawColouredQuads:
|
||||||
! Setup
|
! Setup
|
||||||
mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command
|
fldi0 fr9 ! U = 0
|
||||||
mov.l CMD_COL_EOS, r2 ! r2 = GPU EOS command
|
fldi0 fr10 ! V = 0
|
||||||
fldi0 fr9 ! fr9 = 0
|
mov r4,r3 ! r3 = src
|
||||||
mov r4,r0 ! r0 = src
|
add #-32, r5 ! r5 -= sizeof(VERTEX)
|
||||||
add #-32, r5 ! r5 -= sizeof(VERTEX)
|
fmov fr0,fr11 ! fr11 = saved fr0
|
||||||
nop ! align loop
|
nop ! loop align
|
||||||
|
|
||||||
.TRANSFORM_QUAD:
|
.TRANSFORM_QUAD:
|
||||||
|
mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command
|
||||||
|
|
||||||
! TRANSFORM VERTEX 1
|
! TRANSFORM VERTEX 1
|
||||||
add #16, r0 ! r0 += VERTEX_STRIDE
|
add #16, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! fr4 = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! fr5 = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! fr6 = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! fr7 = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
||||||
|
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex1
|
||||||
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
|
! TRANSFORM VERTEX 2
|
||||||
add #16, r0 ! r0 += VERTEX_STRIDE
|
add #16, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! fr4 = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! fr5 = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! fr6 = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! fr7 = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
||||||
|
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex2
|
||||||
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
|
! TRANSFORM VERTEX 3
|
||||||
add #16, r0 ! r0 += VERTEX_STRIDE
|
add #16, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! fr4 = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! fr5 = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! fr6 = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! fr7 = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
||||||
|
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex3
|
||||||
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
|
! TRANSFORM VERTEX 4
|
||||||
add #16, r0 ! r0 += VERTEX_STRIDE
|
add #16, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! fr4 = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! fr5 = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! fr6 = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! fr7 = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
||||||
|
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex4 CMD_COL_EOS
|
||||||
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
|
! CLIPFLAGS TESTING
|
||||||
bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD
|
cmp/eq #0,r0 ! T = r0 == 0 (all points invisible)
|
||||||
|
bt/s .NO_POINTS_VISIBLE ! if T goto NO_POINTS_VISIBLE
|
||||||
|
nop
|
||||||
|
bra .SOME_POINTS_VISIBLE
|
||||||
|
nop
|
||||||
|
|
||||||
|
.NO_POINTS_VISIBLE:
|
||||||
|
bra .LOOP_END ! jump to loop end after executing instruction in delay slot
|
||||||
|
add #-128, r5 ! r5 -= 4 * sizeof(VERTEX), move back to 1 vertex before start of quad
|
||||||
|
|
||||||
|
.SOME_POINTS_VISIBLE:
|
||||||
|
|
||||||
|
.LOOP_END:
|
||||||
|
dt r6 ! r6--; T = r6 == 0
|
||||||
|
bf .TRANSFORM_QUAD ! if !T then goto TRANSFORM_QUAD
|
||||||
nop
|
nop
|
||||||
|
|
||||||
rts ! return
|
add #32, r5 ! r5 += sizeof(VERTEX)
|
||||||
nop
|
mov r5,r0 ! r0 = r5
|
||||||
|
rts ! return after executing instruction in delay slot
|
||||||
|
fmov fr11,fr0 ! fr0 = original fr0
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
CMD_COL_VERT: .long 0xe0000000
|
CMD_COL_VERT: .long 0xe0000000
|
||||||
CMD_COL_EOS: .long 0xf0000000
|
CMD_COL_EOS: .long 0xf0000000
|
||||||
|
|
||||||
|
.global _VP_COL_HWIDTH
|
||||||
|
.type _VP_COL_HWIDTH,%object
|
||||||
|
.size _VP_COL_HWIDTH,4
|
||||||
|
_VP_COL_HWIDTH: .long 0
|
||||||
|
|
||||||
|
.global _VP_COL_HHEIGHT
|
||||||
|
.type _VP_COL_HHEIGHT,%object
|
||||||
|
.size _VP_COL_HHEIGHT,4
|
||||||
|
_VP_COL_HHEIGHT: .long 0
|
||||||
|
|
||||||
|
.global _VP_COL_X_PLUS_HWIDTH
|
||||||
|
.type _VP_COL_X_PLUS_HWIDTH,%object
|
||||||
|
.size _VP_COL_X_PLUS_HWIDTH,4
|
||||||
|
_VP_COL_X_PLUS_HWIDTH: .long 0
|
||||||
|
|
||||||
|
.global _VP_COL_Y_PLUS_HHEIGHT
|
||||||
|
.type _VP_COL_Y_PLUS_HHEIGHT,%object
|
||||||
|
.size _VP_COL_Y_PLUS_HHEIGHT,4
|
||||||
|
_VP_COL_Y_PLUS_HHEIGHT: .long 0
|
@ -1,7 +1,7 @@
|
|||||||
!r0 = prefetch address
|
!r0 = clip flags
|
||||||
!r1 = GPU VERT command
|
!r1 = GPU command
|
||||||
!r2 = GPU EOS command
|
!r2 = temp
|
||||||
!r3 = colour
|
!r3 = prefetch address
|
||||||
!r4 = src pointer ARG
|
!r4 = src pointer ARG
|
||||||
!r5 = dst pointer ARG
|
!r5 = dst pointer ARG
|
||||||
!r6 = quads count ARG
|
!r6 = quads count ARG
|
||||||
@ -10,119 +10,131 @@
|
|||||||
!fr5 = y
|
!fr5 = y
|
||||||
!fr6 = z
|
!fr6 = z
|
||||||
!fr7 = w
|
!fr7 = w
|
||||||
!fr9 = ?
|
!fr8 = c
|
||||||
!fr10 = u
|
!fr9 = u
|
||||||
!fr11 = v
|
!fr10 = v
|
||||||
|
!fr11 = saved fr0 (for viewport transform)
|
||||||
|
|
||||||
!fv4 = XYZW
|
!fv4 = XYZW
|
||||||
|
|
||||||
.globl _DrawTexturedQuads
|
#include "ViewportTransform.S"
|
||||||
|
.global _DrawTexturedQuads
|
||||||
.align 4
|
.align 4
|
||||||
.type _DrawTexturedQuads,%function
|
.type _DrawTexturedQuads,%function
|
||||||
|
|
||||||
_DrawTexturedQuads:
|
_DrawTexturedQuads:
|
||||||
! Setup
|
! Setup
|
||||||
mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command
|
mov r4,r3 ! r3 = src
|
||||||
mov.l CMD_TEX_EOS, r2 ! r2 = GPU EOS command
|
add #-32, r5 ! r5 -= sizeof(VERTEX)
|
||||||
mov r4,r0 ! r0 = src
|
fmov fr0,fr11 ! fr11 = saved fr0
|
||||||
add #-32, r5 ! r5 -= sizeof(VERTEX)
|
nop ! loop align
|
||||||
|
|
||||||
.TRANSFORM_QUAD:
|
.TRANSFORM_QUAD:
|
||||||
! TRANSFORM VERTEX 1
|
mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command
|
||||||
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
|
! TRANSFORM VERTEX 1
|
||||||
fmov @r4+,fr10! fr10 = src->u
|
add #24, r3 ! r3 += VERTEX_STRIDE
|
||||||
fmov @r4+,fr11! fr11 = src->v
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
mov.l r3,@-r5 ! dst->bgra = r3
|
fmov @r4+, fr4 ! X = src->x
|
||||||
fmov.s fr11,@-r5 ! dst->v = fr11
|
fmov @r4+, fr5 ! Y = src->y
|
||||||
fmov.s fr10,@-r5 ! dst->u = fr10
|
fmov @r4+, fr6 ! Z = src->z
|
||||||
fmov.s fr6,@-r5 ! dst->z = fr6
|
fldi1 fr7 ! W = 1.0
|
||||||
fmov.s fr5,@-r5 ! dst->y = fr5
|
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
|
||||||
fmov.s fr4,@-r5 ! dst->x = fr4
|
! OUTPUT + CLIPFLAGS VERTEX 1
|
||||||
mov.l r1,@-r5 ! dst->flags = CMD_VERT
|
fmov @r4+,fr8 ! C = src->color
|
||||||
|
fmov @r4+,fr9 ! U = src->u
|
||||||
|
fmov @r4+,fr10! V = src->v
|
||||||
|
ProcessVertex1
|
||||||
|
|
||||||
! TRANSFORM VERTEX 2
|
! TRANSFORM VERTEX 2
|
||||||
add #24, r0 ! r0 += VERTEX_STRIDE
|
add #24, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! X = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! Y = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! Z = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! W = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
|
||||||
|
! OUTPUT + CLIPFLAGS VERTEX 2
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov @r4+,fr10! fr10 = src->u
|
fmov @r4+,fr9 ! U = src->u
|
||||||
fmov @r4+,fr11! fr11 = src->v
|
fmov @r4+,fr10! V = src->v
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex2
|
||||||
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
|
! TRANSFORM VERTEX 3
|
||||||
add #24, r0 ! r0 += VERTEX_STRIDE
|
add #24, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! X = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! Y = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! Z = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! W = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
|
||||||
|
! OUTPUT + CLIPFLAGS VERTEX 3
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
fmov @r4+,fr8 ! C = src->color
|
||||||
fmov @r4+,fr10! fr10 = src->u
|
fmov @r4+,fr9 ! U = src->u
|
||||||
fmov @r4+,fr11! fr11 = src->v
|
fmov @r4+,fr10! V = src->v
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
ProcessVertex3
|
||||||
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
|
! TRANSFORM VERTEX 4
|
||||||
add #24, r0 ! r0 += VERTEX_STRIDE
|
add #24, r3 ! r3 += VERTEX_STRIDE
|
||||||
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
|
||||||
pref @r0 ! PREFETCH r0 (next vertex)
|
pref @r3 ! PREFETCH r3 (next vertex)
|
||||||
fmov @r4+, fr4 ! fr4 = src->x
|
fmov @r4+, fr4 ! X = src->x
|
||||||
fmov @r4+, fr5 ! fr5 = src->y
|
fmov @r4+, fr5 ! Y = src->y
|
||||||
fmov @r4+, fr6 ! fr6 = src->z
|
fmov @r4+, fr6 ! Z = src->z
|
||||||
fldi1 fr7 ! fr7 = 1.0
|
fldi1 fr7 ! W = 1.0
|
||||||
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
|
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
|
||||||
|
! OUTPUT + CLIPFLAGS VERTEX 4
|
||||||
|
fmov @r4+,fr8 ! C = src->color
|
||||||
|
fmov @r4+,fr9 ! U = src->u
|
||||||
|
fmov @r4+,fr10! V = src->v
|
||||||
|
ProcessVertex4 CMD_TEX_EOS
|
||||||
|
|
||||||
mov.l @r4+,r3 ! r3 = src->color
|
! CLIPFLAGS TESTING
|
||||||
fmov @r4+,fr10! fr10 = src->u
|
cmp/eq #0,r0 ! T = r0 == 0 (all points invisible)
|
||||||
fmov @r4+,fr11! fr11 = src->v
|
bt/s .NO_POINTS_VISIBLE ! if T goto NO_POINTS_VISIBLE
|
||||||
fmov.s fr7,@-r5 ! dst->w = fr7
|
nop
|
||||||
mov.l r3,@-r5 ! dst->bgra = r3
|
bra .SOME_POINTS_VISIBLE
|
||||||
fmov.s fr11,@-r5 ! dst->v = fr11
|
nop
|
||||||
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
|
.NO_POINTS_VISIBLE:
|
||||||
bf .TRANSFORM_QUAD ! if T == 0 then goto TRANSFORM_QUAD
|
bra .LOOP_END ! jump to loop end after executing instruction in delay slot
|
||||||
|
add #-128, r5 ! r5 -= 4 * sizeof(VERTEX), move back to prior quad, so that this invisible quad gets overwritten in next iteration
|
||||||
|
|
||||||
|
.SOME_POINTS_VISIBLE:
|
||||||
|
|
||||||
|
.LOOP_END:
|
||||||
|
dt r6 ! r6--; T = r6 == 0
|
||||||
|
bf .TRANSFORM_QUAD ! if !T then goto TRANSFORM_QUAD
|
||||||
nop
|
nop
|
||||||
|
|
||||||
rts ! return
|
add #32, r5 ! r5 += sizeof(VERTEX)
|
||||||
nop
|
mov r5,r0 ! r0 = r5
|
||||||
|
rts ! return after executing instruction in delay slot
|
||||||
|
fmov fr11,fr0 ! fr0 = original fr0
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
CMD_TEX_VERT: .long 0xe0000000
|
CMD_TEX_VERT: .long 0xe0000000
|
||||||
CMD_TEX_EOS: .long 0xf0000000
|
CMD_TEX_EOS: .long 0xf0000000
|
||||||
|
|
||||||
|
.global _VP_TEX_HWIDTH
|
||||||
|
.type _VP_TEX_HWIDTH,%object
|
||||||
|
.size _VP_TEX_HWIDTH,4
|
||||||
|
_VP_TEX_HWIDTH: .long 0
|
||||||
|
|
||||||
|
.global _VP_TEX_HHEIGHT
|
||||||
|
.type _VP_TEX_HHEIGHT,%object
|
||||||
|
.size _VP_TEX_HHEIGHT,4
|
||||||
|
_VP_TEX_HHEIGHT: .long 0
|
||||||
|
|
||||||
|
.global _VP_TEX_X_PLUS_HWIDTH
|
||||||
|
.type _VP_TEX_X_PLUS_HWIDTH,%object
|
||||||
|
.size _VP_TEX_X_PLUS_HWIDTH,4
|
||||||
|
_VP_TEX_X_PLUS_HWIDTH: .long 0
|
||||||
|
|
||||||
|
.global _VP_TEX_Y_PLUS_HHEIGHT
|
||||||
|
.type _VP_TEX_Y_PLUS_HHEIGHT,%object
|
||||||
|
.size _VP_TEX_Y_PLUS_HHEIGHT,4
|
||||||
|
_VP_TEX_Y_PLUS_HHEIGHT: .long 0
|
@ -1,3 +1,77 @@
|
|||||||
|
! =========================================================
|
||||||
|
! ========================= VERTEX OUTPUT =================
|
||||||
|
! =========================================================
|
||||||
|
! To take advantage of SH4 dual instruction processing, interleave
|
||||||
|
! the clipflag calculation and vertex output instructions
|
||||||
|
.macro ProcessVertex1
|
||||||
|
fmov.s fr7,@-r5 ! dst->w = W
|
||||||
|
fmov.s fr8,@-r5 ! dst->c = C
|
||||||
|
fneg fr7 ! W = -W
|
||||||
|
fmov.s fr10,@-r5 ! dst->v = V
|
||||||
|
fcmp/gt fr7,fr6 ! T = Z > W (i.e. Z > -W)
|
||||||
|
fmov.s fr9,@-r5 ! dst->u = U
|
||||||
|
movt r0 ! CLIPFLAGS = T
|
||||||
|
fmov.s fr6,@-r5 ! dst->z = Z
|
||||||
|
fmov.s fr5,@-r5 ! dst->y = Y
|
||||||
|
fmov.s fr4,@-r5 ! dst->x = X
|
||||||
|
mov.l r1,@-r5 ! dst->flags = CMD_VERT
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro ProcessVertex2
|
||||||
|
fmov.s fr7,@-r5 ! dst->w = W
|
||||||
|
fmov.s fr8,@-r5 ! dst->c = C
|
||||||
|
fneg fr7 ! W = -W
|
||||||
|
fmov.s fr10,@-r5 ! dst->v = V
|
||||||
|
fcmp/gt fr7,fr6 ! T = Z > W (i.e. Z > -W)
|
||||||
|
fmov.s fr9,@-r5 ! dst->u = U
|
||||||
|
movt r2 ! tmp = T
|
||||||
|
fmov.s fr6,@-r5 ! dst->z = Z
|
||||||
|
add r2,r2 ! tmp = tmp + tmp
|
||||||
|
fmov.s fr5,@-r5 ! dst->y = Y
|
||||||
|
or r2,r0 ! CLIPFLAGS |= tmp (T << 1)
|
||||||
|
fmov.s fr4,@-r5 ! dst->x = X
|
||||||
|
mov.l r1,@-r5 ! dst->flags = CMD_VERT
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro ProcessVertex3
|
||||||
|
fmov.s fr7,@-r5 ! dst->w = W
|
||||||
|
fmov.s fr8,@-r5 ! dst->c = C
|
||||||
|
fneg fr7 ! W = -W
|
||||||
|
fmov.s fr10,@-r5 ! dst->v = V
|
||||||
|
fcmp/gt fr7,fr6 ! T = Z > W (i.e. Z > -W)
|
||||||
|
fmov.s fr9,@-r5 ! dst->u = U
|
||||||
|
movt r2 ! tmp = T
|
||||||
|
fmov.s fr6,@-r5 ! dst->z = Z
|
||||||
|
fmov.s fr5,@-r5 ! dst->y = Y
|
||||||
|
shll2 r2 ! tmp = tmp << 2
|
||||||
|
fmov.s fr4,@-r5 ! dst->x = X
|
||||||
|
or r2,r0 ! CLIPFLAGS |= tmp (T << 2)
|
||||||
|
mov.l r1,@-r5 ! dst->flags = CMD_VERT
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro ProcessVertex4 eos_addr
|
||||||
|
fmov.s fr7,@-r5 ! dst->w = W
|
||||||
|
fmov.s fr8,@-r5 ! dst->c = C
|
||||||
|
fneg fr7 ! W = -W
|
||||||
|
fmov.s fr10,@-r5 ! dst->v = V
|
||||||
|
fcmp/gt fr7,fr6 ! T = Z > W (i.e. Z > -W)
|
||||||
|
fmov.s fr9,@-r5 ! dst->u = U
|
||||||
|
movt r2 ! tmp = T
|
||||||
|
fmov.s fr6,@-r5 ! dst->z = Z
|
||||||
|
shll2 r2 ! tmp = tmp << 2
|
||||||
|
fmov.s fr5,@-r5 ! dst->y = Y
|
||||||
|
add r2,r2 ! tmp = (tmp << 2) + (tmp << 2)
|
||||||
|
fmov.s fr4,@-r5 ! dst->x = X
|
||||||
|
mov.l \eos_addr, r1 ! r1 = GPU EOS command
|
||||||
|
or r2,r0 ! CLIPFLAGS |= tmp (T << 3)
|
||||||
|
or r0,r1 ! r1 |= CLIPFLAGS
|
||||||
|
mov.l r1,@-r5 ! dst->flags = GPU EOS | CLIPFLAGS
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
! =========================================================
|
||||||
|
! ====================== VIEWPORT TRANSFORM ===============
|
||||||
|
! =========================================================
|
||||||
!r2 = return addr
|
!r2 = return addr
|
||||||
!r0 = temp
|
!r0 = temp
|
||||||
!r5 = dst pointer
|
!r5 = dst pointer
|
||||||
|
@ -467,19 +467,34 @@ cc_bool Gfx_WarnIfNecessary(void) {
|
|||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#define VB_PTR gfx_vertices
|
#define VB_PTR gfx_vertices
|
||||||
static const void* VERTEX_PTR;
|
static const void* VERTEX_PTR;
|
||||||
|
extern void apply_poly_header(PolyHeader* header, PolyList* activePolyList);
|
||||||
|
|
||||||
extern void DrawColouredQuads(const void* src, Vertex* dst, int numQuads);
|
extern Vertex* DrawColouredQuads(const void* src, Vertex* dst, int numQuads);
|
||||||
extern void DrawTexturedQuads(const void* src, Vertex* dst, int numQuads);
|
extern Vertex* DrawTexturedQuads(const void* src, Vertex* dst, int numQuads);
|
||||||
|
|
||||||
void DrawQuads(int count) {
|
void DrawQuads(int count) {
|
||||||
if (!count) return;
|
if (!count) return;
|
||||||
Vertex* start = submitVertices(count);
|
PolyList* output = _glActivePolyList();
|
||||||
|
AlignedVectorHeader* hdr = &output->vector.hdr;
|
||||||
|
|
||||||
|
uint32_t header_required = (hdr->size == 0) || STATE_DIRTY;
|
||||||
|
// Reserve room for the vertices and header
|
||||||
|
Vertex* beg = aligned_vector_reserve(&output->vector, hdr->size + (header_required) + count);
|
||||||
|
|
||||||
|
if (header_required) {
|
||||||
|
apply_poly_header((PolyHeader*)beg, output);
|
||||||
|
STATE_DIRTY = GL_FALSE;
|
||||||
|
beg++;
|
||||||
|
hdr->size += 1;
|
||||||
|
}
|
||||||
|
Vertex* end;
|
||||||
|
|
||||||
if (TEXTURES_ENABLED) {
|
if (TEXTURES_ENABLED) {
|
||||||
DrawTexturedQuads(VERTEX_PTR, start, count >> 2);
|
end = DrawTexturedQuads(VERTEX_PTR, beg, count >> 2);
|
||||||
} else {
|
} else {
|
||||||
DrawColouredQuads(VERTEX_PTR, start, count >> 2);
|
end = DrawColouredQuads(VERTEX_PTR, beg, count >> 2);
|
||||||
}
|
}
|
||||||
|
hdr->size += (end - beg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gfx_SetVertexFormat(VertexFormat fmt) {
|
void Gfx_SetVertexFormat(VertexFormat fmt) {
|
||||||
@ -569,6 +584,11 @@ void Gfx_OnWindowResize(void) {
|
|||||||
Gfx_SetViewport(0, 0, Game.Width, Game.Height);
|
Gfx_SetViewport(0, 0, Game.Width, Game.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern float VP_COL_HWIDTH, VP_TEX_HWIDTH;
|
||||||
|
extern float VP_COL_HHEIGHT, VP_TEX_HHEIGHT;
|
||||||
|
extern float VP_COL_X_PLUS_HWIDTH, VP_TEX_X_PLUS_HWIDTH;
|
||||||
|
extern float VP_COL_Y_PLUS_HHEIGHT, VP_TEX_Y_PLUS_HHEIGHT;
|
||||||
|
|
||||||
void Gfx_SetViewport(int x, int y, int w, int h) {
|
void Gfx_SetViewport(int x, int y, int w, int h) {
|
||||||
if (x == 0 && y == 0 && w == Game.Width && h == Game.Height) {
|
if (x == 0 && y == 0 && w == Game.Width && h == Game.Height) {
|
||||||
glDisable(GL_SCISSOR_TEST);
|
glDisable(GL_SCISSOR_TEST);
|
||||||
@ -578,5 +598,11 @@ void Gfx_SetViewport(int x, int y, int w, int h) {
|
|||||||
|
|
||||||
glViewport(x, y, w, h);
|
glViewport(x, y, w, h);
|
||||||
glScissor (x, y, w, h);
|
glScissor (x, y, w, h);
|
||||||
|
|
||||||
|
VP_COL_HWIDTH = VP_TEX_HWIDTH = w * 0.5f;
|
||||||
|
VP_COL_HHEIGHT = VP_TEX_HHEIGHT = h * -0.5f;
|
||||||
|
|
||||||
|
VP_COL_X_PLUS_HWIDTH = VP_TEX_X_PLUS_HWIDTH = x + w * 0.5f;
|
||||||
|
VP_COL_Y_PLUS_HHEIGHT = VP_TEX_Y_PLUS_HHEIGHT = y + h * 0.5f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
5
third_party/gldc/src/aligned_vector.h
vendored
5
third_party/gldc/src/aligned_vector.h
vendored
@ -83,13 +83,12 @@ AV_FORCE_INLINE void* aligned_vector_at(const AlignedVector* vector, const uint3
|
|||||||
|
|
||||||
AV_FORCE_INLINE void* aligned_vector_reserve(AlignedVector* vector, uint32_t element_count) {
|
AV_FORCE_INLINE void* aligned_vector_reserve(AlignedVector* vector, uint32_t element_count) {
|
||||||
AlignedVectorHeader* hdr = &vector->hdr;
|
AlignedVectorHeader* hdr = &vector->hdr;
|
||||||
|
uint32_t original_byte_size = (hdr->size * AV_ELEMENT_SIZE);
|
||||||
|
|
||||||
if(element_count < hdr->capacity) {
|
if(element_count < hdr->capacity) {
|
||||||
return aligned_vector_at(vector, element_count);
|
return vector->data + original_byte_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t original_byte_size = (hdr->size * AV_ELEMENT_SIZE);
|
|
||||||
|
|
||||||
/* We overallocate so that we don't make small allocations during push backs */
|
/* We overallocate so that we don't make small allocations during push backs */
|
||||||
element_count = ROUND_TO_CHUNK_SIZE(element_count);
|
element_count = ROUND_TO_CHUNK_SIZE(element_count);
|
||||||
|
|
||||||
|
27
third_party/gldc/src/draw.c
vendored
27
third_party/gldc/src/draw.c
vendored
@ -1,28 +1,3 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "private.h"
|
#include "private.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
extern void apply_poly_header(PolyHeader* header, PolyList* activePolyList);
|
|
||||||
|
|
||||||
GL_FORCE_INLINE Vertex* submitVertices(GLuint vertexCount) {
|
|
||||||
TRACE();
|
|
||||||
PolyList* output = _glActivePolyList();
|
|
||||||
uint32_t header_offset;
|
|
||||||
uint32_t start_offset;
|
|
||||||
|
|
||||||
uint32_t vector_size = aligned_vector_size(&output->vector);
|
|
||||||
GLboolean header_required = (vector_size == 0) || STATE_DIRTY;
|
|
||||||
|
|
||||||
header_offset = vector_size;
|
|
||||||
start_offset = header_offset + (header_required ? 1 : 0);
|
|
||||||
|
|
||||||
/* Make room for the vertices and header */
|
|
||||||
aligned_vector_extend(&output->vector, (header_required) + vertexCount);
|
|
||||||
gl_assert(header_offset < aligned_vector_size(&output->vector));
|
|
||||||
|
|
||||||
if (header_required) {
|
|
||||||
apply_poly_header(aligned_vector_at(&output->vector, header_offset), output);
|
|
||||||
STATE_DIRTY = GL_FALSE;
|
|
||||||
}
|
|
||||||
return aligned_vector_at(&output->vector, start_offset);
|
|
||||||
}
|
|
15
third_party/gldc/src/sh4.c
vendored
15
third_party/gldc/src/sh4.c
vendored
@ -465,7 +465,7 @@ void SceneListSubmit(Vertex* v3, int n) {
|
|||||||
|
|
||||||
for(int i = 0; i < n; ++i, ++v3) {
|
for(int i = 0; i < n; ++i, ++v3) {
|
||||||
PREFETCH(v3 + 1);
|
PREFETCH(v3 + 1);
|
||||||
switch(v3->flags) {
|
switch(v3->flags & 0xFF000000) {
|
||||||
case GPU_CMD_VERTEX_EOL:
|
case GPU_CMD_VERTEX_EOL:
|
||||||
break;
|
break;
|
||||||
case GPU_CMD_VERTEX:
|
case GPU_CMD_VERTEX:
|
||||||
@ -480,12 +480,8 @@ void SceneListSubmit(Vertex* v3, int n) {
|
|||||||
Vertex* const v1 = v3 - 2;
|
Vertex* const v1 = v3 - 2;
|
||||||
Vertex* const v2 = v3 - 1;
|
Vertex* const v2 = v3 - 1;
|
||||||
|
|
||||||
visible_mask = (
|
visible_mask = v3->flags & 0xFF;
|
||||||
(v0->xyz[2] > -v0->w) << 0 |
|
v3->flags &= ~0xFF;
|
||||||
(v1->xyz[2] > -v1->w) << 1 |
|
|
||||||
(v2->xyz[2] > -v2->w) << 2 |
|
|
||||||
(v3->xyz[2] > -v3->w) << 3
|
|
||||||
);
|
|
||||||
|
|
||||||
// Stats gathering found that when testing a 64x64x64 sized world, at most
|
// Stats gathering found that when testing a 64x64x64 sized world, at most
|
||||||
// ~400-500 triangles needed clipping
|
// ~400-500 triangles needed clipping
|
||||||
@ -505,7 +501,7 @@ void SceneListSubmit(Vertex* v3, int n) {
|
|||||||
|
|
||||||
_glPerspectiveDivideVertex(v2);
|
_glPerspectiveDivideVertex(v2);
|
||||||
_glPushHeaderOrVertex(v2);
|
_glPushHeaderOrVertex(v2);
|
||||||
|
|
||||||
_glPerspectiveDivideVertex(v0);
|
_glPerspectiveDivideVertex(v0);
|
||||||
_glPushHeaderOrVertex(v0);
|
_glPushHeaderOrVertex(v0);
|
||||||
|
|
||||||
@ -514,9 +510,6 @@ void SceneListSubmit(Vertex* v3, int n) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0: // No vertices visible
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // Some vertices visible
|
default: // Some vertices visible
|
||||||
SubmitClipped(v0, v1, v2, v3, visible_mask);
|
SubmitClipped(v0, v1, v2, v3, visible_mask);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user