fix gun handling in enhancement mode
[pcsx_rearmed.git] / plugins / gpu-gles / gpuPrim.c
index 7772dba..2f200eb 100644 (file)
 \r
 #define _IN_PRIMDRAW\r
 \r
-#ifdef _WINDOWS\r
-#include "stdafx.h"\r
-#include "externals.h"\r
-#include "gpu.h"\r
-#include "draw.h"\r
-#include "texture.h"\r
-#else\r
 #include "gpuStdafx.h"\r
 #include "gpuExternals.h"\r
 #include "gpuPlugin.h"\r
@@ -40,8 +33,6 @@
 #include "gpuTexture.h"\r
 #include "gpuPrim.h"\r
 \r
-#endif\r
-\r
 ////////////////////////////////////////////////////////////////////////                                          \r
 // defines\r
 ////////////////////////////////////////////////////////////////////////\r
 // globals\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-//#ifndef _WINDOWS\r
-//EGLSurface surface;\r
-//EGLDisplay display;\r
-//#endif\r
+EGLSurface surface;\r
+EGLDisplay display;\r
+\r
 \r
 BOOL           bDrawTextured;                          // current active drawing states\r
 BOOL           bDrawSmoothShaded;\r
@@ -100,6 +90,19 @@ BOOL          bUseFixes;
 \r
 long          drawX,drawY,drawW,drawH;                 // offscreen drawing checkers\r
 short         sxmin,sxmax,symin,symax;\r
+unsigned int CSVERTEX=0,CSCOLOR=0,CSTEXTURE=0;\r
+\r
+void offsetPSX4(void)\r
+{\r
+ lx0 += PSXDisplay.DrawOffset.x;\r
+ ly0 += PSXDisplay.DrawOffset.y;\r
+ lx1 += PSXDisplay.DrawOffset.x;\r
+ ly1 += PSXDisplay.DrawOffset.y;\r
+ lx2 += PSXDisplay.DrawOffset.x;\r
+ ly2 += PSXDisplay.DrawOffset.y;\r
+ lx3 += PSXDisplay.DrawOffset.x;\r
+ ly3 += PSXDisplay.DrawOffset.y;\r
+}\r
 \r
 ////////////////////////////////////////////////////////////////////////                                          \r
 // Update global TP infos\r
@@ -146,66 +149,6 @@ void UpdateGlobalTP(unsigned short gdata)
 // Some ASM color convertion... Lewpy's special...\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-#ifdef _WINDOWS\r
-#pragma warning  (disable : 4035)\r
-\r
-unsigned long DoubleBGR2RGB (unsigned long BGR)\r
-{\r
-\r
-    __asm\r
-    {\r
-        mov eax, BGR                /* this can hold the G value */\r
-        mov ebx, eax                /* this can hold the R value */\r
-        mov edx, eax                /* this can hold the B value */\r
-        and ebx, 000000ffh          /* mask the R value */\r
-        shl ebx, 1\r
-        test ebx, 00000100h\r
-        jz    RSKIP\r
-        mov ebx, 000000ffh\r
-\r
-RSKIP: \r
-        and eax, 0000ff00h          /* mask the G value */\r
-        shl eax, 1\r
-        test eax, 00010000h\r
-        jz    GSKIP\r
-        mov eax, 0000ff00h\r
-\r
-GSKIP: \r
-        and edx, 00ff0000h          /* mask the B value */\r
-        shl edx, 1\r
-        test edx, 01000000h\r
-        jz    BSKIP\r
-        mov edx, 00ff0000h\r
-        \r
-BSKIP: \r
-        or  eax, ebx                /* add R to G value */\r
-        or  eax, edx                /* add B to RG value */\r
-    }\r
-    /* Result returned in EAX */\r
-}\r
-\r
-unsigned short BGR24to16 (unsigned long BGR)\r
-{\r
-    __asm\r
-    {\r
-        mov eax, BGR                /* this can hold the G value */\r
-        mov ebx, eax                /* this can hold the R value */\r
-        mov edx, eax                /* this can hold the B value */\r
-        shr ebx, 3                  /* move the R value */\r
-        and edx, 00f80000h          /* mask the B value */\r
-        shr edx, 9                  /* move the B value */\r
-        and eax, 00f800h            /* mask the G value */\r
-        shr eax, 6                  /* move the G value */\r
-        and ebx, 0000001fh          /* mask the R value */\r
-        or  eax, ebx                /* add R to G value */\r
-        or  eax, edx                /* add B to RG value */\r
-    }\r
-    /* Result returned in AX */\r
-}\r
-\r
-#pragma warning  (default : 4035)\r
-\r
-#else\r
 \r
 unsigned long DoubleBGR2RGB (unsigned long BGR)\r
 {\r
@@ -228,13 +171,12 @@ unsigned short BGR24to16 (unsigned long BGR)
  return ((BGR>>3)&0x1f)|((BGR&0xf80000)>>9)|((BGR&0xf800)>>6);\r
 }\r
 \r
