mirror of
https://github.com/Q3Rally-Team/rallyunlimited-engine.git
synced 2024-11-29 15:32:00 +00:00
156 lines
4.2 KiB
C
156 lines
4.2 KiB
C
|
/*
|
||
|
===========================================================================
|
||
|
Copyright (C) 1999-2005 Id Software, Inc.
|
||
|
|
||
|
This file is part of Quake III Arena source code.
|
||
|
|
||
|
Quake III Arena source code is free software; you can redistribute it
|
||
|
and/or modify it under the terms of the GNU General Public License as
|
||
|
published by the Free Software Foundation; either version 2 of the License,
|
||
|
or (at your option) any later version.
|
||
|
|
||
|
Quake III Arena source code is distributed in the hope that it will be
|
||
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with Quake III Arena source code; if not, write to the Free Software
|
||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
===========================================================================
|
||
|
*/
|
||
|
/*
|
||
|
** QGL_WIN.C
|
||
|
**
|
||
|
** This file implements the operating system binding of GL to QGL function
|
||
|
** pointers. When doing a port of Quake3 you must implement the following
|
||
|
** two functions:
|
||
|
**
|
||
|
** QGL_Init() - loads libraries, assigns function pointers, etc.
|
||
|
** QGL_Shutdown() - unloads libraries, NULLs function pointers
|
||
|
*/
|
||
|
|
||
|
#ifdef USE_OPENGL_API
|
||
|
|
||
|
#include "../qcommon/q_shared.h"
|
||
|
#include "../qcommon/qcommon.h"
|
||
|
#include "../renderer/qgl.h"
|
||
|
#include "../renderercommon/tr_types.h"
|
||
|
#include "glw_win.h"
|
||
|
#include "win_local.h"
|
||
|
|
||
|
#define GLE( ret, name, ... ) ret ( APIENTRY * q##name )( __VA_ARGS__ );
|
||
|
QGL_Win32_PROCS;
|
||
|
QGL_Swp_PROCS;
|
||
|
#undef GLE
|
||
|
|
||
|
/*
|
||
|
** QGL_Shutdown
|
||
|
**
|
||
|
** Unloads the specified DLL then nulls out all the proc pointers. This
|
||
|
** is only called during a hard shutdown of the OGL subsystem (e.g. vid_restart).
|
||
|
*/
|
||
|
void QGL_Shutdown( qboolean unloadDLL )
|
||
|
{
|
||
|
Com_Printf( "...shutting down QGL\n" );
|
||
|
|
||
|
if ( glw_state.OpenGLLib && unloadDLL )
|
||
|
{
|
||
|
Com_Printf( "...unloading OpenGL DLL\n" );
|
||
|
Sys_UnloadLibrary( glw_state.OpenGLLib );
|
||
|
glw_state.OpenGLLib = NULL;
|
||
|
}
|
||
|
|
||
|
#define GLE( ret, name, ... ) q##name = NULL;
|
||
|
QGL_Win32_PROCS;
|
||
|
QGL_Swp_PROCS;
|
||
|
#undef GLE
|
||
|
}
|
||
|
|
||
|
|
||
|
void *GL_GetProcAddress( const char *name )
|
||
|
{
|
||
|
void *ptr;
|
||
|
|
||
|
ptr = Sys_LoadFunction( glw_state.OpenGLLib, name );
|
||
|
if ( !ptr && qwglGetProcAddress )
|
||
|
{
|
||
|
ptr = qwglGetProcAddress( name );
|
||
|
}
|
||
|
|
||
|
return ptr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
** QGL_Init
|
||
|
**
|
||
|
** This is responsible for binding our qgl function pointers to
|
||
|
** the appropriate GL stuff. In Windows this means doing a
|
||
|
** LoadLibrary and a bunch of calls to GetProcAddress. On other
|
||
|
** operating systems we need to do the right thing, whatever that
|
||
|
** might be.
|
||
|
*/
|
||
|
qboolean QGL_Init( const char *dllname )
|
||
|
{
|
||
|
char libName[1024];
|
||
|
#ifdef UNICODE
|
||
|
TCHAR buffer[1024];
|
||
|
#endif
|
||
|
|
||
|
#if 0
|
||
|
char systemDir[1024];
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
TCHAR buffer[1024];
|
||
|
GetSystemDirectory( buffer, ARRAYSIZE( buffer ) );
|
||
|
strcpy( systemDir, WtoA( buffer ) );
|
||
|
#else
|
||
|
GetSystemDirectory( systemDir, sizeof( systemDir ) );
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
Com_Printf( "...initializing QGL\n" );
|
||
|
|
||
|
if ( glw_state.OpenGLLib == NULL )
|
||
|
{
|
||
|
// NOTE: this assumes that 'dllname' is lower case (and it should be)!
|
||
|
#if 0
|
||
|
if ( dllname[0] != '!' )
|
||
|
Com_sprintf( libName, sizeof( libName ), "%s\\%s", systemDir, dllname );
|
||
|
else
|
||
|
Q_strncpyz( libName, dllname+1, sizeof( libName ) );
|
||
|
#else
|
||
|
Q_strncpyz( libName, dllname, sizeof( libName ) );
|
||
|
#endif
|
||
|
Q_strcat( libName, sizeof( libName ), ".dll" );
|
||
|
glw_state.OpenGLLib = Sys_LoadLibrary( libName );
|
||
|
if ( glw_state.OpenGLLib == NULL )
|
||
|
{
|
||
|
Com_Printf( "...loading '%s' : " S_COLOR_YELLOW "failed\n", libName );
|
||
|
return qfalse;
|
||
|
}
|
||
|
|
||
|
// get exact loaded module name
|
||
|
#ifdef UNICODE
|
||
|
GetModuleFileName( glw_state.OpenGLLib, buffer, ARRAY_LEN( buffer ) );
|
||
|
buffer[ ARRAY_LEN( buffer ) - 1 ] = '\0';
|
||
|
Q_strncpyz( libName, WtoA( buffer ), sizeof( libName ) );
|
||
|
#else
|
||
|
GetModuleFileName( glw_state.OpenGLLib, libName, sizeof( libName ) );
|
||
|
libName[ sizeof( libName ) - 1 ] = '\0';
|
||
|
#endif
|
||
|
Com_Printf( "...loading '%s' : succeeded\n", libName );
|
||
|
}
|
||
|
|
||
|
Sys_LoadFunctionErrors(); // reset error count
|
||
|
|
||
|
#define GLE( ret, name, ... ) q##name = GL_GetProcAddress( XSTRING( name ) ); if ( !q##name ) { Com_Printf( "Error resolving core Win32 functions\n" ); return qfalse; }
|
||
|
QGL_Win32_PROCS;
|
||
|
#undef GLE
|
||
|
|
||
|
return qtrue;
|
||
|
}
|
||
|
|
||
|
#endif // USE_OPENGL_API
|