From a1ae770f70546270850214152ad2e43fb37f9a6a Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 9 Aug 2019 03:39:24 +0300 Subject: [PATCH] engine: ref: add optional export to determine actual human readable renderer name --- engine/client/ref_common.c | 69 +++++++++++++++++++++++++++++-------- engine/client/ref_common.h | 9 +++++ engine/common/com_strings.h | 3 ++ engine/ref_api.h | 4 +++ ref_gl/gl_context.c | 18 +++++++--- 5 files changed, 85 insertions(+), 18 deletions(-) diff --git a/engine/client/ref_common.c b/engine/client/ref_common.c index a7c1a9ba..4157ba10 100644 --- a/engine/client/ref_common.c +++ b/engine/client/ref_common.c @@ -430,23 +430,16 @@ static qboolean R_LoadProgs( const char *name ) if( ref.hInstance ) R_UnloadProgs(); -#ifdef XASH_INTERNAL_GAMELIBS - if( !(ref.hInstance = COM_LoadLibrary( name, false, true ) )) - { - return false; - } -#else FS_AllowDirectPaths( true ); if( !(ref.hInstance = COM_LoadLibrary( name, false, true ) )) { FS_AllowDirectPaths( false ); return false; } -#endif FS_AllowDirectPaths( false ); - if( ( GetRefAPI = (REFAPI)COM_GetProcAddress( ref.hInstance, "GetRefAPI" )) == NULL ) + if( !( GetRefAPI = (REFAPI)COM_GetProcAddress( ref.hInstance, GET_REF_API )) ) { COM_FreeLibrary( ref.hInstance ); Con_Reportf( "R_LoadProgs: can't init renderer API\n" ); @@ -509,13 +502,12 @@ static void R_GetRendererName( char *dest, size_t size, const char *opt ) if( !Q_strstr( opt, va( ".%s", OS_LIB_EXT ))) { // shortened renderer name - Q_snprintf( dest, size, "%sref_%s.%s", -#ifdef OS_LIB_PREFIX - OS_LIB_PREFIX, +#ifdef XASH_INTERNAL_GAMELIBS + Q_snprintf( dest, size, "ref_%s", opt ); #else - "", + Q_snprintf( dest, size, "%sref_%s.%s", + OS_LIB_PREFIX, opt, OS_LIB_EXT ); #endif - opt, OS_LIB_EXT ); Con_Printf( "Loading renderer by short name: %s\n", opt ); } else @@ -574,10 +566,57 @@ static void SetFullscreenModeFromCommandLine( ) #endif } +void R_CollectRendererNames( void ) +{ + const char *renderers[] = DEFAULT_RENDERERS; + int i; + + ref.numRenderers = 0; + + for( i = 0; i < ARRAYSIZE( ref.renderers ); i++ ) + { + ref_renderer_t *refdll = ref.renderers + ref.numRenderers; + string temp; + void *dll, *pfn; + + R_GetRendererName( temp, sizeof( temp ), renderers[i] ); + + dll = COM_LoadLibrary( temp, false, true ); + if( !dll ) + continue; + + pfn = COM_GetProcAddress( dll, GET_REF_API ); + if( !pfn ) + { + COM_FreeLibrary( dll ); + continue; + } + + Q_strncpy( refdll->shortenedName, renderers[i], sizeof( refdll->shortenedName )); + + pfn = COM_GetProcAddress( dll, GET_REF_HUMANREADABLE_NAME ); + if( !pfn ) // just in case + { + Q_strncpy( refdll->humanReadable, renderers[i], sizeof( refdll->humanReadable )); + } + else + { + REF_HUMANREADABLE_NAME GetHumanReadableName = (REF_HUMANREADABLE_NAME)pfn; + + GetHumanReadableName( refdll->humanReadable, sizeof( refdll->humanReadable )); + } + + Con_Printf( "Found renderer %s: %s\n", refdll->shortenedName, refdll->humanReadable ); + + ref.numRenderers++; + COM_FreeLibrary( dll ); + continue; + } +} + qboolean R_Init( void ) { qboolean success = false; - int i; string refopt; gl_vsync = Cvar_Get( "gl_vsync", "0", FCVAR_ARCHIVE, "enable vertical syncronization" ); @@ -598,6 +637,8 @@ qboolean R_Init( void ) SetWidthAndHeightFromCommandLine(); SetFullscreenModeFromCommandLine(); + R_CollectRendererNames(); + // command line have priority if( !Sys_GetParmFromCmdLine( "-ref", refopt ) ) { diff --git a/engine/client/ref_common.h b/engine/client/ref_common.h index 19d527a0..aa07b2f0 100644 --- a/engine/client/ref_common.h +++ b/engine/client/ref_common.h @@ -20,12 +20,21 @@ GNU General Public License for more details. #define RP_LOCALCLIENT( e ) ((e) != NULL && (e)->index == ( cl.playernum + 1 ) && e->player ) +typedef struct ref_renderer_s +{ + string shortenedName; + string humanReadable; +} ref_renderer_t; + struct ref_state_s { qboolean initialized; HINSTANCE hInstance; ref_interface_t dllFuncs; + + int numRenderers; + ref_renderer_t renderers[DEFAULT_RENDERERS_LEN]; }; extern struct ref_state_s ref; diff --git a/engine/common/com_strings.h b/engine/common/com_strings.h index e9a5cc7e..fb484ae8 100644 --- a/engine/common/com_strings.h +++ b/engine/common/com_strings.h @@ -65,4 +65,7 @@ GNU General Public License for more details. #define XASH_ENGINE_NAME "Xash3D FWGS" +#define DEFAULT_RENDERERS { "gl", "gles1", "gles2", "soft" } +#define DEFAULT_RENDERERS_LEN 4 + #endif//COM_STRINGS_H diff --git a/engine/ref_api.h b/engine/ref_api.h index 932ff9e0..848cc5c8 100644 --- a/engine/ref_api.h +++ b/engine/ref_api.h @@ -609,5 +609,9 @@ typedef struct ref_interface_s } ref_interface_t; typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t* engfuncs, ref_globals_t *pGlobals ); +#define GET_REF_API "GetRefAPI" + +typedef void (*REF_HUMANREADABLE_NAME)( char *out, size_t len ); +#define GET_REF_HUMANREADABLE_NAME "GetRefHumanReadableName" #endif // REF_API diff --git a/ref_gl/gl_context.c b/ref_gl/gl_context.c index 91f79c56..5bc961b4 100644 --- a/ref_gl/gl_context.c +++ b/ref_gl/gl_context.c @@ -120,7 +120,9 @@ void Mod_UnloadTextures( model_t *mod ) case mod_sprite: Mod_SpriteUnloadTextures( mod->cache.data ); break; - default: gEngfuncs.Host_Error( "Mod_UnloadModel: unsupported type %d\n", mod->type ); + default: + ASSERT( 0 ); + break; } } @@ -130,8 +132,6 @@ qboolean Mod_ProcessRenderData( model_t *mod, qboolean create, const byte *buf ) if( create ) { - - switch( mod->type ) { case mod_studio: @@ -146,7 +146,6 @@ qboolean Mod_ProcessRenderData( model_t *mod, qboolean create, const byte *buf ) case mod_brush: // Mod_LoadBrushModel( mod, buf, loaded ); break; - default: gEngfuncs.Host_Error( "Mod_LoadModel: unsupported type %d\n", mod->type ); } } @@ -472,3 +471,14 @@ int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, return REF_API_VERSION; } + +void EXPORT GetRefHumanReadableName( char *out, size_t size ) +{ +#if defined XASH_NANOGL + Q_strncpy( out, "OpenGLES 1(NanoGL)", size ); +#elif defined XASH_WES + Q_strncpy( out, "OpenGLES 2(gl-wes-v2)", size ); +#else + Q_strncpy( out, "OpenGL 1.x", size ); +#endif +}