Optimise ultra/gu functions

This commit is contained in:
Ryan Dwyer 2023-05-19 20:36:54 +10:00
parent c911ee9b2d
commit 87af76dc3d
14 changed files with 120 additions and 117 deletions

View File

@ -185,8 +185,8 @@ extern int guRandom(void);
*/
extern float sinf(float angle);
extern float cosf(float angle);
extern signed short sins (unsigned short angle);
extern signed short coss (unsigned short angle);
extern signed int sins (unsigned int angle);
extern signed int coss (unsigned int angle);
/*
* Dump routines for low-level display lists

View File

@ -157,7 +157,6 @@
build/ROMID/lib/ultra/io/devmgr.o (section); \
build/ROMID/lib/ultra/os/thread.o (section); \
build/ROMID/lib/ultra/os/destroythread.o (section); \
build/ROMID/lib/ultra/gu/mtxutil.o (section); \
build/ROMID/lib/ultra/libc/string.o (section); \
build/ROMID/lib/ultra/libc/ldiv.o (section); \
build/ROMID/lib/ultra/io/siacs.o (section); \

View File

@ -13,8 +13,6 @@
#define false 0
#define true 1
#define osSyncPrintf
#define S32_MAX 2147483647
#define U32_MAX 4294967295
#define MINFLOAT ((float)-3.40282346638528860e+38)

View File

@ -456,30 +456,6 @@ void mtx4Align(f32 mtx[4][4], f32 angle, f32 x, f32 y, f32 z)
guAlignF(mtx, angle, x, y, z);
}
void mtx4LoadRotationFrom(f32 src[4][4], f32 dst[4][4])
{
dst[0][0] = src[0][0];
dst[0][1] = src[1][0];
dst[0][2] = src[2][0];
dst[1][0] = src[0][1];
dst[1][1] = src[1][1];
dst[1][2] = src[2][1];
dst[2][0] = src[0][2];
dst[2][1] = src[1][2];
dst[2][2] = src[2][2];
dst[3][0] = 0;
dst[3][1] = 0;
dst[3][2] = 0;
dst[0][3] = 0;
dst[1][3] = 0;
dst[2][3] = 0;
dst[3][3] = 1;
}
void mtx000170e4(f32 src[4][4], f32 dst[4][4])
{
f32 tmp = (src[0][0] * src[0][0] + src[1][0] * src[1][0] + src[2][0] * src[2][0]);

View File

@ -450,13 +450,21 @@ glabel mtx00015f88
jr $ra
nop
glabel guMtxF2L
lui $at, 0x4780
mtc1 $at, $f0
j _mtxF2L
mtc1 $at, $f2
glabel mtx00016054
lui $t2, %hi(var8005ef10)
addiu $t2, $t2, %lo(var8005ef10)
addiu $t0, $a0, 0x40
lui $t1, 0xffff
lwc1 $f0, 0x0($t2)
lwc1 $f2, 0x4($t2)
glabel _mtxF2L
lui $t1, 0xffff
addiu $t0, $a0, 0x40
.L0001606c:
lwc1 $f4, 0x0($a0)
lwc1 $f6, 0x4($a0)
@ -495,3 +503,53 @@ glabel mtx00016054
addiu $a1, $a1, 0x8
jr $ra
nop
glabel mtx4LoadRotationFrom
lw $t0, 0x00($a0)
lw $t1, 0x10($a0)
lw $t2, 0x20($a0)
lw $t3, 0x04($a0)
lw $t4, 0x14($a0)
lw $t5, 0x24($a0)
lw $t6, 0x08($a0)
lw $t7, 0x18($a0)
lw $t8, 0x28($a0)
sw $t0, 0x00($a1)
sw $t1, 0x04($a1)
sw $t2, 0x08($a1)
sw $t3, 0x10($a1)
sw $t4, 0x14($a1)
sw $t5, 0x18($a1)
sw $t6, 0x20($a1)
sw $t7, 0x24($a1)
sw $t8, 0x28($a1)
sw $zero, 0x30($a1)
sw $zero, 0x34($a1)
sw $zero, 0x38($a1)
sw $zero, 0x0c($a1)
sw $zero, 0x1c($a1)
sw $zero, 0x2c($a1)
lui $at, 0x3f80
jr $ra
sw $at, 0x3c($a1)
glabel guScaleF
lui $at, 0x3f80
sw $zero, 0x4($a0)
sw $zero, 0x8($a0)
sw $zero, 0xc($a0)
sw $zero, 0x10($a0)
sw $zero, 0x18($a0)
sw $zero, 0x1c($a0)
sw $zero, 0x20($a0)
sw $zero, 0x24($a0)
sw $zero, 0x2c($a0)
sw $zero, 0x30($a0)
sw $zero, 0x34($a0)
sw $zero, 0x38($a0)
sw $a1, 0x0($a0)
sw $a2, 0x14($a0)
sw $a3, 0x28($a0)
jr $ra
sw $at, 0x3c($a0)

View File

@ -1,5 +1,6 @@
#include "guint.h"
#include "constants.h"
#include "lib/mtx.h"
void guAlignF(float mf[4][4], float a, float x, float y, float z)
{
@ -13,8 +14,6 @@ void guAlignF(float mf[4][4], float a, float x, float y, float z)
c = cosf(a);
h = sqrtf(x * x + z * z);
guMtxIdentF(mf);
if (h != 0) {
hinv = 1 / h;
@ -37,5 +36,7 @@ void guAlignF(float mf[4][4], float a, float x, float y, float z)
mf[1][3] = 0;
mf[2][3] = 0;
mf[3][3] = 1;
} else {
mtx4LoadIdentity((Mtxf *) mf);
}
}

View File

@ -1,6 +1,6 @@
#include "guint.h"
signed short coss(unsigned short x)
signed int coss(unsigned int x)
{
return sins((unsigned short) (x + 0x4000));
return sins((unsigned int) (x + 0x4000));
}

View File

@ -4,20 +4,23 @@ void guFrustumF(float mf[4][4], float l, float r, float b, float t, float n, flo
{
int i, j;
guMtxIdentF(mf);
mf[0][0] = 2 * n / (r - l) * scale;
mf[0][1] = 0;
mf[0][2] = 0;
mf[0][3] = 0;
mf[0][0] = 2 * n / (r - l);
mf[1][1] = 2 * n / (t - b);
mf[2][0] = (r + l) / (r - l);
mf[2][1] = (t + b) / (t - b);
mf[2][2] = -(f + n) / (f - n);
mf[2][3] = -1;
mf[3][2] = -2 * f * n / (f - n);
mf[1][0] = 0;
mf[1][1] = 2 * n / (t - b) * scale;
mf[1][2] = 0;
mf[1][3] = 0;
mf[2][0] = (r + l) / (r - l) * scale;
mf[2][1] = (t + b) / (t - b) * scale;
mf[2][2] = -(f + n) / (f - n) * scale;
mf[2][3] = -scale;
mf[3][0] = 0;
mf[3][1] = 0;
mf[3][2] = -2 * f * n / (f - n) * scale;
mf[3][3] = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
mf[i][j] *= scale;
}
}
}

View File

@ -8,8 +8,6 @@ static void guLookAtReflectF(float mf[4][4], LookAt *l,
{
float len, xLook, yLook, zLook, xRight, yRight, zRight;
guMtxIdentF(mf);
xLook = xAt - xEye;
yLook = yAt - yEye;
zLook = zAt - zEye;

View File

@ -1,32 +0,0 @@
#include <ultra64.h>
void guMtxF2L(f32 mf[4][4], Mtx *m)
{
int i, j;
int e1, e2;
int *ai, *af;
ai = (int *) &m->m[0][0];
af = (int *) &m->m[2][0];
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
e1 = FTOFIX32(mf[i][j * 2]);
e2 = FTOFIX32(mf[i][j * 2 + 1]);
*(ai++) = (e1 & 0xffff0000) | ((e2 >> 16) & 0xffff);
*(af++) = ((e1 << 16) & 0xffff0000) | (e2 & 0xffff);
}
}
}
void guMtxIdentF(float mf[4][4])
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
mf[i][j] = i == j ? 1 : 0;
}
}
}

View File

@ -5,23 +5,28 @@ void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, fl
float cot;
int i, j;
guMtxIdentF(mf);
fovy *= 3.1415926f / 180.0f;
cot = cosf(fovy * 0.5f) / sinf(fovy * 0.5f);
mf[0][0] = cot / aspect;
mf[1][1] = cot;
mf[2][2] = (near + far) / (near - far);
mf[2][3] = -1;
mf[3][2] = (2.0f * near * far) / (near - far);
mf[3][3] = 0;
mf[0][0] = cot / aspect * scale;
mf[0][1] = 0;
mf[0][2] = 0;
mf[0][3] = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
mf[i][j] *= scale;
}
}
mf[1][0] = 0;
mf[1][1] = cot * scale;
mf[1][2] = 0;
mf[1][3] = 0;
mf[2][0] = 0;
mf[2][1] = 0;
mf[2][2] = (near + far) / (near - far) * scale;
mf[2][3] = -scale;
mf[3][0] = 0;
mf[3][1] = 0;
mf[3][2] = (2.0f * near * far) / (near - far) * scale;
mf[3][3] = 0;
if (perspNorm != (u16 *) NULL) {
if (near + far <= 2.0f) {

View File

@ -16,8 +16,6 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
bc = y * z * t;
ca = z * x * t;
guMtxIdentF(mf);
t = x * x;
mf[0][0] = t + cosine * (1 - t);
mf[2][1] = bc - x * sine;
@ -32,4 +30,13 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
mf[2][2] = t + cosine * (1 - t);
mf[1][0] = ab - z * sine;
mf[0][1] = ab + z * sine;
mf[0][3] = 0;
mf[1][3] = 0;
mf[2][3] = 0;
mf[3][0] = 0;
mf[3][1] = 0;
mf[3][2] = 0;
mf[3][3] = 1;
}

View File

@ -1,15 +1,5 @@
#include <ultra64.h>
void guScaleF(float mf[4][4], float x, float y, float z)
{
guMtxIdentF(mf);
mf[0][0] = x;
mf[1][1] = y;
mf[2][2] = z;
mf[3][3] = 1;
}
void guScale(Mtx *m, float x, float y, float z)
{
f32 mf[4][4];

View File

@ -106,19 +106,19 @@ s16 sintable[] = {
0x7ffe, 0x7ffe, 0x7ffe, 0x7fff,
};
signed short sins(unsigned short x)
signed int sins(unsigned int x)
{
signed short val;
signed int val;
x >>= 4;
if (x & 0x400) {
val = sintable[0x3ff - (x & 0x3ff)];
} else {
val = sintable[x & 0x3ff];
}
x >>= 3;
if (x & 0x800) {
val = sintable[(0x7ff - (x & 0x7ff)) >> 1];
} else {
val = sintable[(x & 0x7fe) >> 1];
}
if (x & 0x1000) {
return -val;
} else {
return val;