cvar_t gl_mesh_testarrayelement = {0, "gl_mesh_testarrayelement", "0", "use glBegin(GL_TRIANGLES);glArrayElement();glEnd(); primitives instead of glDrawElements (useful to test for driver bugs with glDrawElements)"};
cvar_t gl_mesh_testmanualfeeding = {0, "gl_mesh_testmanualfeeding", "0", "use glBegin(GL_TRIANGLES);glTexCoord2f();glVertex3f();glEnd(); primitives instead of glDrawElements (useful to test for driver bugs with glDrawElements)"};
cvar_t gl_mesh_prefer_short_elements = {0, "gl_mesh_prefer_short_elements", "1", "use GL_UNSIGNED_SHORT element arrays instead of GL_UNSIGNED_INT"};
-cvar_t gl_workaround_mac_texmatrix = {0, "gl_workaround_mac_texmatrix", "0", "if set to 1 this uses glLoadMatrixd followed by glLoadIdentity to clear a texture matrix (normally glLoadIdentity is sufficient by itself), if set to 2 it uses glLoadMatrixd without glLoadIdentity"};
cvar_t gl_paranoid = {0, "gl_paranoid", "0", "enables OpenGL error checking and other tests"};
cvar_t gl_printcheckerror = {0, "gl_printcheckerror", "0", "prints all OpenGL error checks, useful to identify location of driver crashes"};
cvar_t gl_dither = {CVAR_SAVE, "gl_dither", "1", "enables OpenGL dithering (16bit looks bad with this off)"};
cvar_t gl_lockarrays = {0, "gl_lockarrays", "0", "enables use of glLockArraysEXT, may cause glitches with some broken drivers, and may be slower than normal"};
cvar_t gl_lockarrays_minimumvertices = {0, "gl_lockarrays_minimumvertices", "1", "minimum number of vertices required for use of glLockArraysEXT, setting this too low may reduce performance"};
-cvar_t gl_vbo = {CVAR_SAVE, "gl_vbo", "1", "make use of GL_ARB_vertex_buffer_object extension to store static geometry in video memory for faster rendering"};
+cvar_t gl_vbo = {CVAR_SAVE, "gl_vbo", "3", "make use of GL_ARB_vertex_buffer_object extension to store static geometry in video memory for faster rendering, 0 disables VBO allocation or use, 1 enables VBOs for vertex and triangle data, 2 only for vertex data, 3 for vertex data and triangle data of simple meshes (ones with only one surface)"};
cvar_t v_flipped = {0, "v_flipped", "0", "mirror the screen (poor man's left handed mode)"};
qboolean v_flipped_state = false;
Cvar_RegisterVariable(&gl_vbo);
Cvar_RegisterVariable(&gl_paranoid);
Cvar_RegisterVariable(&gl_printcheckerror);
- Cvar_RegisterVariable(&gl_workaround_mac_texmatrix);
#ifdef NORENDER
Cvar_SetValue("r_render", 0);
#endif
int alphatest;
int scissortest;
unsigned int unit;
+ unsigned int clientunit;
gltextureunit_t units[MAX_TEXTUREUNITS];
float color4f[4];
int lockrange_first;
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;
for (i = 0;i < backendarrayunits;i++)
{
- GL_ActiveTexture(i);
+ GL_ClientActiveTexture(i);
GL_BindVBO(0);
qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), NULL);CHECKGLERROR
qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
{
CHECKGLERROR
qglActiveTexture(GL_TEXTURE0_ARB + gl_state.unit);
- qglClientActiveTexture(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);
CHECKGLERROR
}
}
unsigned int numelements = numtriangles * 3;
if (numvertices < 3 || numtriangles < 1)
{
- Con_Printf("R_Mesh_Draw(%d, %d, %d, %d, %8p, %8p, %i, %i);\n", firstvertex, numvertices, firsttriangle, numtriangles, element3i, element3s, bufferobject3i, bufferobject3s);
+ if (numvertices < 0 || numtriangles < 0 || developer.integer >= 100)
+ Con_Printf("R_Mesh_Draw(%d, %d, %d, %d, %8p, %8p, %i, %i);\n", firstvertex, numvertices, firsttriangle, numtriangles, element3i, element3s, bufferobject3i, bufferobject3s);
return;
}
if (!gl_mesh_prefer_short_elements.integer)
{
if (gl_state.units[i].arrayenabled)
{
- GL_ActiveTexture(i);
+ GL_ClientActiveTexture(i);
if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
CHECKGLERROR
}
qglBufferDataARB(target, size, data, GL_STATIC_DRAW_ARB);
- info = Mem_ExpandableArray_AllocRecord(&gl_bufferobjectinfoarray);
+ info = (gl_bufferobjectinfo_t *) Mem_ExpandableArray_AllocRecord(&gl_bufferobjectinfoarray);
memset(info, 0, sizeof(*info));
info->target = target;
info->object = bufferobject;
endindex = Mem_ExpandableArray_IndexRange(&gl_bufferobjectinfoarray);
for (i = 0;i < endindex;i++)
{
- info = Mem_ExpandableArray_RecordAtIndex(&gl_bufferobjectinfoarray, i);
+ info = (gl_bufferobjectinfo_t *) Mem_ExpandableArray_RecordAtIndex(&gl_bufferobjectinfoarray, i);
if (!info)
continue;
if (info->object == bufferobject)
endindex = Mem_ExpandableArray_IndexRange(&gl_bufferobjectinfoarray);
for (i = 0;i < endindex;i++)
{
- info = Mem_ExpandableArray_RecordAtIndex(&gl_bufferobjectinfoarray, i);
+ info = (gl_bufferobjectinfo_t *) Mem_ExpandableArray_RecordAtIndex(&gl_bufferobjectinfoarray, i);
if (!info)
continue;
switch(info->target)
if (!unit->arrayenabled)
{
unit->arrayenabled = true;
- GL_ActiveTexture(unitnum);
+ GL_ClientActiveTexture(unitnum);
qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
}
// texcoord array
unit->pointer_texcoord_buffer = bufferobject;
unit->pointer_texcoord_offset = bufferoffset;
unit->arraycomponents = numcomponents;
- GL_ActiveTexture(unitnum);
+ GL_ClientActiveTexture(unitnum);
GL_BindVBO(bufferobject);
qglTexCoordPointer(unit->arraycomponents, GL_FLOAT, sizeof(float) * unit->arraycomponents, bufferobject ? (void *)bufferoffset : texcoord);CHECKGLERROR
}
if (unit->arrayenabled)
{
unit->arrayenabled = false;
- GL_ActiveTexture(unitnum);
+ GL_ClientActiveTexture(unitnum);
qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
}
}
Matrix4x4_ToArrayDoubleGL(&unit->matrix, glmatrix);
GL_ActiveTexture(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
}
GL_ActiveTexture(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 & 1)
- qglLoadIdentity();CHECKGLERROR
- }
qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
}
}
if (unit->arrayenabled)
{
unit->arrayenabled = false;
- GL_ActiveTexture(unitnum);
+ GL_ClientActiveTexture(unitnum);
qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
}
}
unit->texmatrixenabled = false;
unit->matrix = identitymatrix;
CHECKGLERROR
- qglMatrixMode(GL_TEXTURE);CHECKGLERROR
GL_ActiveTexture(unitnum);
+ qglMatrixMode(GL_TEXTURE);CHECKGLERROR
qglLoadIdentity();CHECKGLERROR
qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
}