-#endif\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 // OpenGL primitive drawing commands\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-__inline void PRIMdrawTexturedQuad(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawTexturedQuad(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                    OGLVertex* vertex3, OGLVertex* vertex4) \r
 {\r
 \r
@@ -264,22 +206,23 @@ v[3].xyz.y = fpoint(vertex3->y);
 v[3].xyz.z = fpoint(vertex3->z);\r
 v[3].st.x = fpoint(vertex3->sow);\r
 v[3].st.y = fpoint(vertex3->tow);\r
-\r
-glEnableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glDisableClientState(GL_VERTEX_ARRAY); \r
+if (CSCOLOR==1) glDisableClientState(GL_COLOR_ARRAY);glError();\r
+if (CSTEXTURE==0) glEnableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);glError();\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSTEXTURE=CSVERTEX=1;\r
+CSCOLOR=0;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawTexturedTri(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawTexturedTri(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                   OGLVertex* vertex3) \r
 {\r
 Vertex v[3];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -298,24 +241,25 @@ v[2].xyz.y = fpoint(vertex3->y);
 v[2].xyz.z = fpoint(vertex3->z);\r
 v[2].st.x = fpoint(vertex3->sow);\r
 v[2].st.y = fpoint(vertex3->tow);\r
-\r
-glEnableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glDrawArrays(GL_TRIANGLES, 0, 3);\r
-glDisableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
+if (CSCOLOR==1) glDisableClientState(GL_COLOR_ARRAY);glError();\r
+if (CSTEXTURE==0) glEnableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);glError();\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glDrawArrays(GL_TRIANGLES, 0, 3);glError();\r
+CSTEXTURE=CSVERTEX=1;\r
+CSCOLOR=0;\r
 \r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawTexGouraudTriColor(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawTexGouraudTriColor(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                          OGLVertex* vertex3) \r
 {\r
 \r
 Vertex2 v[3];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -347,26 +291,25 @@ v[2].rgba.g = vertex3->c.col[1];
 v[2].rgba.b = vertex3->c.col[2];\r
 v[2].rgba.a = vertex3->c.col[3];\r
 \r
-glEnableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSTEXTURE==0) glEnableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
 \r
-glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);glError();\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glDrawArrays(GL_TRIANGLES, 0, 3);\r
-glDisableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+glDrawArrays(GL_TRIANGLES, 0, 3);glError();\r
+CSTEXTURE=CSVERTEX=CSCOLOR=1;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawTexGouraudTriColorQuad(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawTexGouraudTriColorQuad(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                              OGLVertex* vertex3, OGLVertex* vertex4) \r
 {\r
 Vertex2 v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -408,25 +351,24 @@ v[3].rgba.g = vertex3->c.col[1];
 v[3].rgba.b = vertex3->c.col[2];\r
 v[3].rgba.a = vertex3->c.col[3];\r
 \r
-glEnableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSTEXTURE==0) glEnableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
 \r
-glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glTexCoordPointer(2, GL_FLOAT, sizeof(v[0]), &v[0].st);glError();\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_TEXTURE_COORD_ARRAY);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSTEXTURE=CSVERTEX=CSCOLOR=1;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawTri(OGLVertex* vertex1, OGLVertex* vertex2, OGLVertex* vertex3) \r
+void PRIMdrawTri(OGLVertex* vertex1, OGLVertex* vertex2, OGLVertex* vertex3)\r
 {\r
 Vec3f v[3];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0) return;\r
 \r
 v[0].x = fpoint(vertex1->x);\r
 v[0].y = fpoint(vertex1->y);\r
@@ -440,18 +382,24 @@ v[2].x = fpoint(vertex3->x);
 v[2].y = fpoint(vertex3->y);\r
 v[2].z = fpoint(vertex3->z);\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);\r
