]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
added host_sleep cvar, defaults to 1 millisecond wait each frame, this
[xonotic/darkplaces.git] / gl_backend.c
index 871a6a09b196c34f723f74de718ce54b0bbc6309..8e00108cbb92b5549e6f7be20fcc837c0b60de18 100644 (file)
@@ -15,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;
@@ -1090,17 +1090,35 @@ 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, element3i, element3s, bufferobject3i, bufferobject3s);
                return;
        }
-       if (!gl_mesh_prefer_short_elements.integer && element3i)
-               element3s = NULL;
+       if (!gl_mesh_prefer_short_elements.integer)
+       {
+               if (element3i)
+                       element3s = NULL;
+               if (bufferobject3i)
+                       bufferobject3s = 0;
+       }
        if (element3i)
                element3i += firsttriangle * 3;
        if (element3s)
                element3s += firsttriangle * 3;
-       if (gl_vbo.integer != 1)
+       switch (gl_vbo.integer)
+       {
+       default:
+       case 0:
+       case 2:
                bufferobject3i = bufferobject3s = 0;
+               break;
+       case 1:
+               break;
+       case 3:
+               if (firsttriangle)
+                       bufferobject3i = bufferobject3s = 0;
+               break;
+       }
        CHECKGLERROR
        r_refdef.stats.meshes++;
        r_refdef.stats.meshes_elements += numelements;
@@ -1389,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;
@@ -1409,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)
@@ -1429,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)
@@ -1947,6 +1965,8 @@ void R_Mesh_TexBindCubeMap(unsigned int unitnum, int texnum)
        }
 }
 
+static const double gl_identitymatrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
+
 void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix)
 {
        gltextureunit_t *unit = gl_state.units + unitnum;
@@ -1961,7 +1981,6 @@ 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
                        qglLoadMatrixd(glmatrix);CHECKGLERROR
                        qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
@@ -1976,7 +1995,6 @@ 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
                        qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
@@ -2149,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
                }