From 11f9b29487b32c237159baaf48b2571231002b3d Mon Sep 17 00:00:00 2001 From: XProger Date: Tue, 23 Nov 2021 10:07:52 +0300 Subject: [PATCH] #370 3DO save 14 ticks per vertex for projectVertices func --- src/platform/3do/projectVertices.s | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/platform/3do/projectVertices.s b/src/platform/3do/projectVertices.s index 9c07304..f5e0f1c 100644 --- a/src/platform/3do/projectVertices.s +++ b/src/platform/3do/projectVertices.s @@ -8,20 +8,20 @@ EXPORT projectVertices_asm vCount RN r0 -mx RN r0 +mx RN vCount my RN r1 mz RN r2 x RN r3 y RN r4 z RN r5 dz RN r6 -minX RN dz -minY RN r7 -maxX RN r8 +minX RN r7 +minY RN r8 +maxX RN r9 maxY RN r12 -last RN r9 -m RN r10 -vp RN m +m RN minX +vp RN minX +last RN r10 vertex RN r11 divLUT RN lr @@ -36,7 +36,7 @@ CLIP_FAR EQU (1 << 4) CLIP_NEAR EQU (1 << 5) DIV_TABLE_END EQU (1025 - 1) -VIEW_DIST EQU (1024 * 10) +VIEW_DIST EQU (1024 * 10) ; max = DIV_TABLE_END << PROJ_SHIFT VIEW_MIN EQU (256 << CLIP_SHIFT) VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT) @@ -58,9 +58,10 @@ projectVertices_asm swi MulManyVec3Mat33_F16 add m, m, #36 ; skip 3x3 matrix part - ldmia m, {mx, my, mz} ; get view space offset from matrix + ldmia m, {mx, my, mz} ; get view space offset from matrix ldr divLUT, =divTable ldr vp, =viewportRel + ldmia vp, {minX, minY, maxX, maxY} loop ldmia vertex, {x, y, z} ; read unpacked vertex @@ -79,17 +80,14 @@ loop ldmia vertex, {x, y, z} ; read unpacked vertex orrgt z, z, #CLIP_FAR ; projection - mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) - cmp dz, #DIV_TABLE_END - movge dz, #DIV_TABLE_END + mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive ldr dz, [divLUT, dz, lsl #2] mul x, dz, x mul y, dz, y - mov x, x, asr #12 - mov y, y, asr #12 + mov x, x, asr #(16 - PROJ_SHIFT) + mov y, y, asr #(16 - PROJ_SHIFT) ; check xy clipping - ldmia vp, {minX, minY, maxX, maxY} cmp x, minX orrlt z, z, #CLIP_LEFT cmp y, minY