-glDrawArrays(GL_TRIANGLES, 0, 3);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSCOLOR==1) glDisableClientState(GL_COLOR_ARRAY);glError();\r
+\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);glError();\r
+glDrawArrays(GL_TRIANGLES, 0, 3);glError();\r
+CSVERTEX=1;\r
+CSTEXTURE=CSCOLOR=0;\r
+\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawTri2(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawTri2(OGLVertex* vertex1, OGLVertex* vertex2,\r
                            OGLVertex* vertex3, OGLVertex* vertex4) \r
 {\r
 Vec3f v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].x = fpoint(vertex1->x);\r
 v[0].y = fpoint(vertex1->y);\r
@@ -469,18 +417,23 @@ v[3].x = fpoint(vertex4->x);
 v[3].y = fpoint(vertex4->y);\r
 v[3].z = fpoint(vertex4->z);\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);\r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSCOLOR==1) glDisableClientState(GL_COLOR_ARRAY);glError();\r
+\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);glError();\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSVERTEX=1;\r
+CSTEXTURE=CSCOLOR=0;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawGouraudTriColor(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawGouraudTriColor(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                       OGLVertex* vertex3) \r
 {\r
 Vertex2 v[3];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -506,23 +459,25 @@ v[2].rgba.g = vertex3->c.col[1];
 v[2].rgba.b = vertex3->c.col[2];\r
 v[2].rgba.a = vertex3->c.col[3];\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
 \r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glDrawArrays(GL_TRIANGLES, 0, 3);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+glDrawArrays(GL_TRIANGLES, 0, 3);glError();\r
+CSVERTEX=CSCOLOR=1;\r
+CSTEXTURE=0;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawGouraudTri2Color(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawGouraudTri2Color(OGLVertex* vertex1, OGLVertex* vertex2,\r
                                        OGLVertex* vertex3, OGLVertex* vertex4) \r
 {\r
 Vertex2 v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -556,22 +511,24 @@ v[3].rgba.g = vertex4->c.col[1];
 v[3].rgba.b = vertex4->c.col[2];\r
 v[3].rgba.a = vertex4->c.col[3];\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
 \r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSTEXTURE=0;\r
+CSVERTEX=CSCOLOR=1;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
 \r
-__inline void PRIMdrawFlatLine(OGLVertex* vertex1, OGLVertex* vertex2,OGLVertex* vertex3, OGLVertex* vertex4)\r
+void PRIMdrawFlatLine(OGLVertex* vertex1, OGLVertex* vertex2,OGLVertex* vertex3, OGLVertex* vertex4)\r
 {\r
 Vertex2 v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -605,24 +562,27 @@ v[3].rgba.g = vertex1->c.col[1];
 v[3].rgba.b = vertex1->c.col[2];\r
 v[3].rgba.a = vertex1->c.col[3];\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
+\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
 \r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+CSTEXTURE=0;\r
+CSVERTEX=CSCOLOR=1;\r
 \r
 \r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
      \r
-__inline void PRIMdrawGouraudLine(OGLVertex* vertex1, OGLVertex* vertex2,OGLVertex* vertex3, OGLVertex* vertex4)\r
+void PRIMdrawGouraudLine(OGLVertex* vertex1, OGLVertex* vertex2,OGLVertex* vertex3, OGLVertex* vertex4)\r
 {\r
        Vertex2 v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].xyz.x = fpoint(vertex1->x);\r
 v[0].xyz.y = fpoint(vertex1->y);\r
@@ -656,23 +616,25 @@ v[2].rgba.g = vertex4->c.col[1];
 v[2].rgba.b = vertex4->c.col[2];\r
 v[2].rgba.a = vertex4->c.col[3];\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glEnableClientState(GL_COLOR_ARRAY);\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==0) glEnableClientState(GL_COLOR_ARRAY);glError();\r
 \r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);\r
-glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0].xyz);glError();\r
+glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(v[0]), &v[0].rgba);glError();\r
 \r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
-glDisableClientState(GL_COLOR_ARRAY);\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSTEXTURE=0;\r
+CSVERTEX=CSCOLOR=1;\r
 }\r
 \r
 ///////////////////////////////////////////////////////// \r
              \r
