ref: context creating prototype, not working yet

This commit is contained in:
Alibek Omarov 2019-03-16 05:15:32 +03:00
parent 971f9b6de5
commit e5000742f1
11 changed files with 302 additions and 211 deletions

View File

@ -1236,7 +1236,7 @@ static qboolean CL_LoadHudSprite( const char *szSpriteName, model_t *m_pSprite,
if( type == SPR_MAPSPRITE ) if( type == SPR_MAPSPRITE )
ref.dllFuncs.Mod_LoadMapSprite( m_pSprite, buf, size, &loaded ); ref.dllFuncs.Mod_LoadMapSprite( m_pSprite, buf, size, &loaded );
else ref.dllFuncs.Mod_LoadModel( mod_sprite, m_pSprite, buf, &loaded, texFlags ); else Mod_LoadSpriteModel( m_pSprite, buf, &loaded, texFlags );
Mem_Free( buf ); Mem_Free( buf );

View File

@ -2,6 +2,7 @@
#include "client.h" #include "client.h"
#include "library.h" #include "library.h"
#include "cl_tent.h" #include "cl_tent.h"
#include "platform/platform.h"
struct ref_state_s ref; struct ref_state_s ref;
ref_globals_t refState; ref_globals_t refState;
@ -321,6 +322,7 @@ static ref_api_t gEngfuncs =
pfnCL_GetPaletteColor, pfnCL_GetPaletteColor,
pfnCL_GetScreenInfo, pfnCL_GetScreenInfo,
pfnSetLocalLightLevel, pfnSetLocalLightLevel,
Sys_CheckParm,
pfnPlayerInfo, pfnPlayerInfo,
R_StudioGetPlayerState, R_StudioGetPlayerState,
@ -344,11 +346,12 @@ static ref_api_t gEngfuncs =
FS_FileExists, FS_FileExists,
FS_AllowDirectPaths, FS_AllowDirectPaths,
NULL, R_Init_Video,
NULL, R_Free_Video,
NULL,
NULL, GL_SetAttribute,
NULL, GL_GetAttribute,
GL_GetProcAddress,
BuildGammaTable, BuildGammaTable,
LightToTexGamma, LightToTexGamma,
@ -531,6 +534,7 @@ qboolean R_Init( void )
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" );
r_adjust_fov = Cvar_Get( "r_adjust_fov", "1", FCVAR_ARCHIVE, "making FOV adjustment for wide-screens" ); r_adjust_fov = Cvar_Get( "r_adjust_fov", "1", FCVAR_ARCHIVE, "making FOV adjustment for wide-screens" );
r_decals = Cvar_Get( "r_decals", "4096", FCVAR_ARCHIVE, "sets the maximum number of decals" ); r_decals = Cvar_Get( "r_decals", "4096", FCVAR_ARCHIVE, "sets the maximum number of decals" );
gl_wgl_msaa_samples = Cvar_Get( "gl_wgl_msaa_samples", "0", FCVAR_GLCONFIG, "samples number for multisample anti-aliasing" );
if( !R_LoadProgs( refdll )) if( !R_LoadProgs( refdll ))
{ {

View File

@ -194,6 +194,23 @@ qboolean VGui_IsActive( void )
return vgui.initialized; return vgui.initialized;
} }
void VGui_FillAPIFromRef( vguiapi_t *to, const ref_interface_t *from )
{
to->DrawInit = from->VGUI_DrawInit;
to->DrawShutdown = from->VGUI_DrawShutdown;
to->SetupDrawingText = from->VGUI_SetupDrawingText;
to->SetupDrawingRect = from->VGUI_SetupDrawingRect;
to->SetupDrawingImage = from->VGUI_SetupDrawingImage;
to->BindTexture = from->VGUI_BindTexture;
to->EnableTexture = from->VGUI_EnableTexture;
to->CreateTexture = from->VGUI_CreateTexture;
to->UploadTexture = from->VGUI_UploadTexture;
to->UploadTextureBlock = from->VGUI_UploadTextureBlock;
to->DrawQuad = from->VGUI_DrawQuad;
to->GetTextureSizes = from->VGUI_GetTextureSizes;
to->GenerateTexture = from->VGUI_GenerateTexture;
}
/* /*
================ ================
VGui_Startup VGui_Startup
@ -218,6 +235,8 @@ void VGui_Startup( int width, int height )
{ {
vgui_utf8 = Cvar_Get( "vgui_utf8", "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" ); vgui_utf8 = Cvar_Get( "vgui_utf8", "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" );
VGui_FillAPIFromRef( &vgui, &ref.dllFuncs );
#ifdef XASH_INTERNAL_GAMELIBS #ifdef XASH_INTERNAL_GAMELIBS
s_pVGuiSupport = COM_LoadLibrary( "client", false, false ); s_pVGuiSupport = COM_LoadLibrary( "client", false, false );

View File

@ -29,7 +29,6 @@ convar_t *vid_highdpi;
vidstate_t vidState; vidstate_t vidState;
glwstate_t glw_state; glwstate_t glw_state;
glcontext_t glContext;
convar_t *window_xpos; convar_t *window_xpos;
convar_t *window_ypos; convar_t *window_ypos;

View File

@ -13,19 +13,6 @@ typedef struct vidmode_s
} vidmode_t; } vidmode_t;
typedef enum
{
SAFE_NO = 0,
SAFE_NOMSAA, // skip msaa
SAFE_NOACC, // don't set acceleration flag
SAFE_NOSTENCIL, // don't set stencil bits
SAFE_NOALPHA, // don't set alpha bits
SAFE_NODEPTH, // don't set depth bits
SAFE_NOCOLOR, // don't set color bits
SAFE_DONTCARE // ignore everything, let SDL/EGL decide
} safe_context_t;
typedef struct typedef struct
{ {
void* context; // handle to GL rendering context void* context; // handle to GL rendering context
@ -37,9 +24,10 @@ typedef struct
qboolean initialized; // OpenGL subsystem started qboolean initialized; // OpenGL subsystem started
qboolean extended; // extended context allows to GL_Debug qboolean extended; // extended context allows to GL_Debug
} glwstate_t;
} glwstate_t;
typedef struct vidstate_s typedef struct vidstate_s
{ {
int width, height; int width, height;
@ -48,25 +36,8 @@ typedef struct vidstate_s
qboolean wideScreen; qboolean wideScreen;
} vidstate_t; } vidstate_t;
// engine will manage opengl contexts with window system (egl/sdl or wgl/glx if needed)
typedef struct glcontext_s
{
/// make renderapi defs acessible here?
// gl_context_type_t context;
// gles_wrapper_t wrapper;
int color_bits;
int alpha_bits;
int depth_bits;
int stencil_bits;
int msaasamples;
int max_multisamples;
} glcontext_t;
extern vidstate_t vidState; extern vidstate_t vidState;
extern glwstate_t glw_state; extern glwstate_t glw_state;
extern glcontext_t glContext;
#define VID_MIN_HEIGHT 200 #define VID_MIN_HEIGHT 200
#define VID_MIN_WIDTH 320 #define VID_MIN_WIDTH 320

View File

@ -90,6 +90,8 @@ int R_MaxVideoModes();
vidmode_t*R_GetVideoMode( int num ); vidmode_t*R_GetVideoMode( int num );
void* GL_GetProcAddress( const char *name ); // RenderAPI requirement void* GL_GetProcAddress( const char *name ); // RenderAPI requirement
void GL_UpdateSwapInterval( void ); void GL_UpdateSwapInterval( void );
int GL_SetAttribute( int attr, int val );
int GL_GetAttribute( int attr, int *val );
/* /*
============================================================================== ==============================================================================

View File

@ -23,7 +23,6 @@ GNU General Public License for more details.
static vidmode_t *vidmodes = NULL; static vidmode_t *vidmodes = NULL;
static int num_vidmodes = 0; static int num_vidmodes = 0;
static int context_flags = 0;
static void GL_SetupAttributes( void ); static void GL_SetupAttributes( void );
int R_MaxVideoModes( void ) int R_MaxVideoModes( void )
@ -231,34 +230,13 @@ GL_CreateContext
*/ */
qboolean GL_CreateContext( void ) qboolean GL_CreateContext( void )
{ {
int colorBits[3];
#ifdef XASH_NANOGL
nanoGL_Init();
#endif
if( ( glw_state.context = SDL_GL_CreateContext( host.hWnd ) ) == NULL) if( ( glw_state.context = SDL_GL_CreateContext( host.hWnd ) ) == NULL)
{ {
Con_Reportf( S_ERROR "GL_CreateContext: %s\n", SDL_GetError()); Con_Reportf( S_ERROR "GL_CreateContext: %s\n", SDL_GetError());
return GL_DeleteContext(); return GL_DeleteContext();
} }
SDL_GL_GetAttribute( SDL_GL_RED_SIZE, &colorBits[0] ); ref.dllFuncs.GL_OnContextCreated();
SDL_GL_GetAttribute( SDL_GL_GREEN_SIZE, &colorBits[1] );
SDL_GL_GetAttribute( SDL_GL_BLUE_SIZE, &colorBits[2] );
glContext.color_bits = colorBits[0] + colorBits[1] + colorBits[2];
SDL_GL_GetAttribute( SDL_GL_ALPHA_SIZE, &glContext.alpha_bits );
SDL_GL_GetAttribute( SDL_GL_DEPTH_SIZE, &glContext.depth_bits );
SDL_GL_GetAttribute( SDL_GL_STENCIL_SIZE, &glContext.stencil_bits );
/// move to ref
//vidState.stencilEnabled = glContext.stencil_bits ? true : false;
SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &glContext.msaasamples );
#ifdef XASH_WES
void wes_init();
wes_init();
#endif
return true; return true;
} }
@ -388,7 +366,7 @@ qboolean VID_CreateWindow( int width, int height, qboolean fullscreen )
if( !gl_wgl_msaa_samples->value && glw_state.safe + 1 == SAFE_NOMSAA ) if( !gl_wgl_msaa_samples->value && glw_state.safe + 1 == SAFE_NOMSAA )
glw_state.safe += 2; // no need to skip msaa, if we already disabled it glw_state.safe += 2; // no need to skip msaa, if we already disabled it
else glw_state.safe++; else glw_state.safe++;
GL_SetupAttributes(); // re-choose attributes GL_SetupAttributes( ); // re-choose attributes
// try again // try again
return VID_CreateWindow( width, height, fullscreen ); return VID_CreateWindow( width, height, fullscreen );
@ -505,132 +483,19 @@ GL_SetupAttributes
*/ */
static void GL_SetupAttributes( void ) static void GL_SetupAttributes( void )
{ {
int samples;
#if !defined(_WIN32)
SDL_SetHint( "SDL_VIDEO_X11_XRANDR", "1" );
SDL_SetHint( "SDL_VIDEO_X11_XVIDMODE", "1" );
#endif
SDL_GL_ResetAttributes(); SDL_GL_ResetAttributes();
#ifdef XASH_GLES ref.dllFuncs.GL_SetupAttributes( glw_state.safe );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES ); }
SDL_GL_SetAttribute( SDL_GL_CONTEXT_EGL, 1 );
#ifdef XASH_NANOGL
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 1 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
#elif defined( XASH_WES ) || defined( XASH_REGAL )
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
#endif
#else // GL1.x
#ifndef XASH_GL_STATIC
if( Sys_CheckParm( "-gldebug" ) )
{
Con_Reportf( "Creating an extended GL context for debug...\n" );
SetBits( context_flags, FCONTEXT_DEBUG_ARB );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG );
glw_state.extended = true;
}
#endif // XASH_GL_STATIC
if( Sys_CheckParm( "-glcore" ))
{
SetBits( context_flags, FCONTEXT_CORE_PROFILE );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE ); int GL_SetAttribute( int attr, int val )
} {
else return SDL_GL_SetAttribute( (SDL_GLattr)attr, val );
{ }
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY );
}
#endif // XASH_GLES
if( glw_state.safe > SAFE_DONTCARE ) int GL_GetAttribute( int attr, int *val )
{ {
glw_state.safe = -1; // can't retry anymore, can only shutdown engine return SDL_GL_GetAttribute( (SDL_GLattr)attr, val );
return;
}
Msg( "Trying safe opengl mode %d\n", glw_state.safe );
if( glw_state.safe == SAFE_DONTCARE )
return;
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
if( glw_state.safe < SAFE_NOACC )
SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 );
Msg( "bpp %d\n", glw_state.desktopBitsPixel );
/// ref context attribs api
// if( glw_state.safe < SAFE_NOSTENCIL )
// SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, gl_stencilbits->value );
if( glw_state.safe < SAFE_NOALPHA )
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
if( glw_state.safe < SAFE_NODEPTH )
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24 );
else
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 8 );
if( glw_state.safe < SAFE_NOCOLOR )
{
if( glw_state.desktopBitsPixel >= 24 )
{
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
}
else if( glw_state.desktopBitsPixel >= 16 )
{
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 6 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
}
else
{
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 3 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 3 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 2 );
}
}
if( glw_state.safe < SAFE_NOMSAA )
{
switch( (int)gl_wgl_msaa_samples->value )
{
case 2:
case 4:
case 8:
case 16:
samples = gl_wgl_msaa_samples->value;
break;
default:
samples = 0; // don't use, because invalid parameter is passed
}
if( samples )
{
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, samples );
glContext.max_multisamples = samples;
}
else
{
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 0 );
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 0 );
glContext.max_multisamples = 0;
}
}
else
{
Cvar_Set( "gl_wgl_msaa_samples", "0" );
}
} }
#ifndef EGL_LIB #ifndef EGL_LIB
@ -656,7 +521,13 @@ qboolean R_Init_Video( void )
if( !glw_state.safe && Sys_GetParmFromCmdLine( "-safegl", safe ) ) if( !glw_state.safe && Sys_GetParmFromCmdLine( "-safegl", safe ) )
glw_state.safe = bound( SAFE_NO, Q_atoi( safe ), SAFE_DONTCARE ); glw_state.safe = bound( SAFE_NO, Q_atoi( safe ), SAFE_DONTCARE );
GL_SetupAttributes(); #if !defined(_WIN32)
SDL_SetHint( "SDL_VIDEO_X11_XRANDR", "1" );
SDL_SetHint( "SDL_VIDEO_X11_XVIDMODE", "1" );
#endif
// refdll can request some attributes
GL_SetupAttributes( );
if( SDL_GL_LoadLibrary( EGL_LIB ) ) if( SDL_GL_LoadLibrary( EGL_LIB ) )
{ {
@ -676,8 +547,11 @@ qboolean R_Init_Video( void )
return retval; return retval;
} }
// refdll also can check extensions
ref.dllFuncs.GL_InitExtensions(); ref.dllFuncs.GL_InitExtensions();
host.renderinfo_changed = false;
return true; return true;
} }

