Slightly optimise matrix code to a single pointer lookup

This commit is contained in:
UnknownShadow200 2025-02-22 08:17:56 +11:00
parent 5e2ea81593
commit 9ca7c002be
3 changed files with 12 additions and 15 deletions

View File

@ -19,7 +19,7 @@ static Matrix4x4 __attribute__((aligned(32))) VIEWPORT_MATRIX;
static Matrix4x4 __attribute__((aligned(32))) PROJECTION_MATRIX; static Matrix4x4 __attribute__((aligned(32))) PROJECTION_MATRIX;
static GLenum MATRIX_MODE = GL_MODELVIEW; static GLenum MATRIX_MODE = GL_MODELVIEW;
static GLubyte MATRIX_IDX = 0; static Stack* MATRIX_CUR;
static GLboolean NORMAL_DIRTY, PROJECTION_DIRTY; static GLboolean NORMAL_DIRTY, PROJECTION_DIRTY;
static const Matrix4x4 __attribute__((aligned(32))) IDENTITY = { static const Matrix4x4 __attribute__((aligned(32))) IDENTITY = {
@ -54,6 +54,8 @@ void _glInitMatrices() {
MEMCPY4(NORMAL_MATRIX, IDENTITY, sizeof(Matrix4x4)); MEMCPY4(NORMAL_MATRIX, IDENTITY, sizeof(Matrix4x4));
MATRIX_CUR = MATRIX_STACKS + (GL_MODELVIEW & 0xF);
const VideoMode* vid_mode = GetVideoMode(); const VideoMode* vid_mode = GetVideoMode();
glDepthRange(0.0f, 1.0f); glDepthRange(0.0f, 1.0f);
@ -121,30 +123,30 @@ static void OnMatrixChanged() {
void APIENTRY glMatrixMode(GLenum mode) { void APIENTRY glMatrixMode(GLenum mode) {
MATRIX_MODE = mode; MATRIX_MODE = mode;
MATRIX_IDX = mode & 0xF; MATRIX_CUR = MATRIX_STACKS + (mode & 0xF);
} }
void APIENTRY glPushMatrix() { void APIENTRY glPushMatrix() {
void* top = stack_top(MATRIX_STACKS + MATRIX_IDX); void* top = stack_top(MATRIX_CUR);
assert(top); assert(top);
void* ret = stack_push(MATRIX_STACKS + MATRIX_IDX, top); void* ret = stack_push(MATRIX_CUR, top);
(void) ret; (void) ret;
assert(ret); assert(ret);
OnMatrixChanged(); OnMatrixChanged();
} }
void APIENTRY glPopMatrix() { void APIENTRY glPopMatrix() {
stack_pop(MATRIX_STACKS + MATRIX_IDX); stack_pop(MATRIX_CUR);
OnMatrixChanged(); OnMatrixChanged();
} }
void APIENTRY glLoadIdentity() { void APIENTRY glLoadIdentity() {
stack_replace(MATRIX_STACKS + MATRIX_IDX, IDENTITY); stack_replace(MATRIX_CUR, IDENTITY);
OnMatrixChanged(); OnMatrixChanged();
} }
void GL_FORCE_INLINE _glMultMatrix(const Matrix4x4* mat) { void GL_FORCE_INLINE _glMultMatrix(const Matrix4x4* mat) {
void* top = stack_top(MATRIX_STACKS + MATRIX_IDX); void* top = stack_top(MATRIX_CUR);
UploadMatrix4x4(top); UploadMatrix4x4(top);
MultiplyMatrix4x4(mat); MultiplyMatrix4x4(mat);
@ -220,7 +222,7 @@ void APIENTRY glLoadMatrixf(const GLfloat *m) {
static Matrix4x4 __attribute__((aligned(32))) TEMP; static Matrix4x4 __attribute__((aligned(32))) TEMP;
memcpy(TEMP, m, sizeof(float) * 16); memcpy(TEMP, m, sizeof(float) * 16);
stack_replace(MATRIX_STACKS + MATRIX_IDX, TEMP); stack_replace(MATRIX_CUR, TEMP);
OnMatrixChanged(); OnMatrixChanged();
} }
@ -309,7 +311,7 @@ void glLoadTransposeMatrixf(const GLfloat *m) {
TEMP[M14] = m[11]; TEMP[M14] = m[11];
TEMP[M15] = m[15]; TEMP[M15] = m[15];
stack_replace(MATRIX_STACKS + MATRIX_IDX, TEMP); stack_replace(MATRIX_CUR, TEMP);
OnMatrixChanged(); OnMatrixChanged();
} }

View File

@ -485,12 +485,6 @@ void _glGPUStateMarkDirty();
#define SCENE_AMBIENT_MASK 16 #define SCENE_AMBIENT_MASK 16
#define TNL_EFFECT_NONE 0x00
#define TNL_EFFECT_VIEW_SPACE 0x01
typedef void (*TnlEffect)(SubmissionTarget* target);
void _glTnlAddEffect(GLint flags, TnlEffect func);
void _glTnlRemoveEffect(TnlEffect func);
void _glTnlLoadMatrix(void); void _glTnlLoadMatrix(void);
void _glTnlApplyEffects(SubmissionTarget* target); void _glTnlApplyEffects(SubmissionTarget* target);

View File

@ -978,6 +978,7 @@ void APIENTRY glGetFloatv(GLenum pname, GLfloat* params) {
case GL_MODELVIEW_MATRIX: case GL_MODELVIEW_MATRIX:
MEMCPY4(params, _glGetModelViewMatrix(), sizeof(float) * 16); MEMCPY4(params, _glGetModelViewMatrix(), sizeof(float) * 16);
break; break;
case GL_POLYGON_OFFSET_FACTOR: case GL_POLYGON_OFFSET_FACTOR:
*params = GPUState.offset_factor; *params = GPUState.offset_factor;
break; break;