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);