View File

@ -144,6 +144,72 @@ enum ref_defaultsprite_e
REF_CHROME_SPRITE // cl_sprite_shell REF_CHROME_SPRITE // cl_sprite_shell
}; };
enum ref_graphic_apis_e
{
REF_SOFTWARE, // hypothetical: just make a surface to draw on, in software
REF_GL, // create GL context
};
typedef enum
{
SAFE_NO = 0,
SAFE_NOMSAA, // skip msaa
SAFE_NOACC, // don't set acceleration flag
SAFE_NOSTENCIL, // don't set stencil bits
SAFE_NOALPHA, // don't set alpha bits
SAFE_NODEPTH, // don't set depth bits
SAFE_NOCOLOR, // don't set color bits
SAFE_DONTCARE // ignore everything, let SDL/EGL decide
} ref_safegl_context_t;
// binary compatible with SDL2
enum // OpenGL configuration attributes
{
REF_GL_RED_SIZE,
REF_GL_GREEN_SIZE,
REF_GL_BLUE_SIZE,
REF_GL_ALPHA_SIZE,
REF_GL_BUFFER_SIZE,
REF_GL_DOUBLEBUFFER,
REF_GL_DEPTH_SIZE,
REF_GL_STENCIL_SIZE,
REF_GL_ACCUM_RED_SIZE,
REF_GL_ACCUM_GREEN_SIZE,
REF_GL_ACCUM_BLUE_SIZE,
REF_GL_ACCUM_ALPHA_SIZE,
REF_GL_STEREO,
REF_GL_MULTISAMPLEBUFFERS,
REF_GL_MULTISAMPLESAMPLES,
REF_GL_ACCELERATED_VISUAL,
REF_GL_RETAINED_BACKING,
REF_GL_CONTEXT_MAJOR_VERSION,
REF_GL_CONTEXT_MINOR_VERSION,
REF_GL_CONTEXT_EGL,
REF_GL_CONTEXT_FLAGS,
REF_GL_CONTEXT_PROFILE_MASK,
REF_GL_SHARE_WITH_CURRENT_CONTEXT,
REF_GL_FRAMEBUFFER_SRGB_CAPABLE,
REF_GL_CONTEXT_RELEASE_BEHAVIOR,
REF_GL_CONTEXT_RESET_NOTIFICATION,
REF_GL_CONTEXT_NO_ERROR
};
enum
{
REF_GL_CONTEXT_PROFILE_CORE = 0x0001,
REF_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002,
REF_GL_CONTEXT_PROFILE_ES = 0x0004 /**< GLX_CONTEXT_ES2_PROFILE_BIT_EXT */
};
enum
{
REF_GL_CONTEXT_DEBUG_FLAG = 0x0001,
REF_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002,
REF_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004,
REF_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008
};
struct con_nprint_s; struct con_nprint_s;
struct remap_info_s; struct remap_info_s;
@ -260,6 +326,7 @@ typedef struct ref_api_s
byte *(*CL_GetPaletteColor)(int color); // clgame.palette[color] byte *(*CL_GetPaletteColor)(int color); // clgame.palette[color]
void (*CL_GetScreenInfo)( int *width, int *height ); // clgame.scrInfo, ptrs may be NULL void (*CL_GetScreenInfo)( int *width, int *height ); // clgame.scrInfo, ptrs may be NULL
void (*SetLocalLightLevel)( int level ); // cl.local.light_level void (*SetLocalLightLevel)( int level ); // cl.local.light_level
int (*Sys_CheckParm)( const char *flag );
// studio interface // studio interface
player_info_t *(*pfnPlayerInfo)( int index ); player_info_t *(*pfnPlayerInfo)( int index );
@ -289,11 +356,15 @@ typedef struct ref_api_s
int (*FS_FileExists)( const char *filename, int gamedironly ); int (*FS_FileExists)( const char *filename, int gamedironly );
void (*FS_AllowDirectPaths)( qboolean enable ); void (*FS_AllowDirectPaths)( qboolean enable );
// video init
// try to create window
// will call GL_SetupAttributes in case of REF_GL
int (*R_Init_Video)( int type );
void (*R_Free_Video)( void );
// GL // GL
int (*GL_SetAttribute)( int attr, int value ); int (*GL_SetAttribute)( int attr, int value );
int (*GL_GetAttribute)( int attr ); int (*GL_GetAttribute)( int attr, int *value );
int (*GL_CreateContext)( void ); // TODO
void (*GL_DestroyContext)( );
void *(*GL_GetProcAddress)( const char *name ); void *(*GL_GetProcAddress)( const char *name );
// gamma // gamma
@ -347,6 +418,8 @@ typedef struct ref_interface_s
void (*R_Shutdown)( void ); void (*R_Shutdown)( void );
// //
void (*GL_SetupAttributes)( int safegl );
void (*GL_OnContextCreated)( void );
void (*GL_InitExtensions)( void ); void (*GL_InitExtensions)( void );
void (*GL_ClearExtensions)( void ); void (*GL_ClearExtensions)( void );
@ -528,6 +601,9 @@ typedef struct ref_interface_s
void (*VGUI_UploadTexture)( int id, const char *buffer, int width, int height ); void (*VGUI_UploadTexture)( int id, const char *buffer, int width, int height );
void (*VGUI_UploadTextureBlock)( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight ); void (*VGUI_UploadTextureBlock)( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight );
void (*VGUI_DrawQuad)( const vpoint_t *ul, const vpoint_t *lr ); void (*VGUI_DrawQuad)( const vpoint_t *ul, const vpoint_t *lr );
void (*VGUI_GetTextureSizes)( int *width, int *height );
int (*VGUI_GenerateTexture)( void );
} ref_interface_t; } ref_interface_t;
typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t* engfuncs, ref_globals_t *pGlobals ); typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t* engfuncs, ref_globals_t *pGlobals );

