gl2shim: dynamic extension checking and autoconfiguration

This commit is contained in:
mittorn 2023-10-13 05:06:43 +03:00
parent 2e79d51ec8
commit 7b897026b7
1 changed files with 82 additions and 12 deletions

View File

@ -381,8 +381,11 @@ static gl2wrap_prog_t *GL2_GetProg( const GLuint flags )
prog->ufog = pglGetUniformLocationARB( glprog, "uFog" );
prog->uMVP = pglGetUniformLocationARB( glprog, "uMVP" );
prog->vao_begin = malloc(gl2wrap_config.cycle_buffers * 4);
pglGenVertexArrays( gl2wrap_config.cycle_buffers, prog->vao_begin );
if(gl2wrap_config.vao_mandatory)
{
prog->vao_begin = malloc(gl2wrap_config.cycle_buffers * 4);
pglGenVertexArrays( gl2wrap_config.cycle_buffers, prog->vao_begin );
}
pglUseProgramObjectARB( glprog );
for ( i = 0; i < GL2_ATTR_MAX; ++i )
{
@ -400,7 +403,8 @@ static gl2wrap_prog_t *GL2_GetProg( const GLuint flags )
}
}
}
pglBindVertexArray( 0 );
if( gl2wrap_config.vao_mandatory )
pglBindVertexArray( 0 );
// these never change
if ( prog->flags & ( 1U << GL2_ATTR_TEXCOORD0 ) && prog->utex0 >= 0 )
@ -500,11 +504,8 @@ static void GL2_InitIncrementalBuffer( int i, GLuint size )
}
int GL2_ShimInit( void )
qboolean GL2_InitProgs( void )
{
int i;
GLuint total;
static const GLuint precache_progs[] = {
0x0001, // out = ucolor
0x0005, // out = tex0 * ucolor
@ -515,10 +516,35 @@ int GL2_ShimInit( void )
0x0027, // out = tex0 * vcolor + FEAT_FOG
0x0035, // out = tex0 * ucolor + FEAT_ALPHA_TEST + FEAT_FOG
};
int i;
gEngfuncs.Con_DPrintf( S_NOTE "GL2_InitProgs(): Pre-generating %u progs, version %d...\n", (uint)(sizeof( precache_progs ) / sizeof( *precache_progs )), gl2wrap_config.version );
for ( i = 0; i < (int)( sizeof( precache_progs ) / sizeof( *precache_progs ) ); ++i )
if( !GL2_GetProg( precache_progs[i] ))
return false;
return true;
}
int GL2_ShimInit( void )
{
int i;
GLuint total;
if ( gl2wrap_init )
return 0;
gl2wrap_config.vao_mandatory = true;
if(!pglBindBufferARB)
{
gEngfuncs.Con_Printf( S_ERROR "GL2_ShimInit(): missing VBO, disabling\n");
return 1;
}
if(!pglCompileShaderARB)
{
gEngfuncs.Con_Printf( S_ERROR "GL2_ShimInit(): missing shaders, disabling\n");
return 1;
}
gl2wrap_config.vao_mandatory = gEngfuncs.Sys_CheckParm("-vao") || glConfig.context == CONTEXT_TYPE_GL_CORE;
gl2wrap_config.incremental =true;
gl2wrap_config.async = true;
gl2wrap_config.force_flush = false;
@ -526,15 +552,52 @@ int GL2_ShimInit( void )
gl2wrap_config.coherent = true;
gl2wrap_config.supports_mapbuffer = true;
gl2wrap_config.cycle_buffers = 4096;
if( !pglBufferStorage )
{
gl2wrap_config.buf_storage = false;
gEngfuncs.Con_Printf( S_NOTE "GL2_ShimInit(): missing BufferStorage\n");
}
if( !pglMapBufferRange )
{
gl2wrap_config.incremental = false, gl2wrap_config.supports_mapbuffer = false;
gEngfuncs.Con_Printf( S_NOTE "GL2_ShimInit(): missing MapBufferRange, disabling incremental rendering\n");
}
if( gEngfuncs.Sys_CheckParm("-nocoherent") )
gl2wrap_config.coherent = false;
if( gEngfuncs.Sys_CheckParm("-nobufstor") )
gl2wrap_config.buf_storage = false;
if( gEngfuncs.Sys_CheckParm("-noasync") )
gl2wrap_config.async = false;
if( gEngfuncs.Sys_CheckParm("-forceflush") )
gl2wrap_config.force_flush = true;
if( gEngfuncs.Sys_CheckParm("-nomapbuffer") )
gl2wrap_config.supports_mapbuffer = false;
if( gEngfuncs.Sys_CheckParm("-noincremental") )
gl2wrap_config.incremental = false, gl2wrap_config.buf_storage = false;
gl2wrap_config.version = 310;
if( gEngfuncs.Sys_CheckParm("-minshaders") )
gl2wrap_config.version = 110;
if(gl2wrap_config.buf_storage)
gl2wrap_config.incremental = true;
gl2wrap_config.incremental = true, gl2wrap_config.vao_mandatory = true;
if(!pglBindVertexArray || !gl2wrap_config.vao_mandatory)
gl2wrap_config.incremental = gl2wrap_config.buf_storage = gl2wrap_config.vao_mandatory = false;
if(gl2wrap_config.incremental && !gl2wrap_config.buf_storage)
gl2wrap_config.async = true;
if(gl2wrap_config.incremental)
gl2wrap_config.cycle_buffers = 4;
if(!gl2wrap_config.vao_mandatory)
gl2wrap_config.cycle_buffers = 1;
gEngfuncs.Con_Printf( S_NOTE "GL2_ShimInit(): config: %s%s%s%s%s%s%sCYCLE=%d VER=%d\n",
gl2wrap_config.buf_storage?"BUF_STOR ":"",
gl2wrap_config.buf_storage&&gl2wrap_config.coherent?"COHERENT ":"",
gl2wrap_config.async?"ASYNC ":"",
gl2wrap_config.incremental?"INC ":"",
gl2wrap_config.force_flush?"FLUSH ":"",
gl2wrap_config.vao_mandatory?"VAO ":"",
gl2wrap_config.supports_mapbuffer?"MAP ":"",
gl2wrap_config.cycle_buffers, gl2wrap_config.version );
memset( &gl2wrap, 0, sizeof( gl2wrap ) );
GL2_ShimInstall();
@ -586,10 +649,17 @@ int GL2_ShimInit( void )
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
gEngfuncs.Con_DPrintf( S_NOTE "GL2_ShimInit(): %u bytes allocated for vertex buffer\n", total );
gEngfuncs.Con_DPrintf( S_NOTE "GL2_ShimInit(): Pre-generating %u progs...\n", (uint)(sizeof( precache_progs ) / sizeof( *precache_progs ) ));
for ( i = 0; i < (int)( sizeof( precache_progs ) / sizeof( *precache_progs ) ); ++i )
GL2_GetProg( precache_progs[i] );
if( !GL2_InitProgs() )
{
gl2wrap_config.version = 300;
if(!GL2_InitProgs())
{
gl2wrap_config.version = 110;
if(!GL2_InitProgs())
gEngfuncs.Host_Error("Failed to compile shaders!\n");
}
}
gl2wrap_init = 1;
return 0;