@ -15,6 +15,7 @@ convar_t *r_adjust_fov;
convar_t * r_showtree ;
convar_t * r_showtree ;
convar_t * gl_wgl_msaa_samples ;
convar_t * gl_wgl_msaa_samples ;
convar_t * gl_clear ;
convar_t * gl_clear ;
convar_t * r_refdll ;
void R_GetTextureParms ( int * w , int * h , int texnum )
void R_GetTextureParms ( int * w , int * h , int texnum )
{
{
@ -56,11 +57,6 @@ static int pfnEngineGetParm( int parm, int arg )
return CL_RenderGetParm ( parm , arg , false ) ; // prevent recursion
return CL_RenderGetParm ( parm , arg , false ) ; // prevent recursion
}
}
static void pfnCbuf_SetOpenGLConfigHack ( qboolean set )
{
host . apply_opengl_config = set ;
}
static world_static_t * pfnGetWorld ( void )
static world_static_t * pfnGetWorld ( void )
{
{
return & world ;
return & world ;
@ -218,6 +214,16 @@ static qboolean R_DoResetGamma( void )
}
}
}
}
static qboolean R_Init_Video_ ( const int type )
{
host . apply_opengl_config = true ;
Cbuf_AddText ( va ( " exec %s.cfg " , ref . dllFuncs . R_GetConfigName ( ) ) ) ;
Cbuf_Execute ( ) ;
host . apply_opengl_config = false ;
return R_Init_Video ( type ) ;
}
static ref_api_t gEngfuncs =
static ref_api_t gEngfuncs =
{
{
pfnEngineGetParm ,
pfnEngineGetParm ,
@ -240,7 +246,6 @@ static ref_api_t gEngfuncs =
Cbuf_AddText ,
Cbuf_AddText ,
Cbuf_InsertText ,
Cbuf_InsertText ,
Cbuf_Execute ,
Cbuf_Execute ,
pfnCbuf_SetOpenGLConfigHack ,
Con_Printf ,
Con_Printf ,
Con_DPrintf ,
Con_DPrintf ,
@ -326,7 +331,7 @@ static ref_api_t gEngfuncs =
FS_FileExists ,
FS_FileExists ,
FS_AllowDirectPaths ,
FS_AllowDirectPaths ,
R_Init_Video ,
R_Init_Video_ ,
R_Free_Video ,
R_Free_Video ,
GL_SetAttribute ,
GL_SetAttribute ,
@ -499,39 +504,81 @@ void R_Shutdown( void )
ref . initialized = false ;
ref . initialized = false ;
}
}
void R_GetRendererName ( char * dest , size_t size , const char * refdll )
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 " ,
Q_snprintf ( dest , size , " %sref_%s.%s " ,
# ifdef OS_LIB_PREFIX
# ifdef OS_LIB_PREFIX
OS_LIB_PREFIX ,
OS_LIB_PREFIX ,
# else
# else
" " ,
" " ,
# endif
# endif
refdll , OS_LIB_EXT ) ;
opt , OS_LIB_EXT ) ;
Con_Printf ( " Loading renderer by short name: %s \n " , opt ) ;
}
else
{
// full path
Q_strcpy ( dest , opt ) ;
Con_Printf ( " Loading renderer: %s \n " , opt ) ;
}
}
}
qboolean R_Init ( void )
static qboolean R_LoadRenderer ( const char * refopt )
{
{
string refopt , refdll ;
string refdll ;
if ( ! Sys_GetParmFromCmdLine ( " -ref " , refopt ) )
R_GetRendererName ( refdll , sizeof ( refdll ) , refopt ) ;
if ( ! R_LoadProgs ( refdll ) )
{
{
// compile-time defaults
R_Shutdown ( ) ;
R_GetRendererName ( refdll , sizeof ( refdll ) , DEFAULT_RENDERER ) ;
Sys_Warn ( S_ERROR " Can't initialize %s renderer! \n " , refdll ) ;
Con_Printf ( " Loading default renderer: %s \n " , refdll ) ;
return false ;
}
}
else if ( ! Q_strstr ( refopt , va ( " .%s " , OS_LIB_EXT ) ) )
Con_Reportf ( " Renderer %s initialized \n " , refdll ) ;
return true ;
}
static void SetWidthAndHeightFromCommandLine ( )
{
int width , height ;
Sys_GetIntFromCmdLine ( " -width " , & width ) ;
Sys_GetIntFromCmdLine ( " -height " , & height ) ;
if ( width < 1 | | height < 1 )
{
{
// shortened renderer name
// Not specified or invalid, so don't bother.
R_GetRendererName ( refdll , sizeof ( refdll ) , refopt ) ;
return ;
Con_Printf ( " Loading renderer by short name: %s \n " , refdll ) ;
}
}
else
R_SaveVideoMode ( width , height ) ;
}
static void SetFullscreenModeFromCommandLine ( )
{
# ifndef __ANDROID__
if ( Sys_CheckParm ( " -fullscreen " ) )
{
{
// full path
Cvar_Set ( " fullscreen " , " 1 " ) ;
Q_strcpy ( refdll , refopt ) ;
}
Con_Printf ( " Loading renderer: %s \n " , refdll ) ;
else if ( Sys_CheckParm ( " -windowed " ) )
{
Cvar_Set ( " fullscreen " , " 0 " ) ;
}
}
# endif
}
qboolean R_Init ( void )
{
qboolean success = false ;
int i ;
string refopt ;
gl_vsync = Cvar_Get ( " gl_vsync " , " 0 " , FCVAR_ARCHIVE , " enable vertical syncronization " ) ;
gl_vsync = Cvar_Get ( " gl_vsync " , " 0 " , FCVAR_ARCHIVE , " enable vertical syncronization " ) ;
gl_showtextures = Cvar_Get ( " gl_showtextures " , " 0 " , FCVAR_CHEAT , " show all uploaded textures " ) ;
gl_showtextures = Cvar_Get ( " gl_showtextures " , " 0 " , FCVAR_CHEAT , " show all uploaded textures " ) ;
@ -540,15 +587,45 @@ qboolean R_Init( void )
gl_wgl_msaa_samples = Cvar_Get ( " gl_wgl_msaa_samples " , " 0 " , FCVAR_GLCONFIG , " samples number for multisample anti-aliasing " ) ;
gl_wgl_msaa_samples = Cvar_Get ( " gl_wgl_msaa_samples " , " 0 " , FCVAR_GLCONFIG , " samples number for multisample anti-aliasing " ) ;
gl_clear = Cvar_Get ( " gl_clear " , " 0 " , FCVAR_ARCHIVE , " clearing screen after each frame " ) ;
gl_clear = Cvar_Get ( " gl_clear " , " 0 " , FCVAR_ARCHIVE , " clearing screen after each frame " ) ;
r_showtree = Cvar_Get ( " r_showtree " , " 0 " , FCVAR_ARCHIVE , " build the graph of visible BSP tree " ) ;
r_showtree = Cvar_Get ( " r_showtree " , " 0 " , FCVAR_ARCHIVE , " build the graph of visible BSP tree " ) ;
r_refdll = Cvar_Get ( " r_refdll " , " " , FCVAR_RENDERINFO | FCVAR_VIDRESTART , " choose renderer implementation, if supported " ) ;
if ( ! R_LoadProgs ( refdll ) )
// cvars are created, execute video config
Cbuf_AddText ( " exec video.cfg " ) ;
Cbuf_Execute ( ) ;
// Set screen resolution and fullscreen mode if passed in on command line.
// this is done after executing video.cfg, as the command line values should take priority.
SetWidthAndHeightFromCommandLine ( ) ;
SetFullscreenModeFromCommandLine ( ) ;
// command line have priority
if ( ! Sys_GetParmFromCmdLine ( " -ref " , refopt ) )
{
{
R_Shutdown ( ) ;
// r_refdll is set to empty by default, so we can change hardcoded defaults just in case
Host_Error ( " Can't initialize %s renderer! \n " , refdll ) ;
Q_strncpy ( refopt , COM_CheckString ( r_refdll - > string ) ?
return false ;
r_refdll - > string : DEFAULT_ACCELERATED_RENDERER , sizeof ( refopt ) ) ;
}
}
Con_Reportf ( " Renderer %s initialized \n " , refdll ) ;
if ( ! ( success = R_LoadRenderer ( refopt ) ) )
{
// check if we are tried to load default accelearated renderer already
// and if not, load it first
if ( Q_strcmp ( refopt , DEFAULT_ACCELERATED_RENDERER ) )
{
success = R_LoadRenderer ( refopt ) ;
}
// software renderer is the last chance...
if ( ! success )
{
success = R_LoadRenderer ( DEFAULT_SOFTWARE_RENDERER ) ;
}
}
if ( ! success )
{
Host_Error ( " Can't initialize any renderer. Check your video drivers! " ) ;
}
SCR_Init ( ) ;
SCR_Init ( ) ;