mirror of
https://github.com/FWGS/xash3d-fwgs
synced 2024-11-10 12:59:17 +01:00
gl2shim: dynamic extension checking and autoconfiguration
This commit is contained in:
parent
2e79d51ec8
commit
7b897026b7
@ -381,8 +381,11 @@ static gl2wrap_prog_t *GL2_GetProg( const GLuint flags )
|
|||||||
prog->ufog = pglGetUniformLocationARB( glprog, "uFog" );
|
prog->ufog = pglGetUniformLocationARB( glprog, "uFog" );
|
||||||
prog->uMVP = pglGetUniformLocationARB( glprog, "uMVP" );
|
prog->uMVP = pglGetUniformLocationARB( glprog, "uMVP" );
|
||||||
|
|
||||||
|
if(gl2wrap_config.vao_mandatory)
|
||||||
|
{
|
||||||
prog->vao_begin = malloc(gl2wrap_config.cycle_buffers * 4);
|
prog->vao_begin = malloc(gl2wrap_config.cycle_buffers * 4);
|
||||||
pglGenVertexArrays( gl2wrap_config.cycle_buffers, prog->vao_begin );
|
pglGenVertexArrays( gl2wrap_config.cycle_buffers, prog->vao_begin );
|
||||||
|
}
|
||||||
pglUseProgramObjectARB( glprog );
|
pglUseProgramObjectARB( glprog );
|
||||||
for ( i = 0; i < GL2_ATTR_MAX; ++i )
|
for ( i = 0; i < GL2_ATTR_MAX; ++i )
|
||||||
{
|
{
|
||||||
@ -400,6 +403,7 @@ static gl2wrap_prog_t *GL2_GetProg( const GLuint flags )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if( gl2wrap_config.vao_mandatory )
|
||||||
pglBindVertexArray( 0 );
|
pglBindVertexArray( 0 );
|
||||||
|
|
||||||
// these never change
|
// these never change
|
||||||
@ -500,11 +504,8 @@ static void GL2_InitIncrementalBuffer( int i, GLuint size )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
qboolean GL2_InitProgs( void )
|
||||||
int GL2_ShimInit( void )
|
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
GLuint total;
|
|
||||||
static const GLuint precache_progs[] = {
|
static const GLuint precache_progs[] = {
|
||||||
0x0001, // out = ucolor
|
0x0001, // out = ucolor
|
||||||
0x0005, // out = tex0 * ucolor
|
0x0005, // out = tex0 * ucolor
|
||||||
@ -515,10 +516,35 @@ int GL2_ShimInit( void )
|
|||||||
0x0027, // out = tex0 * vcolor + FEAT_FOG
|
0x0027, // out = tex0 * vcolor + FEAT_FOG
|
||||||
0x0035, // out = tex0 * ucolor + FEAT_ALPHA_TEST + 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 )
|
if ( gl2wrap_init )
|
||||||
return 0;
|
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.incremental =true;
|
||||||
gl2wrap_config.async = true;
|
gl2wrap_config.async = true;
|
||||||
gl2wrap_config.force_flush = false;
|
gl2wrap_config.force_flush = false;
|
||||||
@ -526,15 +552,52 @@ int GL2_ShimInit( void )
|
|||||||
gl2wrap_config.coherent = true;
|
gl2wrap_config.coherent = true;
|
||||||
gl2wrap_config.supports_mapbuffer = true;
|
gl2wrap_config.supports_mapbuffer = true;
|
||||||
gl2wrap_config.cycle_buffers = 4096;
|
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;
|
gl2wrap_config.version = 310;
|
||||||
|
if( gEngfuncs.Sys_CheckParm("-minshaders") )
|
||||||
|
gl2wrap_config.version = 110;
|
||||||
if(gl2wrap_config.buf_storage)
|
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)
|
if(gl2wrap_config.incremental && !gl2wrap_config.buf_storage)
|
||||||
gl2wrap_config.async = true;
|
gl2wrap_config.async = true;
|
||||||
if(gl2wrap_config.incremental)
|
if(gl2wrap_config.incremental)
|
||||||
gl2wrap_config.cycle_buffers = 4;
|
gl2wrap_config.cycle_buffers = 4;
|
||||||
if(!gl2wrap_config.vao_mandatory)
|
if(!gl2wrap_config.vao_mandatory)
|
||||||
gl2wrap_config.cycle_buffers = 1;
|
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 ) );
|
memset( &gl2wrap, 0, sizeof( gl2wrap ) );
|
||||||
GL2_ShimInstall();
|
GL2_ShimInstall();
|
||||||
@ -586,10 +649,17 @@ int GL2_ShimInit( void )
|
|||||||
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
|
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(): %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;
|
gl2wrap_init = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user