From ba211c3a501e5f81b80b10de287e272410de2b9d Mon Sep 17 00:00:00 2001 From: Hayden K <819028+mrneo240@users.noreply.github.com> Date: Sun, 10 Mar 2019 21:02:24 -0400 Subject: [PATCH] General merge and repair - Fix defines - Fix POLYGON logic - change static func names to macro - Fix checkEnum --- GL/draw.c | 14 +++++++------- GL/error.c | 1 + GL/framebuffer.c | 2 +- GL/state.c | 8 ++++---- GL/texture.c | 31 +++++++++++++++++++++++++++++-- include/gl.h | 10 +++++----- 6 files changed, 47 insertions(+), 19 deletions(-) diff --git a/GL/draw.c b/GL/draw.c index 3b9cceb..a2749dc 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -757,6 +757,7 @@ static void genArraysTriangleStrip( } #define MAX_POLYGON_SIZE 32 +static ClipVertex buffer[MAX_POLYGON_SIZE]; static void genArraysTriangleFan( ClipVertex* output, @@ -769,8 +770,7 @@ static void genArraysTriangleFan( GLboolean doTexture, GLboolean doMultitexture, GLboolean doLighting) { assert(count < MAX_POLYGON_SIZE); - static ClipVertex buffer[MAX_POLYGON_SIZE]; - + genArraysCommon( output, count, vptr, vstride, cptr, cstride, uvptr, uvstride, stptr, ststride, nptr, nstride, @@ -793,8 +793,8 @@ static void genArraysTriangleFan( for(; i < count; ++i) { output[target++] = *first; - output[target++] = buffer[i]; - output[target] = buffer[i - 1]; + output[target++] = buffer[i - 1]; + output[target] = buffer[i]; output[target++].flags = PVR_CMD_VERTEX_EOL; } } @@ -1280,7 +1280,7 @@ void APIENTRY glEnableClientState(GLenum cap) { (ENABLED_VERTEX_ATTRIBUTES |= UV_ENABLED_FLAG); break; default: - _glKosThrowError(GL_INVALID_ENUM, "glEnableClientState"); + _glKosThrowError(GL_INVALID_ENUM, __func__); } } @@ -1303,7 +1303,7 @@ void APIENTRY glDisableClientState(GLenum cap) { (ENABLED_VERTEX_ATTRIBUTES &= ~UV_ENABLED_FLAG); break; default: - _glKosThrowError(GL_INVALID_ENUM, "glDisableClientState"); + _glKosThrowError(GL_INVALID_ENUM, __func__); } } @@ -1315,7 +1315,7 @@ void APIENTRY glClientActiveTextureARB(GLenum texture) { TRACE(); if(texture < GL_TEXTURE0_ARB || texture > GL_TEXTURE0_ARB + MAX_TEXTURE_UNITS) { - _glKosThrowError(GL_INVALID_ENUM, "glClientActiveTextureARB"); + _glKosThrowError(GL_INVALID_ENUM, __func__); } if(_glKosHasError()) { diff --git a/GL/error.c b/GL/error.c index 459fa29..d4b73c4 100644 --- a/GL/error.c +++ b/GL/error.c @@ -57,6 +57,7 @@ void _glKosPrintError() { } fprintf(stderr, "GL ERROR: %s when calling %s\n", _glErrorEnumAsString(last_error), error_function); + _glKosResetError(); } GLenum glGetError(void) { diff --git a/GL/framebuffer.c b/GL/framebuffer.c index 6b5e67e..c83edba 100644 --- a/GL/framebuffer.c +++ b/GL/framebuffer.c @@ -186,7 +186,7 @@ GLboolean _glCalculateAverageTexel(const GLubyte* src, const GLuint srcWidth, co *d1 = (r << 11 | g << 5 | b); } else { fprintf(stderr, "ERROR: Unsupported PVR format for mipmap generation"); - _glKosThrowError(GL_INVALID_OPERATION, "glGenerateMipmapEXT"); + _glKosThrowError(GL_INVALID_OPERATION, __func__); _glKosPrintError(); return GL_FALSE; } diff --git a/GL/state.c b/GL/state.c index 12d2cc5..0cab0d8 100644 --- a/GL/state.c +++ b/GL/state.c @@ -134,7 +134,7 @@ static void _updatePVRBlend(pvr_poly_cxt_t* context) { GLboolean _glCheckValidEnum(GLint param, GLenum* values, const char* func) { GLubyte found = 0; while(*values != 0) { - if(*values == param) { + if(*values == (GLenum)param) { found++; break; } @@ -225,7 +225,7 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { if(tx1->isPaletted) { if(_glIsSharedTexturePaletteEnabled()) { TexturePalette* palette = _glGetSharedPalette(tx1->shared_bank); - context->txr.format |= PVR_TXRFMT_8BPP_PAL((palette) ? 0 : palette->bank); + context->txr.format |= PVR_TXRFMT_8BPP_PAL((palette) ? 0 : palette->bank); } else { context->txr.format |= PVR_TXRFMT_8BPP_PAL((tx1->palette) ? tx1->palette->bank : 0); } @@ -614,7 +614,7 @@ void APIENTRY glGetFloatv(GLenum pname, GLfloat* params) { memcpy(params, _glGetModelViewMatrix(), sizeof(float) * 16); break; default: - _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv"); + _glKosThrowError(GL_INVALID_ENUM, __func__); _glKosPrintError(); break; } @@ -656,7 +656,7 @@ void APIENTRY glGetIntegerv(GLenum pname, GLint *params) { } } break; default: - _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv"); + _glKosThrowError(GL_INVALID_ENUM, __func__); _glKosPrintError(); break; } diff --git a/GL/texture.c b/GL/texture.c index eda9642..6de433a 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -31,6 +31,7 @@ static GLboolean SUBBANKS_USED[4][16]; // 4 counts of the used 16 colour banks w static TexturePalette* _initTexturePalette() { TexturePalette* palette = (TexturePalette*) malloc(sizeof(TexturePalette)); assert(palette); + memset(palette, 0x0, sizeof(TexturePalette)); palette->data = NULL; palette->format = 0; @@ -366,7 +367,7 @@ void APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param) { } } -void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param) { +void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLint param) { glTexEnvi(target, pname, param); } @@ -929,7 +930,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, assert(bytes); if(needsTwiddling) { - assert(type == GL_UNSIGNED_BYTE); // Anything else needs this loop adjusting + /*assert(type == GL_UNSIGNED_BYTE); // Anything else needs this loop adjusting GLuint x, y; for(y = 0; y < height; ++y) { for(x = 0; x < width; ++x) { @@ -939,7 +940,33 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, targetData[dest] = ((GLubyte*) data)[src]; } } + */ + /* Don't convert color indexes */ + /* Linear/iterative twiddling algorithm from Marcus' tatest */ + #define TWIDTAB(x) ( (x&1)|((x&2)<<1)|((x&4)<<2)|((x&8)<<3)|((x&16)<<4)| \ + ((x&32)<<5)|((x&64)<<6)|((x&128)<<7)|((x&256)<<8)|((x&512)<<9) ) + #define TWIDOUT(x, y) ( TWIDTAB((y)) | (TWIDTAB((x)) << 1) ) + #define MIN(a, b) ( (a)<(b)? (a):(b) ) + + uint32 x, y, min, mask; + + min = MIN(w, h); + mask = min - 1; + + uint8 * pixels; + uint16 * vtex; + pixels = (uint8 *) data; + vtex = (uint16*)targetData; + + for(y = 0; y < h; y += 2) { + for(x = 0; x < w; x++) { + vtex[TWIDOUT((y & mask) / 2, x & mask) + + (x / min + y / min)*min * min / 2] = + pixels[y * w + x] | (pixels[(y + 1) * w + x] << 8); + } + } + data = NULL; } else { /* No conversion? Just copy the data, and the pvr_format is correct */ sq_cpy(targetData, data, bytes); diff --git a/include/gl.h b/include/gl.h index 6a3bb5e..5872240 100644 --- a/include/gl.h +++ b/include/gl.h @@ -112,10 +112,10 @@ __BEGIN_DECLS /* Texture Environment */ #define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_REPLACE 0x0 -#define GL_MODULATE 0x1 -#define GL_DECAL 0x2 -#define GL_MODULATEALPHA 0x3 +#define GL_REPLACE 0x1E01 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 + /* TextureMagFilter */ #define GL_NEAREST 0x2600 @@ -493,7 +493,7 @@ GLAPI void APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor); /* Texturing */ GLAPI void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLint param); GLAPI GLboolean APIENTRY glIsTexture(GLuint texture); GLAPI void APIENTRY glGenTextures(GLsizei n, GLuint *textures);