From be4832ae9959a5f560c892ebf2e9033096719ce8 Mon Sep 17 00:00:00 2001 From: "havoc havoc@d7cf8633-e32d-0410-b094-e92efae38249" <> Date: Tue, 5 Jan 2010 09:33:35 +0000 Subject: [PATCH] UNMERGE remove support for GL_EXT_compiled_vertex_array extension git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9782 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::unmerge=bc9063582a5b12986a3f70b4eaa9ffaf1568f735 --- cl_particles.c | 4 ++++ gl_backend.c | 31 +++++++++++++++++++++++++++++++ gl_backend.h | 3 +++ gl_draw.c | 14 ++++++++++++++ gl_rmain.c | 19 +++++++++++++++++++ gl_rsurf.c | 1 + glquake.h | 4 ++++ r_explosion.c | 2 ++ r_shadow.c | 4 ++++ vid.h | 1 + vid_shared.c | 13 +++++++++++++ 11 files changed, 96 insertions(+) diff --git a/cl_particles.c b/cl_particles.c index eb850f06..16ad0973 100644 --- a/cl_particles.c +++ b/cl_particles.c @@ -2287,7 +2287,9 @@ void R_DrawDecal_TransparentCallback(const entity_render_t *ent, const rtlight_t // (this assumes they all use one particle font texture!) GL_BlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); R_SetupShader_Generic(particletexture[63].texture, NULL, GL_MODULATE, 1); + GL_LockArrays(0, numsurfaces*4); R_Mesh_Draw(0, numsurfaces * 4, 0, numsurfaces * 2, NULL, particle_elements, 0, 0); + GL_LockArrays(0, 0); } void R_DrawDecals (void) @@ -2551,6 +2553,7 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh // now render batches of particles based on blendmode and texture blendmode = PBLEND_INVALID; texture = NULL; + GL_LockArrays(0, numsurfaces*4); batchstart = 0; batchcount = 0; for (surfacelistindex = 0;surfacelistindex < numsurfaces;) @@ -2592,6 +2595,7 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh batchcount = surfacelistindex - batchstart; R_Mesh_Draw(batchstart * 4, batchcount * 4, batchstart * 2, batchcount * 2, NULL, particle_elements, 0, 0); } + GL_LockArrays(0, 0); } void R_DrawParticles (void) diff --git a/gl_backend.c b/gl_backend.c index 737df7ef..af648a94 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -14,6 +14,8 @@ cvar_t r_renderview = {0, "r_renderview", "1", "enables rendering 3D views (you cvar_t r_waterwarp = {CVAR_SAVE, "r_waterwarp", "1", "warp view while underwater"}; cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1", "tints view while underwater, hurt, etc"}; 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", "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 gl_fbo = {CVAR_SAVE, "gl_fbo", "1", "make use of GL_ARB_framebuffer_object extension to enable shadowmaps and other features using pixel formats different from the framebuffer"}; @@ -280,6 +282,8 @@ void gl_backend_init(void) Cvar_RegisterVariable(&gl_polyblend); Cvar_RegisterVariable(&v_flipped); Cvar_RegisterVariable(&gl_dither); + Cvar_RegisterVariable(&gl_lockarrays); + Cvar_RegisterVariable(&gl_lockarrays_minimumvertices); Cvar_RegisterVariable(&gl_vbo); Cvar_RegisterVariable(&gl_paranoid); Cvar_RegisterVariable(&gl_printcheckerror); @@ -993,6 +997,33 @@ void GL_Color(float cr, float cg, float cb, float ca) } } +void GL_LockArrays(int first, int count) +{ + if (count < gl_lockarrays_minimumvertices.integer) + { + first = 0; + count = 0; + } + if (gl_state.lockrange_count != count || gl_state.lockrange_first != first) + { + if (gl_state.lockrange_count) + { + gl_state.lockrange_count = 0; + CHECKGLERROR + qglUnlockArraysEXT(); + CHECKGLERROR + } + if (count && vid.support.ext_compiled_vertex_array && gl_lockarrays.integer) + { + gl_state.lockrange_first = first; + gl_state.lockrange_count = count; + CHECKGLERROR + qglLockArraysEXT(first, count); + CHECKGLERROR + } + } +} + void GL_Scissor (int x, int y, int width, int height) { CHECKGLERROR diff --git a/gl_backend.h b/gl_backend.h index cea789ce..72f2bc46 100644 --- a/gl_backend.h +++ b/gl_backend.h @@ -37,6 +37,7 @@ void GL_CullFace(int state); void GL_AlphaTest(int state); void GL_ColorMask(int r, int g, int b, int a); void GL_Color(float cr, float cg, float cb, float ca); +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); @@ -46,6 +47,8 @@ void GL_Clear(int mask); unsigned int GL_Backend_CompileProgram(int vertexstrings_count, const char **vertexstrings_list, int geometrystrings_count, const char **geometrystrings_list, int fragmentstrings_count, const char **fragmentstrings_list); void GL_Backend_FreeProgram(unsigned int prog); +extern cvar_t gl_lockarrays; +extern cvar_t gl_mesh_copyarrays; extern cvar_t gl_paranoid; extern cvar_t gl_printcheckerror; diff --git a/gl_draw.c b/gl_draw.c index da593501..a18e59cd 100644 --- a/gl_draw.c +++ b/gl_draw.c @@ -1467,7 +1467,9 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma if (batchcount) { // switching from freetype to non-freetype rendering + GL_LockArrays(0, batchcount * 4); R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, quadelement3i, quadelement3s, 0, 0); + GL_LockArrays(0, 0); batchcount = 0; ac = color4f; at = texcoord2f; @@ -1504,7 +1506,9 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma batchcount++; if (batchcount >= QUADELEMENTS_MAXQUADS) { + GL_LockArrays(0, batchcount * 4); R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, quadelement3i, quadelement3s, 0, 0); + GL_LockArrays(0, 0); batchcount = 0; ac = color4f; at = texcoord2f; @@ -1518,7 +1522,9 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma if (batchcount) { // we need a different character map, render what we currently have: + GL_LockArrays(0, batchcount * 4); R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, quadelement3i, quadelement3s, 0, 0); + GL_LockArrays(0, 0); batchcount = 0; ac = color4f; at = texcoord2f; @@ -1577,7 +1583,9 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma batchcount++; if (batchcount >= QUADELEMENTS_MAXQUADS) { + GL_LockArrays(0, batchcount * 4); R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, quadelement3i, quadelement3s, 0, 0); + GL_LockArrays(0, 0); batchcount = 0; ac = color4f; at = texcoord2f; @@ -1595,7 +1603,11 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma } } if (batchcount > 0) + { + GL_LockArrays(0, batchcount * 4); R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, quadelement3i, quadelement3s, 0, 0); + GL_LockArrays(0, 0); + } if (outcolor) *outcolor = colorindex; @@ -1712,7 +1724,9 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags) R_Mesh_TexCoordPointer(0, 2, mesh->data_texcoord2f, 0, 0); R_SetupShader_Generic(mesh->texture, NULL, GL_MODULATE, 1); + GL_LockArrays(0, mesh->num_vertices); R_Mesh_Draw(0, mesh->num_vertices, 0, mesh->num_triangles, mesh->data_element3i, mesh->data_element3s, 0, 0); + GL_LockArrays(0, 0); } void DrawQ_LineLoop (drawqueuemesh_t *mesh, int flags) diff --git a/gl_rmain.c b/gl_rmain.c index 3c6bd98f..13875a54 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -9701,7 +9701,10 @@ void RSurf_DrawBatch_Simple(int texturenumsurfaces, const msurface_t **texturesu int numtriangles; // TODO: lock all array ranges before render, rather than on each surface if (texturenumsurfaces == 1) + { + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); + } else if (r_batchmode.integer == 2) { #define MAXBATCHTRIANGLES 4096 @@ -9746,6 +9749,7 @@ void RSurf_DrawBatch_Simple(int texturenumsurfaces, const msurface_t **texturesu surface2 = texturesurfacelist[j-1]; numvertices = surface2->num_firstvertex + surface2->num_vertices - surface->num_firstvertex; numtriangles = surface2->num_firsttriangle + surface2->num_triangles - surface->num_firsttriangle; + GL_LockArrays(surface->num_firstvertex, numvertices); R_Mesh_Draw(surface->num_firstvertex, numvertices, surface->num_firsttriangle, numtriangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } } @@ -9754,6 +9758,7 @@ void RSurf_DrawBatch_Simple(int texturenumsurfaces, const msurface_t **texturesu for (i = 0;i < texturenumsurfaces;i++) { surface = texturesurfacelist[i]; + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } } @@ -9833,6 +9838,7 @@ static void RSurf_DrawBatch_WithLightmapSwitching_WithWaterTextureSwitching(int surface = texturesurfacelist[i]; RSurf_BindLightmapForSurface(surface); RSurf_BindReflectionForSurface(surface); + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } } @@ -9850,6 +9856,7 @@ static void RSurf_DrawBatch_WithLightmapSwitching(int texturenumsurfaces, const if (texturenumsurfaces == 1) { RSurf_BindLightmapForSurface(surface); + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } else if (r_batchmode.integer == 2) @@ -9914,6 +9921,7 @@ static void RSurf_DrawBatch_WithLightmapSwitching(int texturenumsurfaces, const surface2 = texturesurfacelist[j-1]; numvertices = surface2->num_firstvertex + surface2->num_vertices - surface->num_firstvertex; numtriangles = surface2->num_firsttriangle + surface2->num_triangles - surface->num_firsttriangle; + GL_LockArrays(surface->num_firstvertex, numvertices); R_Mesh_Draw(surface->num_firstvertex, numvertices, surface->num_firsttriangle, numtriangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } #if 0 @@ -9926,6 +9934,7 @@ static void RSurf_DrawBatch_WithLightmapSwitching(int texturenumsurfaces, const { surface = texturesurfacelist[i]; RSurf_BindLightmapForSurface(surface); + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } } @@ -9955,6 +9964,7 @@ static void RSurf_DrawBatch_ShowSurfaces(int texturenumsurfaces, const msurface_ const msurface_t *surface = texturesurfacelist[texturesurfaceindex]; int k = (int)(((size_t)surface) / sizeof(msurface_t)); GL_Color((k & 15) * (1.0f / 16.0f) * r_refdef.view.colorscale, ((k >> 4) & 15) * (1.0f / 16.0f) * r_refdef.view.colorscale, ((k >> 8) & 15) * (1.0f / 16.0f) * r_refdef.view.colorscale, 1); + GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_firsttriangle, surface->num_triangles, rsurface.modelelement3i, rsurface.modelelement3s, rsurface.modelelement3i_bufferobject, rsurface.modelelement3s_bufferobject); } } @@ -10329,6 +10339,7 @@ static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, const msurface GL_DepthMask(true); R_SetupShader_Surface(vec3_origin, (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT) != 0, 1, 1, rsurface.texture->specularscale, prepass ? RSURFPASS_DEFERREDGEOMETRY : RSURFPASS_BASE); RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist); + GL_LockArrays(0, 0); } else if ((rsurface.texture->currentmaterialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION)) && !r_waterstate.renderingscene) { @@ -10336,9 +10347,11 @@ static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, const msurface GL_DepthMask(true); R_SetupShader_Surface(vec3_origin, (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT) != 0, 1, 1, rsurface.texture->specularscale, RSURFPASS_BACKGROUND); RSurf_DrawBatch_WithLightmapSwitching_WithWaterTextureSwitching(texturenumsurfaces, texturesurfacelist); + GL_LockArrays(0, 0); GL_DepthMask(false); R_SetupShader_Surface(vec3_origin, (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT) != 0, 1, 1, rsurface.texture->specularscale, prepass ? RSURFPASS_DEFERREDGEOMETRY : RSURFPASS_BASE); RSurf_DrawBatch_WithLightmapSwitching_WithWaterTextureSwitching(texturenumsurfaces, texturesurfacelist); + GL_LockArrays(0, 0); } else { @@ -10351,6 +10364,7 @@ static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, const msurface RSurf_DrawBatch_WithLightmapSwitching(texturenumsurfaces, texturesurfacelist); else RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist); + GL_LockArrays(0, 0); } } @@ -10467,6 +10481,7 @@ static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, const msurface default: Con_Printf("R_DrawTextureSurfaceList: unknown layer type %i\n", layer->type); } + GL_LockArrays(0, 0); } CHECKGLERROR if (rsurface.texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) @@ -10518,6 +10533,7 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface RSurf_DrawBatch_GL11_Lightmap(texturenumsurfaces, texturesurfacelist, 1, 1, 1, 1, false, false); else RSurf_DrawBatch_GL11_VertexColor(texturenumsurfaces, texturesurfacelist, 1, 1, 1, 1, false, false); + GL_LockArrays(0, 0); // then apply the texture to it GL_BlendFunc(GL_DST_COLOR, GL_SRC_COLOR); R_Mesh_TexBind(0, layer->texture); @@ -10584,6 +10600,7 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface default: Con_Printf("R_DrawTextureSurfaceList: unknown layer type %i\n", layer->type); } + GL_LockArrays(0, 0); } CHECKGLERROR if (rsurface.texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) @@ -11715,7 +11732,9 @@ static void R_DrawModelDecals_Entity(entity_render_t *ent) GL_CullFace(GL_NONE); GL_BlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); R_SetupShader_Generic(decalskinframe->base, NULL, GL_MODULATE, 1); + GL_LockArrays(0, numtris * 3); R_Mesh_Draw(0, numtris * 3, 0, numtris, decalsystem->element3i, decalsystem->element3s, 0, 0); + GL_LockArrays(0, 0); } } diff --git a/gl_rsurf.c b/gl_rsurf.c index 9478d237..96f2bc8a 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -1132,6 +1132,7 @@ void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relative GL_CullFace(rsurface.texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE ? GL_NONE : r_refdef.view.cullface_back); RSurf_PrepareVerticesForBatch(false, false, batchsize, batch); RSurf_DrawBatch_Simple(batchsize, batch); + GL_LockArrays(0, 0); } } diff --git a/glquake.h b/glquake.h index bd3e133c..0385511e 100644 --- a/glquake.h +++ b/glquake.h @@ -336,6 +336,10 @@ extern void (GLAPIENTRY *qglClientActiveTexture) (GLenum); #define GL_TEXTURE31_ARB 0x84DF #endif +// GL_EXT_compiled_vertex_array +extern void (GLAPIENTRY *qglLockArraysEXT) (GLint first, GLint count); +extern void (GLAPIENTRY *qglUnlockArraysEXT) (void); + // GL_ARB_texture_env_combine #ifndef GL_COMBINE_ARB #define GL_COMBINE_ARB 0x8570 diff --git a/r_explosion.c b/r_explosion.c index ecb83f17..e26ba58a 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -222,7 +222,9 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons R_Mesh_VertexPointer(e->vert[0], 0, 0); // FIXME: fixed function path can't properly handle r_refdef.view.colorscale > 1 GL_Color(e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, 1); + GL_LockArrays(0, numverts); R_Mesh_Draw(0, numverts, 0, numtriangles, NULL, explosiontris[0], 0, 0); + GL_LockArrays(0, 0); } } diff --git a/r_shadow.c b/r_shadow.c index 49f03e4e..d368e831 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -1330,6 +1330,7 @@ void R_Shadow_VolumeFromList(int numverts, int numtris, const float *invertex3f, r_refdef.stats.lights_shadowtriangles += tris; CHECKGLERROR R_Mesh_VertexPointer(shadowvertex3f, 0, 0); + GL_LockArrays(0, outverts); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_ZPASS_STENCIL) { // increment stencil if frontface is infront of depthbuffer @@ -1351,6 +1352,7 @@ void R_Shadow_VolumeFromList(int numverts, int numtris, const float *invertex3f, qglStencilOp(GL_KEEP, GL_INCR, GL_KEEP);CHECKGLERROR } R_Mesh_Draw(0, outverts, 0, tris, shadowelements, NULL, 0, 0); + GL_LockArrays(0, 0); CHECKGLERROR } } @@ -3312,6 +3314,7 @@ void R_Shadow_DrawWorldShadow_ShadowVolume(int numsurfaces, int *surfacelist, co { r_refdef.stats.lights_shadowtriangles += mesh->numtriangles; R_Mesh_VertexPointer(mesh->vertex3f, mesh->vbo, mesh->vbooffset_vertex3f); + GL_LockArrays(0, mesh->numverts); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_ZPASS_STENCIL) { // increment stencil if frontface is infront of depthbuffer @@ -3333,6 +3336,7 @@ void R_Shadow_DrawWorldShadow_ShadowVolume(int numsurfaces, int *surfacelist, co qglStencilOp(GL_KEEP, GL_INCR, GL_KEEP);CHECKGLERROR } R_Mesh_Draw(0, mesh->numverts, 0, mesh->numtriangles, mesh->element3i, mesh->element3s, mesh->ebo3i, mesh->ebo3s); + GL_LockArrays(0, 0); } CHECKGLERROR } diff --git a/vid.h b/vid.h index 52331ae4..b0c3b626 100644 --- a/vid.h +++ b/vid.h @@ -59,6 +59,7 @@ typedef struct viddef_support_s qboolean ati_separate_stencil; qboolean ext_blend_minmax; qboolean ext_blend_subtract; + qboolean ext_compiled_vertex_array; qboolean ext_draw_range_elements; qboolean ext_framebuffer_object; qboolean ext_stencil_two_side; diff --git a/vid_shared.c b/vid_shared.c index 4579c143..397f590f 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -110,6 +110,10 @@ void (GLAPIENTRY *qglMultiTexCoord4f) (GLenum, GLfloat, GLfloat, GLfloat, GLfloa void (GLAPIENTRY *qglActiveTexture) (GLenum); void (GLAPIENTRY *qglClientActiveTexture) (GLenum); +// GL_EXT_compiled_vertex_array +void (GLAPIENTRY *qglLockArraysEXT) (GLint first, GLint count); +void (GLAPIENTRY *qglUnlockArraysEXT) (void); + // general GL functions void (GLAPIENTRY *qglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); @@ -589,6 +593,13 @@ static dllfunction_t multitexturefuncs[] = {NULL, NULL} }; +static dllfunction_t compiledvertexarrayfuncs[] = +{ + {"glLockArraysEXT", (void **) &qglLockArraysEXT}, + {"glUnlockArraysEXT", (void **) &qglUnlockArraysEXT}, + {NULL, NULL} +}; + static dllfunction_t texture3dextfuncs[] = { {"glTexImage3DEXT", (void **) &qglTexImage3D}, @@ -818,6 +829,7 @@ void VID_CheckExtensions(void) vid.support.ati_separate_stencil = GL_CheckExtension("2.0", gl2separatestencilfuncs, "-noseparatestencil", true) || GL_CheckExtension("GL_ATI_separate_stencil", atiseparatestencilfuncs, "-noseparatestencil", false); vid.support.ext_blend_minmax = GL_CheckExtension("GL_EXT_blend_minmax", blendequationfuncs, "-noblendminmax", false); vid.support.ext_blend_subtract = GL_CheckExtension("GL_EXT_blend_subtract", blendequationfuncs, "-noblendsubtract", false); + vid.support.ext_compiled_vertex_array = GL_CheckExtension("GL_EXT_compiled_vertex_array", compiledvertexarrayfuncs, "-nocva", false); vid.support.ext_draw_range_elements = GL_CheckExtension("1.2", drawrangeelementsfuncs, "-nodrawrangeelements", true) || GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false); vid.support.ext_framebuffer_object = GL_CheckExtension("GL_EXT_framebuffer_object", fbofuncs, "-nofbo", false); vid.support.ext_stencil_two_side = GL_CheckExtension("GL_EXT_stencil_two_side", stenciltwosidefuncs, "-nostenciltwoside", false); @@ -830,6 +842,7 @@ void VID_CheckExtensions(void) // COMMANDLINEOPTION: GL: -noblendsubtract disables GL_EXT_blend_subtract // COMMANDLINEOPTION: GL: -nocombine disables GL_ARB_texture_env_combine or GL_EXT_texture_env_combine (required for bumpmapping and faster map rendering) // COMMANDLINEOPTION: GL: -nocubemap disables GL_ARB_texture_cube_map (required for bumpmapping) +// COMMANDLINEOPTION: GL: -nocva disables GL_EXT_compiled_vertex_array (renders faster) // COMMANDLINEOPTION: GL: -nodepthtexture disables use of GL_ARB_depth_texture (required for shadowmapping) // COMMANDLINEOPTION: GL: -nodrawbuffers disables use of GL_ARB_draw_buffers (required for r_shadow_deferredprepass) // COMMANDLINEOPTION: GL: -nodrawrangeelements disables GL_EXT_draw_range_elements (renders faster) -- 2.39.2