-__inline void PRIMdrawQuad(OGLVertex* vertex1, OGLVertex* vertex2, \r
+void PRIMdrawQuad(OGLVertex* vertex1, OGLVertex* vertex2,\r
                            OGLVertex* vertex3, OGLVertex* vertex4) \r
 {\r
 Vec3f v[4];\r
+if (vertex1->x==0&&vertex1->y==0&&vertex2->x==0&&vertex2->y==0&&vertex3->x==0&&vertex3->y==0&&vertex4->x==0&&vertex4->y==0) return;\r
 \r
 v[0].x = fpoint(vertex1->x);\r
 v[0].y = fpoint(vertex1->y);\r
@@ -690,10 +652,15 @@ v[3].x = fpoint(vertex3->x);
 v[3].y = fpoint(vertex3->y);\r
 v[3].z = fpoint(vertex3->z);\r
 \r
-glEnableClientState(GL_VERTEX_ARRAY);\r
-glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);\r
-glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
-glDisableClientState(GL_VERTEX_ARRAY);\r
+if (CSTEXTURE==1) glDisableClientState(GL_TEXTURE_COORD_ARRAY);glError();\r
+if (CSVERTEX==0) glEnableClientState(GL_VERTEX_ARRAY);glError();\r
+if (CSCOLOR==1) glDisableClientState(GL_COLOR_ARRAY);glError();\r
+\r
+glVertexPointer(3, GL_FLOAT, sizeof(v[0]), &v[0]);glError();\r
+glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glError();\r
+CSTEXTURE=0;\r
+CSVERTEX=1;\r
+CSCOLOR=0;\r
 }\r
 \r
 ////////////////////////////////////////////////////////////////////////                                          \r
@@ -732,7 +699,7 @@ void SetSemiTrans(void)
  if(!DrawSemiTrans)                                    // no semi trans at all?\r
   {\r
    if(bBlendEnable)\r
-    {glDisable(GL_BLEND);bBlendEnable=FALSE;}          // -> don't wanna blend\r
+    {glDisable(GL_BLEND);glError();bBlendEnable=FALSE;}// -> don't wanna blend\r
    ubGloAlpha=ubGloColAlpha=255;                       // -> full alpha\r
    return;                                             // -> and bye\r
   }\r
@@ -740,7 +707,7 @@ void SetSemiTrans(void)
  ubGloAlpha=ubGloColAlpha=TransSets[GlobalTextABR].alpha;\r
 \r
  if(!bBlendEnable)\r
-  {glEnable(GL_BLEND);bBlendEnable=TRUE;}              // wanna blend\r
+  {glEnable(GL_BLEND);glError();bBlendEnable=TRUE;}    // wanna blend\r
 \r
  if(TransSets[GlobalTextABR].srcFac!=obm1 || \r
     TransSets[GlobalTextABR].dstFac!=obm2)\r
@@ -749,7 +716,7 @@ void SetSemiTrans(void)
     {\r
      obm1=TransSets[GlobalTextABR].srcFac;\r
      obm2=TransSets[GlobalTextABR].dstFac;\r
-     glBlendFunc(obm1,obm2);                           // set blend func\r
+     glBlendFunc(obm1,obm2); glError();                // set blend func\r
     }\r
    /*else\r
    if(TransSets[GlobalTextABR].dstFac !=GL_ONE_MINUS_SRC_COLOR)\r
@@ -780,7 +747,7 @@ void SetScanTrans(void)                                // blending for scan line
 */\r
  obm1=TransSets[0].srcFac;\r
  obm2=TransSets[0].dstFac;\r
- glBlendFunc(obm1,obm2);                               // set blend func\r
+ glBlendFunc(obm1,obm2); glError();                    // set blend func\r
 }\r
 \r
 void SetScanTexTrans(void)                             // blending for scan mask texture\r
@@ -793,7 +760,7 @@ void SetScanTexTrans(void)                             // blending for scan mask
 */\r
  obm1=TransSets[2].srcFac;\r
  obm2=TransSets[2].dstFac;\r
- glBlendFunc(obm1,obm2);                               // set blend func\r
+ glBlendFunc(obm1,obm2); glError();                    // set blend func\r
 }\r
 \r
 ////////////////////////////////////////////////////////////////////////                                          \r
@@ -873,11 +840,11 @@ void SetSemiTransMulti(int Pass)
   }\r
 \r
  if(!bBlendEnable)\r
