mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
ref/gl: refactor gl extension checking again
This commit is contained in:
@@ -556,61 +556,70 @@ qboolean GL_CheckExtension( const char *name, const dllfunc_t *funcs, const char
|
|||||||
for( func = funcs; func && func->name; func++ )
|
for( func = funcs; func && func->name; func++ )
|
||||||
{
|
{
|
||||||
// functions are cleared before all the extensions are evaluated
|
// functions are cleared before all the extensions are evaluated
|
||||||
#ifndef XASH_GLES // arb on gles is last (TODO: separate search tables for GLES/CORE)
|
string name;
|
||||||
if(( *func->func = (void *)gEngfuncs.GL_GetProcAddress( func->name )) == NULL )
|
char *end;
|
||||||
#endif
|
size_t i = 0;
|
||||||
{
|
qboolean first_try = true;
|
||||||
string name;
|
// NULL means just func->name, but empty suffix cuts ARB suffix if present
|
||||||
char *end;
|
|
||||||
size_t i = 0;
|
|
||||||
#ifdef XASH_GLES
|
#ifdef XASH_GLES
|
||||||
const char *suffixes[] = { "", "EXT", "OES", "ARB" };
|
const char *suffixes[] = { "", "EXT", "OES", NULL, "ARB" };
|
||||||
#else
|
#else
|
||||||
const char *suffixes[] = { "", "EXT" };
|
const char *suffixes[] = { NULL, "", "EXT", "ARB" };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// HACK: fix ARB names
|
// Remove ARB suffix
|
||||||
Q_strncpy( name, func->name, sizeof( name ));
|
Q_strncpy( name, func->name, sizeof( name ));
|
||||||
if(( end = Q_strstr( name, "ARB" )))
|
if(( end = Q_strstr( name, "ARB" )))
|
||||||
{
|
{
|
||||||
*end = '\0';
|
*end = '\0';
|
||||||
}
|
}
|
||||||
else // I need Q_strstrnul
|
else // I need Q_strstrnul
|
||||||
{
|
{
|
||||||
end = name + Q_strlen( name );
|
end = name + Q_strlen( name );
|
||||||
#ifndef XASH_GLES
|
}
|
||||||
i++; // skip empty suffix
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
for( ; i < sizeof( suffixes ) / sizeof( suffixes[0] ); i++ )
|
for( ; i < sizeof( suffixes ) / sizeof( suffixes[0] ); i++ )
|
||||||
{
|
{
|
||||||
void *f;
|
void *f;
|
||||||
|
const char *pname = name;
|
||||||
|
size_t name_len = end - pname;
|
||||||
|
const char *orig_suffix = func->name + name_len;
|
||||||
|
|
||||||
|
if( suffixes[i] )
|
||||||
|
{
|
||||||
|
// if suffix is original suffix, it's handled with NULL
|
||||||
|
if( orig_suffix[0] && !Q_strcmp( orig_suffix, suffixes[i] ))
|
||||||
|
continue;
|
||||||
Q_strncat( name, suffixes[i], sizeof( name ));
|
Q_strncat( name, suffixes[i], sizeof( name ));
|
||||||
|
|
||||||
if(( f = gEngfuncs.GL_GetProcAddress( name )))
|
|
||||||
{
|
|
||||||
// GL_GetProcAddress prints errors about missing functions, so tell user that we found it with different name
|
|
||||||
#ifdef XASH_GLES
|
|
||||||
if(i != 0)
|
|
||||||
#endif
|
|
||||||
gEngfuncs.Con_Printf( S_NOTE "found %s\n", name );
|
|
||||||
|
|
||||||
*func->func = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*end = '\0'; // cut suffix, try next
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// not found...
|
|
||||||
if( i == sizeof( suffixes ) / sizeof( suffixes[0] ))
|
|
||||||
{
|
{
|
||||||
GL_SetExtension( r_ext, false );
|
// if original name does not have a suffix, it will be handled with empty suffix
|
||||||
|
if( !orig_suffix[0] )
|
||||||
|
continue;
|
||||||
|
pname = func->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(( f = gEngfuncs.GL_GetProcAddress( pname )))
|
||||||
|
{
|
||||||
|
// if we already tried this function, notify about success after previous error from GL_GetProcAddress
|
||||||
|
if(!first_try)
|
||||||
|
gEngfuncs.Con_Printf( S_NOTE "found %s\n", pname );
|
||||||
|
first_try = false;
|
||||||
|
|
||||||
|
*func->func = f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*end = '\0'; // cut suffix, try next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// not found...
|
||||||
|
if( i == sizeof( suffixes ) / sizeof( suffixes[0] ))
|
||||||
|
{
|
||||||
|
GL_SetExtension( r_ext, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user