diff --git a/GL/matrix.c b/GL/matrix.c index ebaeec1..1cb3453 100644 --- a/GL/matrix.c +++ b/GL/matrix.c @@ -32,18 +32,6 @@ static const Matrix4x4 IDENTITY = { GLfloat NEAR_PLANE_DISTANCE = 0.0f; -static inline void upload_matrix(Matrix4x4* m) { - mat_load((matrix_t*) m); -} - -static inline void multiply_matrix(Matrix4x4* m) { - mat_apply((matrix_t*) m); -} - -static inline void download_matrix(Matrix4x4* m) { - mat_store((matrix_t*) m); -} - Matrix4x4* _glGetProjectionMatrix() { return (Matrix4x4*) stack_top(&MATRIX_STACKS[1]); } @@ -64,6 +52,8 @@ void _glInitMatrices() { memcpy4(NORMAL_MATRIX, IDENTITY, sizeof(Matrix4x4)); memcpy4(SCREENVIEW_MATRIX, IDENTITY, sizeof(Matrix4x4)); + const VideoMode* vid_mode = GetVideoMode(); + glDepthRange(0.0f, 1.0f); glViewport(0, 0, vid_mode->width, vid_mode->height); } @@ -143,9 +133,9 @@ void APIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z) { trn[M13] = y; trn[M14] = z; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&trn); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&trn); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); if(MATRIX_MODE == GL_MODELVIEW) { recalculateNormalMatrix(); @@ -165,9 +155,9 @@ void APIENTRY glScalef(GLfloat x, GLfloat y, GLfloat z) { scale[M5] = y; scale[M10] = z; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&scale); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&scale); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); if(MATRIX_MODE == GL_MODELVIEW) { recalculateNormalMatrix(); @@ -208,9 +198,9 @@ void APIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { rotate[M9] = yz * invc - xs; rotate[M10] = (z * z) * invc + c; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&rotate); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&rotate); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); if(MATRIX_MODE == GL_MODELVIEW) { recalculateNormalMatrix(); @@ -268,9 +258,9 @@ void APIENTRY glOrtho(GLfloat left, GLfloat right, OrthoMatrix[M13] = -(top + bottom) / (top - bottom); OrthoMatrix[M14] = -(zfar + znear) / (zfar - znear); - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&OrthoMatrix); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&OrthoMatrix); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); } @@ -282,7 +272,7 @@ void APIENTRY glFrustum(GLfloat left, GLfloat right, /* Frustum Matrix */ static Matrix4x4 FrustumMatrix __attribute__((aligned(32))); - memset(FrustumMatrix, 0, sizeof(float) * 16); + MEMSET(FrustumMatrix, 0, sizeof(float) * 16); const float near2 = 2.0f * znear; const float A = (right + left) / (right - left); @@ -299,9 +289,9 @@ void APIENTRY glFrustum(GLfloat left, GLfloat right, FrustumMatrix[M11] = -1.0f; FrustumMatrix[M14] = D; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&FrustumMatrix); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&FrustumMatrix); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); } @@ -329,9 +319,9 @@ void glMultMatrixf(const GLfloat *m) { TEMP[M14] = m[14]; TEMP[M15] = m[15]; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix((Matrix4x4*) &TEMP); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4((Matrix4x4*) &TEMP); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); if(MATRIX_MODE == GL_MODELVIEW) { recalculateNormalMatrix(); @@ -396,9 +386,9 @@ void glMultTransposeMatrixf(const GLfloat *m) { TEMP[M14] = m[11]; TEMP[M15] = m[15]; - upload_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); - multiply_matrix(&TEMP); - download_matrix(stack_top(MATRIX_STACKS + MATRIX_IDX)); + UploadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); + MultiplyMatrix4x4(&TEMP); + DownloadMatrix4x4(stack_top(MATRIX_STACKS + MATRIX_IDX)); if(MATRIX_MODE == GL_MODELVIEW) { recalculateNormalMatrix(); @@ -407,6 +397,8 @@ void glMultTransposeMatrixf(const GLfloat *m) { /* Set the GL viewport */ void APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { + const VideoMode* vid_mode = GetVideoMode(); + gl_viewport_x1 = x; gl_viewport_y1 = y; gl_viewport_width = width; diff --git a/GL/platform.h b/GL/platform.h index 32e6cf6..374e1eb 100644 --- a/GL/platform.h +++ b/GL/platform.h @@ -3,6 +3,8 @@ #include #include +#define MEMSET(dst, v, size) memset((dst), (v), (size)) + typedef enum GPUAlpha { GPU_ALPHA_DISABLE = 0, GPU_ALPHA_ENABLE = 1 @@ -147,6 +149,13 @@ typedef enum GPUTextureEnv { GPU_TXRENV_MODULATEALPHA = 3 } GPUTextureEnv; +typedef struct VideoMode { + uint16_t width; + uint16_t height; +} VideoMode; + +const VideoMode* GetVideoMode(); + /* Duplication of pvr_poly_cxt_t from KOS so that we can * compile on non-KOS platforms for testing */ diff --git a/GL/platforms/sh4.h b/GL/platforms/sh4.h index 03a589e..ec69673 100644 --- a/GL/platforms/sh4.h +++ b/GL/platforms/sh4.h @@ -9,6 +9,15 @@ #include "../types.h" #include "sh4_math.h" +#define FASTCPY(dst, src, bytes) \ + (bytes % 32 == 0) ? sq_cpy(dst, src, bytes) : memcpy(dst, src, bytes) + +#define FASTCPY4(dst, src, bytes) \ + (bytes % 32 == 0) ? sq_cpy(dst, src, bytes) : memcpy4(dst, src, bytes) + +#define MEMSET4(dst, v, size) memset4((dst), (v), (size)) +#define NORMALIZEVEC3(x, y, z) vec3f_normalize((x), (y), (z)) + inline void CompilePolyHeader(PolyHeader* out, const PolyContext* in) { pvr_poly_compile((pvr_poly_hdr_t*) out, (pvr_poly_cxt_t*) in); } diff --git a/GL/platforms/x86.h b/GL/platforms/x86.h index dba039a..e591877 100644 --- a/GL/platforms/x86.h +++ b/GL/platforms/x86.h @@ -1,14 +1,20 @@ #pragma once #include +#include + #include "../types.h" #define MATH_Fast_Divide(n, d) (n / d) #define MATH_fmac(a, b, c) (a * b + c) -#define MATH_Fast_Sqrt(x) sqrt((x)) -#define MATH_fsrra(x) (1.0f / sqrt((x))) +#define MATH_Fast_Sqrt(x) sqrtf((x)) +#define MATH_fsrra(x) (1.0f / sqrtf((x))) #define MATH_Fast_Invert(x) (1.0f / (x)) +#define FASTCPY(dst, src, bytes) memcpy(dst, src, bytes) +#define FASTCPY4(dst, src, bytes) memcpy(dst, src, bytes) +#define MEMSET4(dst, v, size) memset((dst), (v), (size)) + inline void CompilePolyHeader(PolyHeader* out, const PolyContext* in) { (void) out; (void) in; diff --git a/GL/private.h b/GL/private.h index b18cb26..9553b1a 100644 --- a/GL/private.h +++ b/GL/private.h @@ -18,12 +18,6 @@ extern void* memcpy4 (void *dest, const void *src, size_t count); #define GL_FORCE_INLINE static GL_INLINE_DEBUG #define _GL_UNUSED(x) (void)(x) -#define FASTCPY(dst, src, bytes) \ - (bytes % 32 == 0) ? sq_cpy(dst, src, bytes) : memcpy(dst, src, bytes); - -#define FASTCPY4(dst, src, bytes) \ - (bytes % 32 == 0) ? sq_cpy(dst, src, bytes) : memcpy4(dst, src, bytes); - #define _PACK4(v) ((v * 0xF) / 0xFF) #define PACK_ARGB4444(a,r,g,b) (_PACK4(a) << 12) | (_PACK4(r) << 8) | (_PACK4(g) << 4) | (_PACK4(b)) #define PACK_ARGB8888(a,r,g,b) ( ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF) ) diff --git a/GL/state.c b/GL/state.c index 8edfc38..c95391d 100644 --- a/GL/state.c +++ b/GL/state.c @@ -557,6 +557,9 @@ void APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { PVRTileClipCommand *c = aligned_vector_extend(&_glActivePolyList()->vector, 1); GLint miny, maxx, maxy; + + const VideoMode* vid_mode = GetVideoMode(); + GLsizei gl_scissor_width = MAX( MIN(width, vid_mode->width), 0 ); GLsizei gl_scissor_height = MAX( MIN(height, vid_mode->height), 0 ); diff --git a/GL/texture.c b/GL/texture.c index 6897b66..ae29b81 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -7,6 +7,7 @@ #include #include "config.h" +#include "platform.h" #include "../include/glext.h" #include "../include/glkos.h" @@ -53,7 +54,7 @@ static TexturePalette* _initTexturePalette() { TexturePalette* palette = (TexturePalette*) malloc(sizeof(TexturePalette)); assert(palette); - memset4(palette, 0x0, sizeof(TexturePalette)); + MEMSET4(palette, 0x0, sizeof(TexturePalette)); palette->bank = -1; return palette; } @@ -629,7 +630,7 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, active->data = yalloc_alloc_and_defrag(imageSize); if(data) { - sq_cpy(active->data, data, imageSize); + FASTCPY(active->data, data, imageSize); } }