-  {glEnable(GL_BLEND);bBlendEnable=TRUE;}              // wanna blend\r
+  {glEnable(GL_BLEND);glError();bBlendEnable=TRUE;}    // wanna blend\r
 \r
  if(bm1!=obm1 || bm2!=obm2)\r
   {\r
-   glBlendFunc(bm1,bm2);                               // set blend func\r
+   glBlendFunc(bm1,bm2); glError();                    // set blend func\r
    obm1=bm1;obm2=bm2;\r
   }\r
 }\r
@@ -886,7 +853,7 @@ void SetSemiTransMulti(int Pass)
 // Set several rendering stuff including blending \r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-__inline void SetZMask3O(void)\r
+void SetZMask3O(void)\r
 {\r
  if(iUseMask && DrawSemiTrans && !iSetMask)\r
   {\r
@@ -895,7 +862,7 @@ __inline void SetZMask3O(void)
   }\r
 }\r
 \r
-__inline void SetZMask3(void)\r
+void SetZMask3(void)\r
 {\r
  if(iUseMask)\r
   {\r
@@ -909,7 +876,7 @@ __inline void SetZMask3(void)
   }\r
 }\r
 \r
-__inline void SetZMask3NT(void)\r
+void SetZMask3NT(void)\r
 {\r
  if(iUseMask)\r
   {\r
@@ -925,7 +892,7 @@ __inline void SetZMask3NT(void)
 \r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-__inline void SetZMask4O(void)\r
+ void SetZMask4O(void)\r
 {\r
  if(iUseMask && DrawSemiTrans && !iSetMask)\r
   {\r
@@ -934,7 +901,7 @@ __inline void SetZMask4O(void)
   }\r
 }\r
 \r
-__inline void SetZMask4(void)\r
+ void SetZMask4(void)\r
 {\r
  if(iUseMask)\r
   {\r
@@ -948,7 +915,7 @@ __inline void SetZMask4(void)
   }\r
 }\r
 \r
-__inline void SetZMask4NT(void)\r
+ void SetZMask4NT(void)\r
 {\r
  if(iUseMask)\r
   {\r
@@ -962,7 +929,7 @@ __inline void SetZMask4NT(void)
   }\r
 }\r
 \r
-__inline void SetZMask4SP(void)\r
+ void SetZMask4SP(void)\r
 {\r
  if(iUseMask)\r
   {\r
@@ -983,7 +950,7 @@ __inline void SetZMask4SP(void)
 \r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-__inline void SetRenderState(unsigned long DrawAttributes)\r
+ void SetRenderState(unsigned long DrawAttributes)\r
 {\r
  bDrawNonShaded = (SHADETEXBIT(DrawAttributes)) ? TRUE : FALSE;\r
  DrawSemiTrans = (SEMITRANSBIT(DrawAttributes)) ? TRUE : FALSE;\r
@@ -991,7 +958,7 @@ __inline void SetRenderState(unsigned long DrawAttributes)
 \r
 ////////////////////////////////////////////////////////////////////////                                          \r
 \r
-__inline void SetRenderColor(unsigned long DrawAttributes)\r
+ void SetRenderColor(unsigned long DrawAttributes)\r
 {\r
  if(bDrawNonShaded) {g_m1=g_m2=g_m3=128;}\r
  else\r
@@ -1018,14 +985,14 @@ void SetRenderMode(unsigned long DrawAttributes,BOOL bSCol)
    else                 currTex=SelectSubTextureS(GlobalTextTP,ulClutID);\r
 \r
    if(gTexName!=currTex)\r
-    {gTexName=currTex;glBindTexture(GL_TEXTURE_2D,currTex);}\r
+    {gTexName=currTex;glBindTexture(GL_TEXTURE_2D,currTex); glError();}\r
 \r
    if(!bTexEnabled)                                    // -> turn texturing on\r
-    {bTexEnabled=TRUE;glEnable(GL_TEXTURE_2D);}\r
+    {bTexEnabled=TRUE;glEnable(GL_TEXTURE_2D); glError();}\r
   }\r
  else                                                  // no texture ?\r
  if(bTexEnabled) \r
-  {bTexEnabled=FALSE;glDisable(GL_TEXTURE_2D);}        // -> turn texturing off\r
+  {bTexEnabled=FALSE;glDisable(GL_TEXTURE_2D); glError();} // -> turn texturing off\r
 \r
  if(bSCol)                                             // also set color ?\r
   {\r
@@ -1051,6 +1018,7 @@ void SetRenderMode(unsigned long DrawAttributes,BOOL bSCol)
   {\r
    if(bDrawSmoothShaded) glShadeModel(GL_SMOOTH);      // -> set actual shading\r
    else                  glShadeModel(GL_FLAT);\r
+   glError();\r
    bOldSmoothShaded=bDrawSmoothShaded;\r
   }\r
 }\r
@@ -1523,14 +1491,14 @@ void UploadScreenEx(long Position)
  if(!PSXDisplay.DisplayMode.x) return;\r
  if(!PSXDisplay.DisplayMode.y) return;\r
 \r
- glDisable(GL_SCISSOR_TEST);\r
- glShadeModel(GL_FLAT);\r
+ glDisable(GL_SCISSOR_TEST); glError();\r
+ glShadeModel(GL_FLAT); glError();\r
  bOldSmoothShaded=FALSE;\r
- glDisable(GL_BLEND);\r
+ glDisable(GL_BLEND); glError();\r
  bBlendEnable=FALSE;\r
- glDisable(GL_TEXTURE_2D);\r
+ glDisable(GL_TEXTURE_2D); glError();\r
  bTexEnabled=FALSE;\r
- glDisable(GL_ALPHA_TEST);\r
+ glDisable(GL_ALPHA_TEST); glError();\r
 \r
  //glPixelZoom(((float)rRatioRect.right)/((float)PSXDisplay.DisplayMode.x),\r
  //            -1.0f*(((float)rRatioRect.bottom)/((float)PSXDisplay.DisplayMode.y)));\r
@@ -1594,8 +1562,8 @@ void UploadScreenEx(long Position)
 \r
 // glPixelZoom(1.0F,1.0F);\r
 \r
- glEnable(GL_ALPHA_TEST);\r
- glEnable(GL_SCISSOR_TEST);\r
+ glEnable(GL_ALPHA_TEST); glError();\r
+ glEnable(GL_SCISSOR_TEST); glError();\r
 }\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
@@ -1763,13 +1731,13 @@ void cmdSTP(unsigned char * baseAddr)
    bCheckMask=TRUE;\r
    if(iDepthFunc==0) return;\r
    iDepthFunc=0;\r
-   glDepthFunc(GL_LESS);\r
+   glDepthFunc(GL_LESS); glError();\r
   }\r
  else\r
   {\r
    bCheckMask=FALSE;\r
    if(iDepthFunc==1) return;\r
-   glDepthFunc(GL_ALWAYS);\r
+   glDepthFunc(GL_ALWAYS); glError();\r
    iDepthFunc=1;\r
   }\r
 }\r
@@ -2316,9 +2284,9 @@ void primBlkFill(unsigned char * baseAddr)
      b=((GLclampf)BLUE(gpuData[0]))/255.0f;\r
      r=((GLclampf)RED(gpuData[0]))/255.0f;\r
      \r
-     glDisable(GL_SCISSOR_TEST);                       \r
-     glClearColor(r,g,b,1.0f);\r
-     glClear(uiBufferBits); \r
+     //glDisable(GL_SCISSOR_TEST); glError();\r
+     glClearColor(r,g,b,1.0f); glError();\r
+     glClear(uiBufferBits); glError();\r
      gl_z=0.0f;\r
 \r
      if(gpuData[0]!=0x02000000 &&\r
@@ -2349,7 +2317,7 @@ void primBlkFill(unsigned char * baseAddr)
         }\r
       }\r
 \r
-     glEnable(GL_SCISSOR_TEST);                       \r
+     //glEnable(GL_SCISSOR_TEST); glError();\r
     }\r
    else\r
     {\r
@@ -2359,9 +2327,9 @@ void primBlkFill(unsigned char * baseAddr)
      SetRenderMode((unsigned long)0x01000000, FALSE);\r
      vertex[0].c.lcol=gpuData[0]|0xff000000;\r
      SETCOL(vertex[0]); \r
-     glDisable(GL_SCISSOR_TEST);                       \r
+     //glDisable(GL_SCISSOR_TEST); glError();\r
      PRIMdrawQuad(&vertex[0], &vertex[1], &vertex[2], &vertex[3]);\r
-     glEnable(GL_SCISSOR_TEST);                       \r
+     //glEnable(GL_SCISSOR_TEST); glError();\r
     }\r
   }\r
 \r