View File

@ -325,6 +325,8 @@ ref_interface_t gReffuncs =
R_Init, R_Init,
R_Shutdown, R_Shutdown,
GL_SetupAttributes,
GL_OnContextCreated,
GL_InitExtensions, GL_InitExtensions,
GL_ClearExtensions, GL_ClearExtensions,
@ -471,7 +473,9 @@ ref_interface_t gReffuncs =
VGUI_CreateTexture, VGUI_CreateTexture,
VGUI_UploadTexture, VGUI_UploadTexture,
VGUI_UploadTextureBlock, VGUI_UploadTextureBlock,
VGUI_DrawQuad VGUI_DrawQuad,
VGUI_GetTextureSizes,
VGUI_GenerateTexture,
}; };
int GAME_EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals ) int GAME_EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals )

View File

@ -516,6 +516,8 @@ int VGUI_GenerateTexture( void );
// //
qboolean R_Init( void ); qboolean R_Init( void );
void R_Shutdown( void ); void R_Shutdown( void );
void GL_SetupAttributes( int safegl );
void GL_OnContextCreated( void );
void GL_InitExtensions( void ); void GL_InitExtensions( void );
void GL_ClearExtensions( void ); void GL_ClearExtensions( void );
void VID_CheckChanges( void ); void VID_CheckChanges( void );
@ -719,7 +721,6 @@ extern convar_t *gl_extensions;
extern convar_t *gl_check_errors; extern convar_t *gl_check_errors;
extern convar_t *gl_texture_lodbias; extern convar_t *gl_texture_lodbias;
extern convar_t *gl_texture_nearest; extern convar_t *gl_texture_nearest;
extern convar_t *gl_wgl_msaa_samples;
extern convar_t *gl_lightmap_nearest; extern convar_t *gl_lightmap_nearest;
extern convar_t *gl_keeptjunctions; extern convar_t *gl_keeptjunctions;
extern convar_t *gl_emboss_scale; extern convar_t *gl_emboss_scale;

