diff --git a/ref/gl/gl2_shim/gl2_shim.c b/ref/gl/gl2_shim/gl2_shim.c index e576c7c3..e74e1f0e 100644 --- a/ref/gl/gl2_shim/gl2_shim.c +++ b/ref/gl/gl2_shim/gl2_shim.c @@ -41,13 +41,7 @@ Limitations: #define MAX_PROGS 32 // must be LESS GL2_MAX_VERTS #define MAX_BEGINEND_VERTS 8192 -void* (APIENTRY* _pglMapBufferRange)(GLenum target, GLsizei offset, GLsizei length, GLbitfield access); -void* (APIENTRY* _pglFlushMappedBufferRange)(GLenum target, GLsizei offset, GLsizei length); -void* (APIENTRY* _pglDrawRangeElementsBaseVertex)( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLuint vertex ); -void (APIENTRY*_pglBufferStorage)( GLenum target, - GLsizei size, - const GLvoid * data, - GLbitfield flags); + void (APIENTRY*_pglWaitSync)( void * sync, GLbitfield flags, uint64_t timeout); @@ -186,6 +180,8 @@ static const char *gl2wrap_attr_name[GL2_ATTR_MAX] = "inTexCoord1", }; +#define MB(x,y) (x?GL_MAP_##y##_BIT:0) + static void (APIENTRY*rpglEnable)(GLenum e); static void (APIENTRY*rpglDisable)(GLenum e); static void (APIENTRY*rpglDrawElements )( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ); @@ -451,7 +447,7 @@ static gl2wrap_prog_t *GL2_SetProg( const GLuint flags ) static void GL2_InitTriQuads( void ) { int i; - for( i = 0; i < (!!_pglDrawRangeElementsBaseVertex?1:4); i++ ) + for( i = 0; i < (!!pglDrawRangeElementsBaseVertex?1:4); i++ ) { int j; GLushort triquads_array[TRIQUADS_SIZE]; @@ -485,22 +481,10 @@ static void GL2_InitIncrementalBuffer( int i, GLuint size ) rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap.attrbufobj[i][j] ); if( gl2wrap_config.buf_storage ) { - _pglBufferStorage( GL_ARRAY_BUFFER_ARB, size, NULL, - 0x0002 //GL_MAP_WRITE_BIT - | (gl2wrap_config.coherent?0x80:0) - | 0x40 - ); - gl2wrap.mappings[i][j] = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - size, - 0x0002 //GL_MAP_WRITE_BIT - // | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - // | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - // |0x0020 //GL_MAP_UNSYNCHRONIZED_BIT - |(!gl2wrap_config.coherent?0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - | 0X40 - |(gl2wrap_config.coherent?0x80:0) // GL_MAP_COHERENT_BIT - ); + GLuint flags = GL_MAP_WRITE_BIT | MB(!gl2wrap_config.coherent,FLUSH_EXPLICIT) | + GL_MAP_PERSISTENT_BIT | MB(gl2wrap_config.coherent,COHERENT); + pglBufferStorage( GL_ARRAY_BUFFER_ARB, size, NULL, GL_MAP_WRITE_BIT | MB(gl2wrap_config.coherent,COHERENT)| GL_MAP_PERSISTENT_BIT ); + gl2wrap.mappings[i][j] = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, size, flags); } else pglBufferDataARB( GL_ARRAY_BUFFER_ARB, size, NULL, GL_STREAM_DRAW_ARB ); @@ -664,34 +648,15 @@ static void GL2_ResetPersistentBuffer( void ) rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap.attrbufobj[i][gl2wrap.attrbufcycle] ); if(gl2wrap_config.buf_storage) { - + GLuint flags = GL_MAP_WRITE_BIT | MB(!gl2wrap_config.coherent,FLUSH_EXPLICIT) | + GL_MAP_PERSISTENT_BIT | MB(gl2wrap_config.coherent,COHERENT); pglUnmapBufferARB(GL_ARRAY_BUFFER_ARB); - gl2wrap.mappings[i][gl2wrap.attrbufcycle] = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - size, - 0x0002 //GL_MAP_WRITE_BIT - // | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - // | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - // |0x0020 //GL_MAP_UNSYNCHRONIZED_BIT - |(!gl2wrap_config.coherent?0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - | 0X40 - | (gl2wrap_config.coherent?0x00000080:0) // GL_MAP_COHERENT_BIT - ); + gl2wrap.mappings[i][gl2wrap.attrbufcycle] = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, size, flags); gl2wrap.attrbuf[i] = gl2wrap.mappings[i][gl2wrap.attrbufcycle]; } else { - void *mem = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - size, - 0x0002 //GL_MAP_WRITE_BIT - // | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - // |0x0020 //GL_MAP_UNSYNCHRONIZED_BIT - // |0x0010 // GL_MAP_FLUSH_EXPLICIT_BIT - //| 0X40 - //| 0x00000080 // GL_MAP_COHERENT_BIT - ); + void *mem = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT ); (void)mem; pglUnmapBufferARB(GL_ARRAY_BUFFER_ARB); } @@ -756,20 +721,14 @@ static void GL2_UpdateIncrementalBuffer( gl2wrap_prog_t *prog, int count ) if ( prog->attridx[i] >= 0 ) { void *mem; + GLuint flags = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | + MB(gl2wrap_config.async,UNSYNCHRONIZED) | + MB(gl2wrap_config.force_flush,FLUSH_EXPLICIT); rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap.attrbufobj[i][gl2wrap.attrbufcycle]); - mem = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - gl2wrap_attr_size[i] * 4 * gl2wrap.begin, - gl2wrap_attr_size[i] * 4 * count, - 0x0002 //GL_MAP_WRITE_BIT - | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - // | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - |(gl2wrap_config.async ? 0x0020:0) //GL_MAP_UNSYNCHRONIZED_BIT - |(gl2wrap_config.force_flush ? 0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - //| 0x00000080 // GL_MAP_COHERENT_BIT - ); + mem = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, gl2wrap_attr_size[i] * 4 * gl2wrap.begin, gl2wrap_attr_size[i] * 4 * count, flags); memcpy(mem, gl2wrap.attrbuf[i] + gl2wrap_attr_size[i] * gl2wrap.begin, gl2wrap_attr_size[i] * 4 * count); if( gl2wrap_config.force_flush ) - _pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, 0, gl2wrap_attr_size[i] * 4 * count ); + pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, 0, gl2wrap_attr_size[i] * 4 * count ); pglUnmapBufferARB( GL_ARRAY_BUFFER_ARB); } } @@ -782,7 +741,7 @@ static void GL2_UpdateIncrementalBuffer( gl2wrap_prog_t *prog, int count ) if ( prog->attridx[i] >= 0 ) { rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap.attrbufobj[i][gl2wrap.attrbufcycle]); - _pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, 0, gl2wrap_attr_size[i] * 4 * count ); + pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, 0, gl2wrap_attr_size[i] * 4 * count ); } } } @@ -849,16 +808,9 @@ void GL2_FlushPrims( void ) } else { - void *mem = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - gl2wrap_attr_size[i] * 4 * count, - 0x0002 //GL_MAP_WRITE_BIT - | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - |(gl2wrap_config.async ? 0x0020:0) //GL_MAP_UNSYNCHRONIZED_BIT - |(gl2wrap_config.force_flush ? 0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - //| 0x00000080 // GL_MAP_COHERENT_BIT - ); + GLuint flags = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | + MB(gl2wrap_config.async,UNSYNCHRONIZED)| MB(gl2wrap_config.force_flush,FLUSH_EXPLICIT); + void *mem = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, gl2wrap_attr_size[i] * 4 * count, flags ); memcpy( mem, gl2wrap.attrbuf[i] + gl2wrap_attr_size[i] * gl2wrap.begin, gl2wrap_attr_size[i] * 4 * count); pglUnmapBufferARB( GL_ARRAY_BUFFER_ARB); } @@ -882,7 +834,7 @@ void GL2_FlushPrims( void ) // simple case, one quad may draw like polygon(4) if(count == 4) rpglDrawArrays( GL_TRIANGLE_FAN, startindex, count ); - else if(_pglDrawRangeElementsBaseVertex) + else if(pglDrawRangeElementsBaseVertex) { /* * Opengl deprecated QUADS, but made some workarounds availiable @@ -892,7 +844,7 @@ void GL2_FlushPrims( void ) * or just put 0-4 offset when it's availiable * */ pglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, gl2wrap.triquads_ibo[0] ); - _pglDrawRangeElementsBaseVertex( GL_TRIANGLES, startindex, startindex + count, Q_min(count / 4 * 6,TRIQUADS_SIZE * 6 - startindex), GL_UNSIGNED_SHORT, (void*)(size_t)(startindex / 4 * 6 * 2), startindex % 4 ); + pglDrawRangeElementsBaseVertex( GL_TRIANGLES, startindex, startindex + count, Q_min(count / 4 * 6,TRIQUADS_SIZE * 6 - startindex), GL_UNSIGNED_SHORT, (void*)(size_t)(startindex / 4 * 6 * 2), startindex % 4 ); pglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } else if(rpglDrawRangeElements) @@ -1402,19 +1354,11 @@ static void GL2_UpdatePersistentArrayBuffer( gl2wrap_prog_t *prog, int size, int if(gl2wrap_arrays.stream_counter + size > GL2_MAX_VERTS * 64) { + GLuint flags = GL_MAP_WRITE_BIT | MB(!gl2wrap_config.coherent,FLUSH_EXPLICIT)| + GL_MAP_PERSISTENT_BIT | MB(gl2wrap_config.coherent,COHERENT); pglUnmapBufferARB(GL_ARRAY_BUFFER_ARB); gl2wrap_arrays.stream_counter = 0; - gl2wrap_arrays.stream_pointer = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - GL2_MAX_VERTS * 64, - 0x0002 //GL_MAP_WRITE_BIT - // | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - // | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - // |0x0020 //GL_MAP_UNSYNCHRONIZED_BIT - |(!gl2wrap_config.coherent?0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - | 0X40 - | (gl2wrap_config.coherent?0x00000080:0) // GL_MAP_COHERENT_BIT - ); + gl2wrap_arrays.stream_pointer = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, GL2_MAX_VERTS * 64, flags); //i = -1; //continue; size = end * stride, offset = 0; @@ -1422,7 +1366,7 @@ static void GL2_UpdatePersistentArrayBuffer( gl2wrap_prog_t *prog, int size, int memcpy(((char*)gl2wrap_arrays.stream_pointer) + gl2wrap_arrays.stream_counter, ((char*)gl2wrap_arrays.ptr[attr].userptr) + offset, size); if( !gl2wrap_config.coherent ) - _pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.stream_counter, size ); + pglFlushMappedBufferRange( GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.stream_counter, size ); pglVertexAttribPointerARB( prog->attridx[attr], gl2wrap_arrays.ptr[attr].size, gl2wrap_arrays.ptr[attr].type, attr == GL2_ATTR_COLOR, gl2wrap_arrays.ptr[attr].stride, (void*)(gl2wrap_arrays.stream_counter - offset) ); gl2wrap_arrays.stream_counter += size; } @@ -1438,21 +1382,14 @@ static void GL2_UpdateIncrementalArrayBuffer( gl2wrap_prog_t *prog, int size, in { void *mem; qboolean inv = false; + GLuint flags = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | MB(inv,INVALIDATE_BUFFER)| + MB(gl2wrap_config.async, UNSYNCHRONIZED)| MB(gl2wrap_config.force_flush, FLUSH_EXPLICIT); if(gl2wrap_arrays.stream_counter + size > GL2_MAX_VERTS * 64) size = end * stride, offset = 0, gl2wrap_arrays.stream_counter = 0, inv = true; - mem = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - gl2wrap_arrays.stream_counter, - size, - 0x0002 //GL_MAP_WRITE_BIT - | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - | (inv?0x0008:0) // GL_MAP_INVALIDATE_BUFFER_BIT - |(gl2wrap_config.async ? 0x0020:0) //GL_MAP_UNSYNCHRONIZED_BIT - |(gl2wrap_config.force_flush ? 0x0010:0) // GL_MAP_FLUSH_EXPLICIT_BIT - // GL_MAP_COHERENT_BIT - ); + mem = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.stream_counter, size, flags ); memcpy(mem, ((char*)gl2wrap_arrays.ptr[attr].userptr) + offset, size); if(gl2wrap_config.force_flush) - _pglFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, 0, size); + pglFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, 0, size); pglUnmapBufferARB(GL_ARRAY_BUFFER_ARB); pglVertexAttribPointerARB( prog->attridx[attr], gl2wrap_arrays.ptr[attr].size, gl2wrap_arrays.ptr[attr].type, attr == GL2_ATTR_COLOR, gl2wrap_arrays.ptr[attr].stride, (void*)(gl2wrap_arrays.stream_counter - offset) ); gl2wrap_arrays.stream_counter += size; @@ -1467,25 +1404,12 @@ Prepare BufferStorage */ static void GL2_AllocArrayPersistenStorage( void ) { + GLuint flags = GL_MAP_WRITE_BIT | MB(!gl2wrap_config.coherent,FLUSH_EXPLICIT) + | GL_MAP_PERSISTENT_BIT | MB(gl2wrap_config.coherent, COHERENT); pglGenBuffersARB( 1, &gl2wrap_arrays.stream_buffer ); rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.stream_buffer ); - _pglBufferStorage( GL_ARRAY_BUFFER_ARB, GL2_MAX_VERTS * 64, NULL, - 0x0002 //GL_MAP_WRITE_BIT - | (gl2wrap_config.coherent?0x00000080:0) - | 0x40 - ); - gl2wrap_arrays.stream_pointer = _pglMapBufferRange(GL_ARRAY_BUFFER_ARB, - 0, - GL2_MAX_VERTS * 64, - 0x0002 //GL_MAP_WRITE_BIT - // | 0x0004// GL_MAP_INVALIDATE_RANGE_BIT. - // | 0x0008 // GL_MAP_INVALIDATE_BUFFER_BIT - // |0x0020 //GL_MAP_UNSYNCHRONIZED_BIT - // |0x0010 // GL_MAP_FLUSH_EXPLICIT_BIT - | (!gl2wrap_config.coherent?0x0010:0) - | 0X40 - | (gl2wrap_config.coherent?0x00000080:0) // GL_MAP_COHERENT_BIT - ); + pglBufferStorage( GL_ARRAY_BUFFER_ARB, GL2_MAX_VERTS * 64, NULL, GL_MAP_WRITE_BIT | MB(gl2wrap_config.coherent,COHERENT)|GL_MAP_PERSISTENT_BIT); + gl2wrap_arrays.stream_pointer = pglMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, GL2_MAX_VERTS * 64, flags ); } static void GL2_AllocArrays( void ) @@ -1724,16 +1648,16 @@ void GL2_ShimInstall( void ) GL2_OVERRIDE_PTR( VertexPointer ) GL2_OVERRIDE_PTR( ColorPointer ) GL2_OVERRIDE_PTR( TexCoordPointer ) - _pglMapBufferRange = gEngfuncs.GL_GetProcAddress("glMapBufferRange"); - pglUnmapBufferARB = gEngfuncs.GL_GetProcAddress("glUnmapBuffer"); - _pglFlushMappedBufferRange = gEngfuncs.GL_GetProcAddress("glFlushMappedBufferRange"); - _pglBufferStorage = gEngfuncs.GL_GetProcAddress("glBufferStorage"); - _pglMemoryBarrier = gEngfuncs.GL_GetProcAddress("glMemoryBarrier"); - _pglFenceSync = gEngfuncs.GL_GetProcAddress("glFenceSync"); - _pglWaitSync = gEngfuncs.GL_GetProcAddress("glWaitSync"); - _pglClientWaitSync = gEngfuncs.GL_GetProcAddress("glClientWaitSync"); - _pglDeleteSync = gEngfuncs.GL_GetProcAddress("glDeleteSync"); - _pglDrawRangeElementsBaseVertex = gEngfuncs.GL_GetProcAddress("glDrawRangeElementsBaseVertex"); + //pglMapBufferRange = gEngfuncs.GL_GetProcAddress("glMapBufferRange"); + //pglUnmapBufferARB = gEngfuncs.GL_GetProcAddress("glUnmapBuffer"); + //pglFlushMappedBufferRange = gEngfuncs.GL_GetProcAddress("glFlushMappedBufferRange"); + //pglBufferStorage = gEngfuncs.GL_GetProcAddress("glBufferStorage"); + //_pglMemoryBarrier = gEngfuncs.GL_GetProcAddress("glMemoryBarrier"); + //_pglFenceSync = gEngfuncs.GL_GetProcAddress("glFenceSync"); + //_pglWaitSync = gEngfuncs.GL_GetProcAddress("glWaitSync"); + //_pglClientWaitSync = gEngfuncs.GL_GetProcAddress("glClientWaitSync"); + //_pglDeleteSync = gEngfuncs.GL_GetProcAddress("glDeleteSync"); + //pglDrawRangeElementsBaseVertex = gEngfuncs.GL_GetProcAddress("glDrawRangeElementsBaseVertex"); #ifdef QUAD_BATCH GL2_OVERRIDE_PTR_B( BindTexture ) diff --git a/ref/gl/gl_export.h b/ref/gl/gl_export.h index 8887a189..d7a4089e 100644 --- a/ref/gl/gl_export.h +++ b/ref/gl/gl_export.h @@ -815,7 +815,13 @@ typedef float GLmatrix[16]; // GL Core additions #define GL_NUM_EXTENSIONS 0x821D - +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 @@ -1366,9 +1372,15 @@ APIENTRY_LINKAGE void GL_FUNCTION( glGenVertexArrays )( GLsizei n, const GLuint APIENTRY_LINKAGE GLboolean GL_FUNCTION( glIsVertexArray )( GLuint array ); APIENTRY_LINKAGE void GL_FUNCTION( glSwapInterval ) ( int interval ); +// arb shaders change in core APIENTRY_LINKAGE void GL_FUNCTION( glDeleteProgram )(GLuint program); APIENTRY_LINKAGE void GL_FUNCTION( glProgramiv )(GLuint program, GLenum e, GLuint *v); +// gl2shim deps +APIENTRY_LINKAGE void GL_FUNCTION( glBufferStorage )( GLenum target, GLsizei size, const GLvoid * data, GLbitfield flags); +APIENTRY_LINKAGE void GL_FUNCTION( glFlushMappedBufferRange )(GLenum target, GLsizei offset, GLsizei length); +APIENTRY_LINKAGE void *GL_FUNCTION( glMapBufferRange )(GLenum target, GLsizei offset, GLsizei length, GLbitfield access); +APIENTRY_LINKAGE void GL_FUNCTION( glDrawRangeElementsBaseVertex )( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLuint vertex ); #if !defined( XASH_GL_STATIC ) || (!defined( XASH_GLES ) && !defined( XASH_GL4ES )) APIENTRY_LINKAGE void GL_FUNCTION( glTexImage2DMultisample )(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); diff --git a/ref/gl/gl_local.h b/ref/gl/gl_local.h index 82203abb..92d23098 100644 --- a/ref/gl/gl_local.h +++ b/ref/gl/gl_local.h @@ -622,6 +622,9 @@ enum GL_ARB_TEXTURE_COMPRESSION_BPTC, GL_SHADER_OBJECTS_EXT, GL_ARB_VERTEX_ARRAY_OBJECT_EXT, + GL_BUFFER_STORAGE_EXT, + GL_MAP_BUFFER_RANGE_EXT, + GL_DRAW_RANGE_ELEMENTS_BASE_VERTEX_EXT, GL_EXTCOUNT, // must be last }; diff --git a/ref/gl/gl_opengl.c b/ref/gl/gl_opengl.c index 9871210b..652d1de5 100644 --- a/ref/gl/gl_opengl.c +++ b/ref/gl/gl_opengl.c @@ -247,7 +247,32 @@ static dllfunc_t drawrangeelementsextfuncs[] = { NULL, NULL } }; + +// mangling in gl2shim??? +// still need resolve some ext dynamicly, and mangling beginend wrappers will help only with LTO +// anyway this will not work with gl-wes/nanogl, we do not link to libGLESv2, so skip this now #ifndef XASH_GL_STATIC + +static dllfunc_t mapbufferrangefuncs[] = +{ +{ GL_CALL( glMapBufferRange ) }, +{ GL_CALL( glFlushMappedBufferRange ) }, +{ NULL, NULL } +}; + +static dllfunc_t drawrangeelementsbasevertexfuncs[] = +{ +{ GL_CALL( glDrawRangeElementsBaseVertex ) }, +{ NULL, NULL } +}; + +static dllfunc_t bufferstoragefuncs[] = +{ +{ GL_CALL( glBufferStorage ) }, +{ NULL, NULL } +}; + + static dllfunc_t shaderobjectsfuncs[] = { { GL_CALL( glDeleteObjectARB ) }, @@ -729,6 +754,17 @@ void GL_InitExtensionsGLES( void ) case GL_DRAW_RANGEELEMENTS_EXT: GL_CheckExtension( "draw_range_elements", drawrangeelementsfuncs, "gl_drawrangeelements", extid, 0 ); break; + case GL_DRAW_RANGE_ELEMENTS_BASE_VERTEX_EXT: + if( !GL_CheckExtension( "GL_OES_draw_elements_base_vertex", drawrangeelementsbasevertexfuncs, "gl_drawrangeelementsbasevertex", GL_DRAW_RANGE_ELEMENTS_BASE_VERTEX_EXT, 0 ) ) + GL_CheckExtension( "GL_EXT_draw_elements_base_vertex", drawrangeelementsbasevertexfuncs, "gl_drawrangeelementsbasevertex", GL_DRAW_RANGE_ELEMENTS_BASE_VERTEX_EXT, 3.2 ); + break; + case GL_MAP_BUFFER_RANGE_EXT: + GL_CheckExtension( "GL_EXT_map_buffer_range", mapbufferrangefuncs, "gl_map_buffer_range", GL_MAP_BUFFER_RANGE_EXT , 3.0); + break; + case GL_BUFFER_STORAGE_EXT: + GL_CheckExtension( "GL_EXT_buffer_storage", bufferstoragefuncs, "gl_buffer_storage", GL_BUFFER_STORAGE_EXT, 0); + break; + #endif case GL_DEBUG_OUTPUT: if( glw_state.extended ) @@ -854,8 +890,11 @@ void GL_InitExtensionsBigGL( void ) if(glConfig.context == CONTEXT_TYPE_GL_CORE ) GL_CheckExtension( "shader_objects", shaderobjectsfuncs_gles, "gl_shaderobjects", GL_SHADER_OBJECTS_EXT, 2.0 ); else - GL_CheckExtension( "GL_ARB_shader_objects", shaderobjectsfuncs, "gl_shaderobjects", GL_SHADER_OBJECTS_EXT, 0 ); - GL_CheckExtension( "GL_ARB_vertex_array_object", vaofuncs, "gl_vertex_array_object", GL_ARB_VERTEX_ARRAY_OBJECT_EXT, 0 ); + GL_CheckExtension( "GL_ARB_shader_objects", shaderobjectsfuncs, "gl_shaderobjects", GL_SHADER_OBJECTS_EXT, 2.0 ); + GL_CheckExtension( "GL_ARB_vertex_array_object", vaofuncs, "gl_vertex_array_object", GL_ARB_VERTEX_ARRAY_OBJECT_EXT, 3.0 ); + GL_CheckExtension( "GL_ARB_buffer_storage", bufferstoragefuncs, "gl_buffer_storage", GL_BUFFER_STORAGE_EXT, 4.4); + GL_CheckExtension( "GL_ARB_map_buffer_range", mapbufferrangefuncs, "gl_map_buffer_range", GL_MAP_BUFFER_RANGE_EXT , 3.0); + GL_CheckExtension( "GL_ARB_draw_elements_base_vertex", drawrangeelementsbasevertexfuncs, "gl_drawrangeelementsbasevertex", GL_DRAW_RANGE_ELEMENTS_BASE_VERTEX_EXT, 3.2 ); #endif if( GL_CheckExtension( "GL_ARB_shading_language_100", NULL, NULL, GL_SHADER_GLSL100_EXT, 2.0 )) {