]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
fix glDrawRangeElements issue with mesa
[xonotic/darkplaces.git] / gl_backend.c
index 750a9c187a4543013d1df26a408b8b70ae5babbf..c0907b3663fa36749d8a9b25d9122106221d5d40 100644 (file)
@@ -6,7 +6,6 @@ cvar_t gl_mesh_drawrangeelements = {0, "gl_mesh_drawrangeelements", "1", "use gl
 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 always calls glClientActiveTexture when calling glActiveTexture, to work around mistargeted texture matrix updates on Mac OSX drivers"};
 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"};
 
@@ -16,7 +15,7 @@ cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1", "tints view while underwa
 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;
@@ -256,7 +255,6 @@ void gl_backend_init(void)
        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
@@ -609,8 +607,6 @@ void GL_SetupTextureState(void)
 
        for (i = 0;i < backendarrayunits;i++)
        {
-               if (gl_workaround_mac_texmatrix.integer)
-                       GL_ActiveTexture(i);
                GL_ClientActiveTexture(i);
                GL_BindVBO(0);
                qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), NULL);CHECKGLERROR
@@ -620,8 +616,6 @@ void GL_SetupTextureState(void)
        for (i = 0;i < backendunits;i++)
        {
                GL_ActiveTexture(i);
-               if (gl_workaround_mac_texmatrix.integer)
-                       GL_ClientActiveTexture(i);
                qglDisable(GL_TEXTURE_1D);CHECKGLERROR
                qglDisable(GL_TEXTURE_2D);CHECKGLERROR
                if (gl_texture3d)
@@ -726,8 +720,6 @@ void GL_ActiveTexture(unsigned int num)
                        CHECKGLERROR
                }
        }
-       if (gl_workaround_mac_texmatrix.integer)
-               GL_ClientActiveTexture(num);
 }
 
 void GL_ClientActiveTexture(unsigned int num)
@@ -1098,7 +1090,8 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
        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, (void *)element3i, (void *)element3s, bufferobject3i, bufferobject3s);
                return;
        }
        if (!gl_mesh_prefer_short_elements.integer)
@@ -1157,8 +1150,6 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                {
                        if (gl_state.units[i].arrayenabled)
                        {
-                               if (gl_workaround_mac_texmatrix.integer)
-                                       GL_ActiveTexture(i);
                                GL_ClientActiveTexture(i);
                                if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
                                        Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
@@ -1288,7 +1279,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                        GL_BindEBO(bufferobject3s);
                        if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
                        {
-                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices, numelements, GL_UNSIGNED_SHORT, (void *)(firsttriangle * sizeof(unsigned short[3])));
+                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices - 1, numelements, GL_UNSIGNED_SHORT, (void *)(firsttriangle * sizeof(unsigned short[3])));
                                CHECKGLERROR
                        }
                        else
@@ -1302,7 +1293,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                        GL_BindEBO(bufferobject3i);
                        if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
                        {
-                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices, numelements, GL_UNSIGNED_INT, (void *)(firsttriangle * sizeof(unsigned int[3])));
+                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices - 1, numelements, GL_UNSIGNED_INT, (void *)(firsttriangle * sizeof(unsigned int[3])));
                                CHECKGLERROR
                        }
                        else
@@ -1316,7 +1307,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                        GL_BindEBO(0);
                        if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
                        {
-                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices, numelements, GL_UNSIGNED_SHORT, element3s);
+                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices - 1, numelements, GL_UNSIGNED_SHORT, element3s);
                                CHECKGLERROR
                        }
                        else
@@ -1330,7 +1321,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri
                        GL_BindEBO(0);
                        if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
                        {
-                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices, numelements, GL_UNSIGNED_INT, element3i);
+                               qglDrawRangeElements(GL_TRIANGLES, firstvertex, firstvertex + numvertices - 1, numelements, GL_UNSIGNED_INT, element3i);
                                CHECKGLERROR
                        }
                        else
@@ -1416,7 +1407,7 @@ int R_Mesh_CreateStaticBufferObject(unsigned int target, void *data, size_t size
        }
        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;
@@ -1436,7 +1427,7 @@ void R_Mesh_DestroyBufferObject(int 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)
@@ -1456,7 +1447,7 @@ void GL_Mesh_ListVBOs(qboolean printeach)
        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)
@@ -1552,8 +1543,6 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co
                if (!unit->arrayenabled)
                {
                        unit->arrayenabled = true;
-                       if (gl_workaround_mac_texmatrix.integer)
-                               GL_ActiveTexture(unitnum);
                        GL_ClientActiveTexture(unitnum);
                        qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
                }
@@ -1564,8 +1553,6 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co
                        unit->pointer_texcoord_buffer = bufferobject;
                        unit->pointer_texcoord_offset = bufferoffset;
                        unit->arraycomponents = numcomponents;
-                       if (gl_workaround_mac_texmatrix.integer)
-                               GL_ActiveTexture(unitnum);
                        GL_ClientActiveTexture(unitnum);
                        GL_BindVBO(bufferobject);
                        qglTexCoordPointer(unit->arraycomponents, GL_FLOAT, sizeof(float) * unit->arraycomponents, bufferobject ? (void *)bufferoffset : texcoord);CHECKGLERROR
@@ -1577,8 +1564,6 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co
                if (unit->arrayenabled)
                {
                        unit->arrayenabled = false;
-                       if (gl_workaround_mac_texmatrix.integer)
-                               GL_ActiveTexture(unitnum);
                        GL_ClientActiveTexture(unitnum);
                        qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
                }
@@ -2169,8 +2154,6 @@ void R_Mesh_ResetTextureState(void)
                if (unit->arrayenabled)
                {
                        unit->arrayenabled = false;
-                       if (gl_workaround_mac_texmatrix.integer)
-                               GL_ActiveTexture(unitnum);
                        GL_ClientActiveTexture(unitnum);
                        qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
                }
@@ -2184,8 +2167,8 @@ void R_Mesh_ResetTextureState(void)
                        unit->texmatrixenabled = false;
                        unit->matrix = identitymatrix;
                        CHECKGLERROR
-                       qglMatrixMode(GL_TEXTURE);CHECKGLERROR
                        GL_ActiveTexture(unitnum);
+                       qglMatrixMode(GL_TEXTURE);CHECKGLERROR
                        qglLoadIdentity();CHECKGLERROR
                        qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
                }