View File

@ -42,7 +42,6 @@ convar_t *gl_round_down;
convar_t *r_vbo; convar_t *r_vbo;
convar_t *r_vbo_dlightmode; convar_t *r_vbo_dlightmode;
convar_t *gl_showtextures; convar_t *gl_showtextures;
convar_t *gl_wgl_msaa_samples;
convar_t *cl_lightstyle_lerping; convar_t *cl_lightstyle_lerping;
convar_t *vid_brightness; convar_t *vid_brightness;
@ -788,7 +787,6 @@ void GL_InitCommands( void )
gl_clear = gEngfuncs.Cvar_Get( "gl_clear", "0", FCVAR_ARCHIVE, "clearing screen after each frame" ); gl_clear = gEngfuncs.Cvar_Get( "gl_clear", "0", FCVAR_ARCHIVE, "clearing screen after each frame" );
gl_test = gEngfuncs.Cvar_Get( "gl_test", "0", 0, "engine developer cvar for quick testing new features" ); gl_test = gEngfuncs.Cvar_Get( "gl_test", "0", 0, "engine developer cvar for quick testing new features" );
gl_wireframe = gEngfuncs.Cvar_Get( "gl_wireframe", "0", FCVAR_ARCHIVE|FCVAR_SPONLY, "show wireframe overlay" ); gl_wireframe = gEngfuncs.Cvar_Get( "gl_wireframe", "0", FCVAR_ARCHIVE|FCVAR_SPONLY, "show wireframe overlay" );
gl_wgl_msaa_samples = gEngfuncs.Cvar_Get( "gl_wgl_msaa_samples", "0", FCVAR_GLCONFIG, "samples number for multisample anti-aliasing" );
gl_msaa = gEngfuncs.Cvar_Get( "gl_msaa", "1", FCVAR_ARCHIVE, "enable or disable multisample anti-aliasing" ); gl_msaa = gEngfuncs.Cvar_Get( "gl_msaa", "1", FCVAR_ARCHIVE, "enable or disable multisample anti-aliasing" );
gl_stencilbits = gEngfuncs.Cvar_Get( "gl_stencilbits", "8", FCVAR_GLCONFIG, "pixelformat stencil bits (0 - auto)" ); gl_stencilbits = gEngfuncs.Cvar_Get( "gl_stencilbits", "8", FCVAR_GLCONFIG, "pixelformat stencil bits (0 - auto)" );
gl_round_down = gEngfuncs.Cvar_Get( "gl_round_down", "2", FCVAR_RENDERINFO, "round texture sizes to nearest POT value" ); gl_round_down = gEngfuncs.Cvar_Get( "gl_round_down", "2", FCVAR_RENDERINFO, "round texture sizes to nearest POT value" );
@ -866,6 +864,16 @@ static void R_CheckVBO( void )
r_vbo->flags |= FCVAR_ARCHIVE; r_vbo->flags |= FCVAR_ARCHIVE;
} }
/*
=================
GL_RemoveCommands
=================
*/
void GL_RemoveCommands( void )
{
gEngfuncs.Cmd_RemoveCommand( "r_info" );
}
/* /*
=============== ===============
R_Init R_Init
@ -882,18 +890,15 @@ qboolean R_Init( void )
GL_SetDefaultState(); GL_SetDefaultState();
// create the window and set up the context // create the window and set up the context
#if 0 // REFTODO: just make it compile if( !gEngfuncs.R_Init_Video( REF_GL )) // request GL context
if( !R_Init_Video( ))
{ {
GL_RemoveCommands(); GL_RemoveCommands();
R_Free_Video(); gEngfuncs.R_Free_Video();
gEngfuncs.Host_Error( "Can't initialize video subsystem\nProbably driver was not installed" ); gEngfuncs.Host_Error( "Can't initialize video subsystem\nProbably driver was not installed" );
return false; return false;
} }
host.renderinfo_changed = false;
#endif
r_temppool = Mem_AllocPool( "Render Zone" ); r_temppool = Mem_AllocPool( "Render Zone" );
GL_SetDefaults(); GL_SetDefaults();
@ -908,16 +913,6 @@ qboolean R_Init( void )
return true; return true;
} }
/*
=================
GL_RemoveCommands
=================
*/
void GL_RemoveCommands( void )
{
gEngfuncs.Cmd_RemoveCommand( "r_info" );
}
/* /*
=============== ===============
R_Shutdown R_Shutdown
@ -933,10 +928,8 @@ void R_Shutdown( void )
Mem_FreePool( &r_temppool ); Mem_FreePool( &r_temppool );
#if 0 // REFTODO: just make it compile
// shut down OS specific OpenGL stuff like contexts, etc. // shut down OS specific OpenGL stuff like contexts, etc.
R_Free_Video(); gEngfuncs.R_Free_Video();
#endif // 0
} }
/* /*
@ -985,3 +978,151 @@ void GL_CheckForErrors_( const char *filename, const int fileline )
gEngfuncs.Con_Printf( S_OPENGL_ERROR "%s (called at %s:%i)\n", GL_ErrorString( err ), filename, fileline ); gEngfuncs.Con_Printf( S_OPENGL_ERROR "%s (called at %s:%i)\n", GL_ErrorString( err ), filename, fileline );
} }
void GL_SetupAttributes( int safegl )
{
int context_flags = 0; // REFTODO!!!!!
int samples = 0;
#ifdef XASH_GLES
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_PROFILE_MASK, REF_GL_CONTEXT_PROFILE_ES );
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_EGL, 1 );
#ifdef XASH_NANOGL
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_MAJOR_VERSION, 1 );
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_MINOR_VERSION, 1 );
#elif defined( XASH_WES ) || defined( XASH_REGAL )
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_MAJOR_VERSION, 2 );
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_MINOR_VERSION, 0 );
#endif
#else // GL1.x
#ifndef XASH_GL_STATIC
if( gEngfuncs.Sys_CheckParm( "-gldebug" ) )
{
gEngfuncs.Con_Reportf( "Creating an extended GL context for debug...\n" );
SetBits( context_flags, FCONTEXT_DEBUG_ARB );
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_FLAGS, REF_GL_CONTEXT_DEBUG_FLAG );
glw_state.extended = true;
}
#endif // XASH_GL_STATIC
if( gEngfuncs.Sys_CheckParm( "-glcore" ))
{
SetBits( context_flags, FCONTEXT_CORE_PROFILE );
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_PROFILE_MASK, REF_GL_CONTEXT_PROFILE_CORE );
}
else
{
gEngfuncs.GL_SetAttribute( REF_GL_CONTEXT_PROFILE_MASK, REF_GL_CONTEXT_PROFILE_COMPATIBILITY );
}
#endif // XASH_GLES
if( safegl > SAFE_DONTCARE )
{
safegl = -1; // can't retry anymore, can only shutdown engine
return;
}
gEngfuncs.Con_Printf( "Trying safe opengl mode %d\n", safegl );
if( safegl == SAFE_DONTCARE )
return;
gEngfuncs.GL_SetAttribute( REF_GL_DOUBLEBUFFER, 1 );
if( safegl < SAFE_NOACC )
gEngfuncs.GL_SetAttribute( REF_GL_ACCELERATED_VISUAL, 1 );
gEngfuncs.Con_Printf( "bpp %d\n", glw_state.desktopBitsPixel );
if( safegl < SAFE_NOSTENCIL )
gEngfuncs.GL_SetAttribute( REF_GL_STENCIL_SIZE, gl_stencilbits->value );
if( safegl < SAFE_NOALPHA )
gEngfuncs.GL_SetAttribute( REF_GL_ALPHA_SIZE, 8 );
if( safegl < SAFE_NODEPTH )
gEngfuncs.GL_SetAttribute( REF_GL_DEPTH_SIZE, 24 );
else
gEngfuncs.GL_SetAttribute( REF_GL_DEPTH_SIZE, 8 );
if( safegl < SAFE_NOCOLOR )
{
if( glw_state.desktopBitsPixel >= 24 )
{
gEngfuncs.GL_SetAttribute( REF_GL_RED_SIZE, 8 );
gEngfuncs.GL_SetAttribute( REF_GL_GREEN_SIZE, 8 );
gEngfuncs.GL_SetAttribute( REF_GL_BLUE_SIZE, 8 );
}
else if( glw_state.desktopBitsPixel >= 16 )
{
gEngfuncs.GL_SetAttribute( REF_GL_RED_SIZE, 5 );
gEngfuncs.GL_SetAttribute( REF_GL_GREEN_SIZE, 6 );
gEngfuncs.GL_SetAttribute( REF_GL_BLUE_SIZE, 5 );
}
else
{
gEngfuncs.GL_SetAttribute( REF_GL_RED_SIZE, 3 );
gEngfuncs.GL_SetAttribute( REF_GL_GREEN_SIZE, 3 );
gEngfuncs.GL_SetAttribute( REF_GL_BLUE_SIZE, 2 );
}
}
if( safegl < SAFE_NOMSAA )
{
switch( (int)gEngfuncs.pfnGetCvarFloat( "gl_wgl_msaa_samples" ))
{
case 2:
case 4:
case 8:
case 16:
samples = gEngfuncs.pfnGetCvarFloat( "gl_wgl_msaa_samples" );
break;
default:
samples = 0; // don't use, because invalid parameter is passed
}
if( samples )
{
gEngfuncs.GL_SetAttribute( REF_GL_MULTISAMPLEBUFFERS, 1 );
gEngfuncs.GL_SetAttribute( REF_GL_MULTISAMPLESAMPLES, samples );
glConfig.max_multisamples = samples;
}
else
{
gEngfuncs.GL_SetAttribute( REF_GL_MULTISAMPLEBUFFERS, 0 );
gEngfuncs.GL_SetAttribute( REF_GL_MULTISAMPLESAMPLES, 0 );
glConfig.max_multisamples = 0;
}
}
else
{
gEngfuncs.Cvar_Set( "gl_wgl_msaa_samples", "0" );
}
}
void GL_OnContextCreated( void )
{
int colorBits[3];
#ifdef XASH_NANOGL
nanoGL_Init();
#endif
gEngfuncs.GL_GetAttribute( REF_GL_RED_SIZE, &colorBits[0] );
gEngfuncs.GL_GetAttribute( REF_GL_GREEN_SIZE, &colorBits[1] );
gEngfuncs.GL_GetAttribute( REF_GL_BLUE_SIZE, &colorBits[2] );
glConfig.color_bits = colorBits[0] + colorBits[1] + colorBits[2];
gEngfuncs.GL_GetAttribute( REF_GL_ALPHA_SIZE, &glConfig.alpha_bits );
gEngfuncs.GL_GetAttribute( REF_GL_DEPTH_SIZE, &glConfig.depth_bits );
gEngfuncs.GL_GetAttribute( REF_GL_STENCIL_SIZE, &glConfig.stencil_bits );
glState.stencilEnabled = glConfig.stencil_bits ? true : false;
gEngfuncs.GL_GetAttribute( REF_GL_MULTISAMPLESAMPLES, &glConfig.msaasamples );
#ifdef XASH_WES
void wes_init();
wes_init();
#endif
}