From ba6a3d3c2759a59480bd2db8a16b2754fa038785 Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 3 May 2008 11:05:32 +0000 Subject: [PATCH] further attempt at workaround for Mac texmatrix bug, gl_workaround_mac_texmatrix now has values in the range 0 to 7 with different behaviors to try eliminated GL_ClientActiveTexture function, now client active texture always matches server active texture (in hopes of fixing Mac bug) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8271 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_backend.c | 45 ++++++++++++++++----------------------------- gl_backend.h | 1 - 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/gl_backend.c b/gl_backend.c index d8b1302b..de7c0c25 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -526,7 +526,6 @@ static struct gl_state_s int alphatest; int scissortest; unsigned int unit; - unsigned int clientunit; gltextureunit_t units[MAX_TEXTUREUNITS]; float color4f[4]; int lockrange_first; @@ -571,7 +570,6 @@ void GL_SetupTextureState(void) gltextureunit_t *unit; CHECKGLERROR gl_state.unit = MAX_TEXTUREUNITS; - gl_state.clientunit = MAX_TEXTUREUNITS; for (i = 0;i < MAX_TEXTUREUNITS;i++) { unit = gl_state.units + i; @@ -609,7 +607,7 @@ void GL_SetupTextureState(void) for (i = 0;i < backendarrayunits;i++) { - GL_ClientActiveTexture(i); + GL_ActiveTexture(i); GL_BindVBO(0); qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), NULL);CHECKGLERROR qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR @@ -719,20 +717,7 @@ void GL_ActiveTexture(unsigned int num) { CHECKGLERROR qglActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); - CHECKGLERROR - } - } -} - -void GL_ClientActiveTexture(unsigned int num) -{ - if (gl_state.clientunit != num) - { - gl_state.clientunit = num; - if (qglActiveTexture) - { - CHECKGLERROR - qglClientActiveTexture(GL_TEXTURE0_ARB + gl_state.clientunit); + qglClientActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); CHECKGLERROR } } @@ -1151,7 +1136,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri { if (gl_state.units[i].arrayenabled) { - GL_ClientActiveTexture(i); + GL_ActiveTexture(i); if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY)) Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n"); CHECKGLERROR @@ -1544,7 +1529,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co if (!unit->arrayenabled) { unit->arrayenabled = true; - GL_ClientActiveTexture(unitnum); + GL_ActiveTexture(unitnum); qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } // texcoord array @@ -1554,7 +1539,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co unit->pointer_texcoord_buffer = bufferobject; unit->pointer_texcoord_offset = bufferoffset; unit->arraycomponents = numcomponents; - GL_ClientActiveTexture(unitnum); + GL_ActiveTexture(unitnum); GL_BindVBO(bufferobject); qglTexCoordPointer(unit->arraycomponents, GL_FLOAT, sizeof(float) * unit->arraycomponents, bufferobject ? (void *)bufferoffset : texcoord);CHECKGLERROR } @@ -1565,7 +1550,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co if (unit->arrayenabled) { unit->arrayenabled = false; - GL_ClientActiveTexture(unitnum); + GL_ActiveTexture(unitnum); qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } } @@ -1982,8 +1967,12 @@ void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix) CHECKGLERROR Matrix4x4_ToArrayDoubleGL(&unit->matrix, glmatrix); GL_ActiveTexture(unitnum); - GL_ClientActiveTexture(unitnum); qglMatrixMode(GL_TEXTURE);CHECKGLERROR + if (gl_workaround_mac_texmatrix.integer & 4) + { + qglActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); + qglClientActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); + } qglLoadMatrixd(glmatrix);CHECKGLERROR qglMatrixMode(GL_MODELVIEW);CHECKGLERROR } @@ -1997,18 +1986,16 @@ void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix) unit->matrix = identitymatrix; CHECKGLERROR GL_ActiveTexture(unitnum); - GL_ClientActiveTexture(unitnum); qglMatrixMode(GL_TEXTURE);CHECKGLERROR + qglLoadIdentity();CHECKGLERROR if (gl_workaround_mac_texmatrix.integer) { + qglActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); + qglClientActiveTexture(GL_TEXTURE0_ARB + gl_state.unit); qglLoadMatrixd(gl_identitymatrix);CHECKGLERROR - if (gl_workaround_mac_texmatrix.integer == 2) + if (gl_workaround_mac_texmatrix.integer & 1) qglLoadIdentity();CHECKGLERROR } - else - { - qglLoadIdentity();CHECKGLERROR - } qglMatrixMode(GL_MODELVIEW);CHECKGLERROR } } @@ -2166,7 +2153,7 @@ void R_Mesh_ResetTextureState(void) if (unit->arrayenabled) { unit->arrayenabled = false; - GL_ClientActiveTexture(unitnum); + GL_ActiveTexture(unitnum); qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR } } diff --git a/gl_backend.h b/gl_backend.h index 5ecff60f..df9ff65b 100644 --- a/gl_backend.h +++ b/gl_backend.h @@ -28,7 +28,6 @@ void GL_Color(float cr, float cg, float cb, float ca); void GL_TransformToScreen(const vec4_t in, vec4_t out); void GL_LockArrays(int first, int count); void GL_ActiveTexture(unsigned int num); -void GL_ClientActiveTexture(unsigned int num); void GL_Scissor(int x, int y, int width, int height); void GL_ScissorTest(int state); void GL_Clear(int mask); -- 2.39.2