2010-02-15 23:26:55 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 1996-2001 Id Software, Inc.
|
2010-04-24 11:10:07 +00:00
|
|
|
Copyright (C) 2002-2009 John Fitzgibbons and others
|
2010-02-15 23:26:55 +00:00
|
|
|
Copyright (C) 2007-2008 Kristian Duske
|
2014-09-22 08:55:46 +00:00
|
|
|
Copyright (C) 2010-2014 QuakeSpasm developers
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
This program 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.
|
|
|
|
|
|
|
|
This program 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 this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
*/
|
2011-12-18 16:27:14 +00:00
|
|
|
// gl_vidsdl.c -- SDL GL vid component
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
#include "quakedef.h"
|
2011-12-20 09:22:19 +00:00
|
|
|
#include "cfgfile.h"
|
Backported external music files support using decoder libraries and the
new raw samples interface from Hammer of Thyrion (uhexen2) :
- bgmusic.c, bgmusic.h: New BGM interface for background music handling.
Handles streaming music as raw sound samples.
- bgmnull.c: BGM source for cases where the engine is configured for no
sound.
- cl_main.c: Include bgmusic.h. Call BGM_Stop() and CDAudio_Stop() in
CL_Disconnect().
- cd_sdl.c: Moved bgmvolume boundary checking to bgmusic.c upon value
changes.
- gl_vidnt.c, gl_vidsdl.c, cl_parse.c: Include bgmusic.h. Add BGM_Pause()
and BGM_Resume() calls along with CDAudio_ counterparts.
- cl_parse.c: Replace CDAudio_Play() call by the new BGM_PlayCDtrack()
which first tries CDAudio_Play() and then streaming music if it fails.
- host.c: Include bgmusic.h. Call BGM_Update() just before S_Update()
in Host_Frame(). In Host_Init(), call BGM_Init() after other audio init
calls. In Host_Shutdown(), call BGM_Shutdown() before all other audio
shutdown calls.
- snd_dma.c: Include snd_codec.h and bgmusic.h. Call S_CodecInit() from
S_Init(). Call S_CodecShutdown() from S_Shutdown().
- snd_codec.c, snd_codec.h: New public codec interface for streaming
music as raw samples. Adapted from quake2 and ioquake3 with changes.
Individual codecs are responsible for handling any necessary byte swap
operations.
- snd_codeci.h: New header for snd_codec internals.
- snd_wave.c, snd_wave.h: Codec for WAV format streaming music. Adapted
from ioquake3 with changes.
- snd_vorbis.c, snd_vorbis.h: Codec for Ogg/Vorbis format streaming music.
- snd_mp3.c, snd_mp3.h: Codec for MP3 format streaming music using libmad.
Adapted from the SoX project with changes.
- Makefile: Adjusted for the new sources. Added switches USE_CODEC_WAVE,
USE_CODEC_MP3, USE_CODEC_VORBIS for enabling and disabling individual
codecs.
- Windows makefiles and project files as well as other CodeBlocks project
files will be updated shortly.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@374 af15c1b1-3010-417e-b628-4374ebc0bcbd
2011-01-05 19:50:43 +00:00
|
|
|
#include "bgmusic.h"
|
2010-02-15 23:26:55 +00:00
|
|
|
#include "resource.h"
|
2012-08-16 04:51:41 +00:00
|
|
|
#if defined(SDL_FRAMEWORK) || defined(NO_SDL_CONFIG)
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
#include <SDL2/SDL.h>
|
|
|
|
#else
|
2012-08-16 04:51:41 +00:00
|
|
|
#include <SDL/SDL.h>
|
2014-09-05 19:34:43 +00:00
|
|
|
#endif
|
2012-08-16 04:51:41 +00:00
|
|
|
#else
|
2010-06-19 22:50:48 +00:00
|
|
|
#include "SDL.h"
|
2012-08-16 04:51:41 +00:00
|
|
|
#endif
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-11-02 23:01:20 +00:00
|
|
|
//ericw -- for putting the driver into multithreaded mode
|
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <OpenGL/OpenGL.h>
|
|
|
|
#endif
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
#define MAX_MODE_LIST 600 //johnfitz -- was 30
|
2012-09-30 21:11:39 +00:00
|
|
|
#define MAX_BPPS_LIST 5
|
2010-02-17 23:32:04 +00:00
|
|
|
#define WARP_WIDTH 320
|
|
|
|
#define WARP_HEIGHT 200
|
|
|
|
#define MAXWIDTH 10000
|
|
|
|
#define MAXHEIGHT 10000
|
|
|
|
|
2013-03-03 15:01:14 +00:00
|
|
|
#define DEFAULT_SDL_FLAGS SDL_OPENGL
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int bpp;
|
|
|
|
} vmode_t;
|
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static const char *gl_vendor;
|
|
|
|
static const char *gl_renderer;
|
|
|
|
static const char *gl_version;
|
2014-10-03 18:31:58 +00:00
|
|
|
static int gl_version_major;
|
|
|
|
static int gl_version_minor;
|
2011-12-30 14:00:28 +00:00
|
|
|
static const char *gl_extensions;
|
2012-11-07 12:44:30 +00:00
|
|
|
static char * gl_extensions_nice;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
static vmode_t modelist[MAX_MODE_LIST];
|
|
|
|
static int nummodes;
|
|
|
|
|
|
|
|
static qboolean vid_initialized = false;
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
static SDL_Window *draw_context;
|
|
|
|
static SDL_GLContext gl_context;
|
|
|
|
#else
|
2011-12-30 14:00:28 +00:00
|
|
|
static SDL_Surface *draw_context;
|
2014-09-05 19:34:43 +00:00
|
|
|
#endif
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static qboolean vid_locked = false; //johnfitz
|
|
|
|
static qboolean vid_changed = false;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_Init (void); //johnfitz
|
|
|
|
static void VID_Menu_f (void); //johnfitz
|
|
|
|
static void VID_MenuDraw (void);
|
|
|
|
static void VID_MenuKey (int key);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static void ClearAllStates (void);
|
|
|
|
static void GL_Init (void);
|
|
|
|
static void GL_SetupState (void); //johnfitz
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
viddef_t vid; // global video state
|
2013-02-24 13:42:23 +00:00
|
|
|
modestate_t modestate = MS_UNINIT;
|
2011-12-30 14:00:28 +00:00
|
|
|
qboolean scr_skipupdate;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
qboolean gl_mtexable = false;
|
|
|
|
qboolean gl_texture_env_combine = false; //johnfitz
|
|
|
|
qboolean gl_texture_env_add = false; //johnfitz
|
|
|
|
qboolean gl_swap_control = false; //johnfitz
|
|
|
|
qboolean gl_anisotropy_able = false; //johnfitz
|
|
|
|
float gl_max_anisotropy; //johnfitz
|
2014-07-11 06:56:09 +00:00
|
|
|
qboolean gl_texture_NPOT = false; //ericw
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
qboolean gl_vbo_able = false; //ericw
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
qboolean gl_glsl_able = false; //ericw
|
2014-09-20 01:08:13 +00:00
|
|
|
GLint gl_max_texture_units = 0; //ericw
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
PFNGLMULTITEXCOORD2FARBPROC GL_MTexCoord2fFunc = NULL; //johnfitz
|
|
|
|
PFNGLACTIVETEXTUREARBPROC GL_SelectTextureFunc = NULL; //johnfitz
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
PFNGLCLIENTACTIVETEXTUREARBPROC GL_ClientActiveTextureFunc = NULL; //ericw
|
|
|
|
PFNGLBINDBUFFERARBPROC GL_BindBufferFunc = NULL; //ericw
|
|
|
|
PFNGLBUFFERDATAARBPROC GL_BufferDataFunc = NULL; //ericw
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
PFNGLBUFFERSUBDATAARBPROC GL_BufferSubDataFunc = NULL; //ericw
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
PFNGLDELETEBUFFERSARBPROC GL_DeleteBuffersFunc = NULL; //ericw
|
|
|
|
PFNGLGENBUFFERSARBPROC GL_GenBuffersFunc = NULL; //ericw
|
2010-02-15 23:26:55 +00:00
|
|
|
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
QS_PFNGLCREATESHADERPROC GL_CreateShaderFunc = NULL; //ericw
|
|
|
|
QS_PFNGLDELETESHADERPROC GL_DeleteShaderFunc = NULL; //ericw
|
|
|
|
QS_PFNGLDELETEPROGRAMPROC GL_DeleteProgramFunc = NULL; //ericw
|
|
|
|
QS_PFNGLSHADERSOURCEPROC GL_ShaderSourceFunc = NULL; //ericw
|
|
|
|
QS_PFNGLCOMPILESHADERPROC GL_CompileShaderFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETSHADERIVPROC GL_GetShaderivFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETSHADERINFOLOGPROC GL_GetShaderInfoLogFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETPROGRAMIVPROC GL_GetProgramivFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETPROGRAMINFOLOGPROC GL_GetProgramInfoLogFunc = NULL; //ericw
|
|
|
|
QS_PFNGLCREATEPROGRAMPROC GL_CreateProgramFunc = NULL; //ericw
|
|
|
|
QS_PFNGLATTACHSHADERPROC GL_AttachShaderFunc = NULL; //ericw
|
|
|
|
QS_PFNGLLINKPROGRAMPROC GL_LinkProgramFunc = NULL; //ericw
|
|
|
|
QS_PFNGLBINDATTRIBLOCATIONFUNC GL_BindAttribLocationFunc = NULL; //ericw
|
|
|
|
QS_PFNGLUSEPROGRAMPROC GL_UseProgramFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETATTRIBLOCATIONPROC GL_GetAttribLocationFunc = NULL; //ericw
|
|
|
|
QS_PFNGLVERTEXATTRIBPOINTERPROC GL_VertexAttribPointerFunc = NULL; //ericw
|
|
|
|
QS_PFNGLENABLEVERTEXATTRIBARRAYPROC GL_EnableVertexAttribArrayFunc = NULL; //ericw
|
|
|
|
QS_PFNGLDISABLEVERTEXATTRIBARRAYPROC GL_DisableVertexAttribArrayFunc = NULL; //ericw
|
|
|
|
QS_PFNGLGETUNIFORMLOCATIONPROC GL_GetUniformLocationFunc = NULL; //ericw
|
|
|
|
QS_PFNGLUNIFORM1IPROC GL_Uniform1iFunc = NULL; //ericw
|
|
|
|
QS_PFNGLUNIFORM1FPROC GL_Uniform1fFunc = NULL; //ericw
|
|
|
|
QS_PFNGLUNIFORM3FPROC GL_Uniform3fFunc = NULL; //ericw
|
|
|
|
QS_PFNGLUNIFORM4FPROC GL_Uniform4fFunc = NULL; //ericw
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//====================================
|
|
|
|
|
|
|
|
//johnfitz -- new cvars
|
2011-12-30 14:00:28 +00:00
|
|
|
static cvar_t vid_fullscreen = {"vid_fullscreen", "0", CVAR_ARCHIVE}; // QuakeSpasm, was "1"
|
|
|
|
static cvar_t vid_width = {"vid_width", "800", CVAR_ARCHIVE}; // QuakeSpasm, was 640
|
|
|
|
static cvar_t vid_height = {"vid_height", "600", CVAR_ARCHIVE}; // QuakeSpasm, was 480
|
|
|
|
static cvar_t vid_bpp = {"vid_bpp", "16", CVAR_ARCHIVE};
|
|
|
|
static cvar_t vid_vsync = {"vid_vsync", "0", CVAR_ARCHIVE};
|
2014-08-12 19:39:20 +00:00
|
|
|
static cvar_t vid_fsaa = {"vid_fsaa", "0", CVAR_ARCHIVE}; // QuakeSpasm
|
2010-02-15 23:26:55 +00:00
|
|
|
//johnfitz
|
|
|
|
|
2011-12-28 22:01:33 +00:00
|
|
|
cvar_t vid_gamma = {"gamma", "1", CVAR_ARCHIVE}; //johnfitz -- moved here from view.c
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// HARDWARE GAMMA -- johnfitz
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
2013-07-24 07:00:44 +00:00
|
|
|
#define USE_GAMMA_RAMPS 0
|
|
|
|
|
|
|
|
#if USE_GAMMA_RAMPS
|
2011-12-30 14:00:28 +00:00
|
|
|
static unsigned short vid_gamma_red[256];
|
|
|
|
static unsigned short vid_gamma_green[256];
|
|
|
|
static unsigned short vid_gamma_blue[256];
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static unsigned short vid_sysgamma_red[256];
|
|
|
|
static unsigned short vid_sysgamma_green[256];
|
|
|
|
static unsigned short vid_sysgamma_blue[256];
|
2013-07-24 07:00:44 +00:00
|
|
|
#endif
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-07-25 09:41:28 +00:00
|
|
|
static qboolean gammaworks = false; // whether hw-gamma works
|
2014-08-12 19:39:20 +00:00
|
|
|
static int fsaa;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Gamma_SetGamma -- apply gamma correction
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Gamma_SetGamma (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-07-25 09:41:28 +00:00
|
|
|
if (draw_context && gammaworks)
|
2011-12-30 14:00:28 +00:00
|
|
|
{
|
2013-07-24 07:00:44 +00:00
|
|
|
float value;
|
|
|
|
|
|
|
|
if (vid_gamma.value > (1.0f / GAMMA_MAX))
|
|
|
|
value = 1.0f / vid_gamma.value;
|
|
|
|
else
|
|
|
|
value = GAMMA_MAX;
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
2014-09-21 14:00:56 +00:00
|
|
|
# if USE_GAMMA_RAMPS
|
|
|
|
if (SDL_SetWindowGammaRamp(draw_context, vid_gamma_red, vid_gamma_green, vid_gamma_blue) != 0)
|
|
|
|
Con_Printf ("VID_Gamma_SetGamma: failed on SDL_SetWindowGammaRamp\n");
|
|
|
|
# else
|
2014-09-05 19:34:43 +00:00
|
|
|
if (SDL_SetWindowBrightness(draw_context, value) != 0)
|
|
|
|
Con_Printf ("VID_Gamma_SetGamma: failed on SDL_SetWindowBrightness\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#else /* USE_SDL2 */
|
|
|
|
# if USE_GAMMA_RAMPS
|
2014-09-05 19:34:43 +00:00
|
|
|
if (SDL_SetGammaRamp(vid_gamma_red, vid_gamma_green, vid_gamma_blue) == -1)
|
|
|
|
Con_Printf ("VID_Gamma_SetGamma: failed on SDL_SetGammaRamp\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# else
|
2013-07-24 07:00:44 +00:00
|
|
|
if (SDL_SetGamma(value,value,value) == -1)
|
|
|
|
Con_Printf ("VID_Gamma_SetGamma: failed on SDL_SetGamma\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#endif /* USE_SDL2 */
|
2011-12-30 14:00:28 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Gamma_Restore -- restore system gamma
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Gamma_Restore (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-07-25 09:41:28 +00:00
|
|
|
if (draw_context && gammaworks)
|
2011-12-30 14:00:28 +00:00
|
|
|
{
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
2014-09-21 14:00:56 +00:00
|
|
|
# if USE_GAMMA_RAMPS
|
|
|
|
if (SDL_SetWindowGammaRamp(draw_context, vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) != 0)
|
|
|
|
Con_Printf ("VID_Gamma_Restore: failed on SDL_SetWindowGammaRamp\n");
|
|
|
|
# else
|
2014-09-05 19:34:43 +00:00
|
|
|
if (SDL_SetWindowBrightness(draw_context, 1) != 0)
|
|
|
|
Con_Printf ("VID_Gamma_Restore: failed on SDL_SetWindowBrightness\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#else /* USE_SDL2 */
|
|
|
|
# if USE_GAMMA_RAMPS
|
2013-07-25 09:41:28 +00:00
|
|
|
if (SDL_SetGammaRamp(vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) == -1)
|
2010-02-17 23:32:04 +00:00
|
|
|
Con_Printf ("VID_Gamma_Restore: failed on SDL_SetGammaRamp\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# else
|
2013-07-24 07:00:44 +00:00
|
|
|
if (SDL_SetGamma(1, 1, 1) == -1)
|
|
|
|
Con_Printf ("VID_Gamma_Restore: failed on SDL_SetGamma\n");
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#endif /* USE_SDL2 */
|
2011-12-30 14:00:28 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Gamma_Shutdown -- called on exit
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Gamma_Shutdown (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
VID_Gamma_Restore ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Gamma_f -- callback when the cvar changes
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Gamma_f (cvar_t *var)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-07-24 07:00:44 +00:00
|
|
|
#if USE_GAMMA_RAMPS
|
2010-02-15 23:26:55 +00:00
|
|
|
int i;
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
for (i = 0; i < 256; i++)
|
2010-02-17 23:32:04 +00:00
|
|
|
{
|
2010-04-24 11:10:07 +00:00
|
|
|
vid_gamma_red[i] =
|
2012-09-30 14:03:15 +00:00
|
|
|
CLAMP(0, (int) (255 * pow((i + 0.5)/255.5, var->value) + 0.5), 255) << 8;
|
2010-02-17 23:32:04 +00:00
|
|
|
vid_gamma_green[i] = vid_gamma_red[i];
|
|
|
|
vid_gamma_blue[i] = vid_gamma_red[i];
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
2013-07-24 07:00:44 +00:00
|
|
|
#endif
|
2010-02-15 23:26:55 +00:00
|
|
|
VID_Gamma_SetGamma ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Gamma_Init -- call on init
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Gamma_Init (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
2014-09-21 14:00:56 +00:00
|
|
|
# if USE_GAMMA_RAMPS
|
|
|
|
gammaworks = (SDL_GetWindowGammaRamp(draw_context, vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) == 0);
|
|
|
|
if (gammaworks)
|
|
|
|
gammaworks = (SDL_SetWindowGammaRamp(draw_context, vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) == 0);
|
|
|
|
# else
|
2014-09-05 19:34:43 +00:00
|
|
|
gammaworks = (SDL_SetWindowBrightness(draw_context, 1) == 0);
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#else /* USE_SDL2 */
|
|
|
|
# if USE_GAMMA_RAMPS
|
2013-07-25 09:41:28 +00:00
|
|
|
gammaworks = (SDL_GetGammaRamp(vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) == 0);
|
|
|
|
if (gammaworks)
|
|
|
|
gammaworks = (SDL_SetGammaRamp(vid_sysgamma_red, vid_sysgamma_green, vid_sysgamma_blue) == 0);
|
2014-09-21 14:00:56 +00:00
|
|
|
# else
|
2013-07-25 09:41:28 +00:00
|
|
|
gammaworks = (SDL_SetGamma(1, 1, 1) == 0);
|
2014-09-21 14:00:56 +00:00
|
|
|
# endif
|
|
|
|
#endif /* USE_SDL2 */
|
2013-07-25 09:41:28 +00:00
|
|
|
|
|
|
|
if (!gammaworks)
|
|
|
|
Con_SafePrintf("gamma adjustment not available\n");
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-28 22:01:33 +00:00
|
|
|
Cvar_RegisterVariable (&vid_gamma);
|
|
|
|
Cvar_SetCallback (&vid_gamma, VID_Gamma_f);
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
/*
|
|
|
|
======================
|
|
|
|
VID_GetCurrentWidth
|
|
|
|
======================
|
|
|
|
*/
|
|
|
|
static int VID_GetCurrentWidth (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
int w = 0, h = 0;
|
|
|
|
SDL_GetWindowSize(draw_context, &w, &h);
|
|
|
|
return w;
|
|
|
|
#else
|
|
|
|
return draw_context->w;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=======================
|
|
|
|
VID_GetCurrentHeight
|
|
|
|
=======================
|
|
|
|
*/
|
|
|
|
static int VID_GetCurrentHeight (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
2014-10-11 19:11:40 +00:00
|
|
|
int w = 0, h = 0;
|
2014-09-05 19:34:43 +00:00
|
|
|
SDL_GetWindowSize(draw_context, &w, &h);
|
|
|
|
return h;
|
|
|
|
#else
|
|
|
|
return draw_context->h;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_GetCurrentBPP
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
static int VID_GetCurrentBPP (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
const Uint32 pixelFormat = SDL_GetWindowPixelFormat(draw_context);
|
|
|
|
return SDL_BITSPERPIXEL(pixelFormat);
|
|
|
|
#else
|
|
|
|
return draw_context->format->BitsPerPixel;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_GetFullscreen
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
static qboolean VID_GetFullscreen (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
return (SDL_GetWindowFlags(draw_context) & SDL_WINDOW_FULLSCREEN) != 0;
|
|
|
|
#else
|
|
|
|
return (draw_context->flags & SDL_FULLSCREEN) != 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_GetVSync
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
static qboolean VID_GetVSync (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
return SDL_GL_GetSwapInterval() == 1;
|
|
|
|
#else
|
|
|
|
int swap_control;
|
|
|
|
if (SDL_GL_GetAttribute(SDL_GL_SWAP_CONTROL, &swap_control) == 0)
|
|
|
|
return swap_control > 0;
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_GetWindow
|
|
|
|
|
|
|
|
used by pl_win.c
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
void *VID_GetWindow (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
return draw_context;
|
|
|
|
#else
|
|
|
|
return NULL;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_HasMouseOrInputFocus
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
qboolean VID_HasMouseOrInputFocus (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
return (SDL_GetWindowFlags(draw_context) & (SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_INPUT_FOCUS)) != 0;
|
|
|
|
#else
|
|
|
|
return (SDL_GetAppState() & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS)) != 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
====================
|
|
|
|
VID_IsMinimized
|
|
|
|
====================
|
|
|
|
*/
|
|
|
|
qboolean VID_IsMinimized (void)
|
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
return !(SDL_GetWindowFlags(draw_context) & SDL_WINDOW_SHOWN);
|
|
|
|
#else
|
|
|
|
/* SDL_APPACTIVE in SDL 1.x means "not minimized" */
|
|
|
|
return !(SDL_GetAppState() & SDL_APPACTIVE);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_SDL2_GetDisplayMode
|
|
|
|
|
|
|
|
Returns a pointer to a statically allocated SDL_DisplayMode structure
|
|
|
|
if there is one with the requested params on the default display.
|
|
|
|
Otherwise returns NULL.
|
|
|
|
|
|
|
|
This is passed to SDL_SetWindowDisplayMode to specify a pixel format
|
|
|
|
with the requested bpp. If we didn't care about bpp we could just pass NULL.
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
static SDL_DisplayMode *VID_SDL2_GetDisplayMode(int width, int height, int bpp)
|
|
|
|
{
|
|
|
|
static SDL_DisplayMode mode;
|
|
|
|
const int sdlmodes = SDL_GetNumDisplayModes(0);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < sdlmodes; i++)
|
|
|
|
{
|
|
|
|
if (SDL_GetDisplayMode(0, i, &mode) == 0
|
|
|
|
&& mode.w == width && mode.h == height
|
|
|
|
&& SDL_BITSPERPIXEL(mode.format) == bpp)
|
|
|
|
{
|
|
|
|
return &mode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-09-21 11:01:02 +00:00
|
|
|
#endif /* USE_SDL2 */
|
2014-09-05 19:34:43 +00:00
|
|
|
|
2013-02-19 19:20:17 +00:00
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_ValidMode
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
static qboolean VID_ValidMode (int width, int height, int bpp, qboolean fullscreen)
|
|
|
|
{
|
2013-02-21 19:17:18 +00:00
|
|
|
if (width < 320)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (height < 200)
|
|
|
|
return false;
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
if (fullscreen && VID_SDL2_GetDisplayMode(width, height, bpp) == NULL)
|
|
|
|
bpp = 0;
|
|
|
|
#else
|
|
|
|
{
|
|
|
|
Uint32 flags = DEFAULT_SDL_FLAGS;
|
|
|
|
if (fullscreen)
|
|
|
|
flags |= SDL_FULLSCREEN;
|
2013-03-02 18:10:19 +00:00
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
bpp = SDL_VideoModeOK(width, height, bpp, flags);
|
|
|
|
}
|
|
|
|
#endif
|
2013-03-02 18:10:19 +00:00
|
|
|
|
2013-02-21 19:17:18 +00:00
|
|
|
switch (bpp)
|
|
|
|
{
|
|
|
|
case 16:
|
|
|
|
case 24:
|
|
|
|
case 32:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-02-19 19:20:17 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_SetMode
|
|
|
|
================
|
|
|
|
*/
|
2014-10-30 18:00:06 +00:00
|
|
|
static qboolean VID_SetMode (int width, int height, int bpp, qboolean fullscreen)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2010-04-26 13:41:39 +00:00
|
|
|
int temp;
|
2014-09-05 19:34:43 +00:00
|
|
|
Uint32 flags;
|
2010-04-26 13:41:39 +00:00
|
|
|
char caption[50];
|
2014-07-15 07:03:56 +00:00
|
|
|
int depthbits;
|
2014-08-12 19:39:20 +00:00
|
|
|
int fsaa_obtained;
|
|
|
|
|
2013-02-18 19:19:32 +00:00
|
|
|
// so Con_Printfs don't mess us up by forcing vid and snd updates
|
2010-02-15 23:26:55 +00:00
|
|
|
temp = scr_disabled_for_loading;
|
|
|
|
scr_disabled_for_loading = true;
|
|
|
|
|
|
|
|
CDAudio_Pause ();
|
Backported external music files support using decoder libraries and the
new raw samples interface from Hammer of Thyrion (uhexen2) :
- bgmusic.c, bgmusic.h: New BGM interface for background music handling.
Handles streaming music as raw sound samples.
- bgmnull.c: BGM source for cases where the engine is configured for no
sound.
- cl_main.c: Include bgmusic.h. Call BGM_Stop() and CDAudio_Stop() in
CL_Disconnect().
- cd_sdl.c: Moved bgmvolume boundary checking to bgmusic.c upon value
changes.
- gl_vidnt.c, gl_vidsdl.c, cl_parse.c: Include bgmusic.h. Add BGM_Pause()
and BGM_Resume() calls along with CDAudio_ counterparts.
- cl_parse.c: Replace CDAudio_Play() call by the new BGM_PlayCDtrack()
which first tries CDAudio_Play() and then streaming music if it fails.
- host.c: Include bgmusic.h. Call BGM_Update() just before S_Update()
in Host_Frame(). In Host_Init(), call BGM_Init() after other audio init
calls. In Host_Shutdown(), call BGM_Shutdown() before all other audio
shutdown calls.
- snd_dma.c: Include snd_codec.h and bgmusic.h. Call S_CodecInit() from
S_Init(). Call S_CodecShutdown() from S_Shutdown().
- snd_codec.c, snd_codec.h: New public codec interface for streaming
music as raw samples. Adapted from quake2 and ioquake3 with changes.
Individual codecs are responsible for handling any necessary byte swap
operations.
- snd_codeci.h: New header for snd_codec internals.
- snd_wave.c, snd_wave.h: Codec for WAV format streaming music. Adapted
from ioquake3 with changes.
- snd_vorbis.c, snd_vorbis.h: Codec for Ogg/Vorbis format streaming music.
- snd_mp3.c, snd_mp3.h: Codec for MP3 format streaming music using libmad.
Adapted from the SoX project with changes.
- Makefile: Adjusted for the new sources. Added switches USE_CODEC_WAVE,
USE_CODEC_MP3, USE_CODEC_VORBIS for enabling and disabling individual
codecs.
- Windows makefiles and project files as well as other CodeBlocks project
files will be updated shortly.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@374 af15c1b1-3010-417e-b628-4374ebc0bcbd
2011-01-05 19:50:43 +00:00
|
|
|
BGM_Pause ();
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-10-11 19:11:40 +00:00
|
|
|
/* z-buffer depth */
|
2014-07-15 07:03:56 +00:00
|
|
|
if (bpp == 16)
|
|
|
|
depthbits = 16;
|
|
|
|
else depthbits = 24;
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthbits);
|
|
|
|
|
2014-10-11 19:11:40 +00:00
|
|
|
/* fsaa */
|
2014-08-12 19:39:20 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, fsaa > 0 ? 1 : 0);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, fsaa);
|
|
|
|
|
2014-09-16 09:05:36 +00:00
|
|
|
q_snprintf(caption, sizeof(caption), "QuakeSpasm %1.2f.%d", (float)QUAKESPASM_VERSION, QUAKESPASM_VER_PATCH);
|
2014-09-05 19:34:43 +00:00
|
|
|
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
/* Create the window if needed, hidden */
|
|
|
|
if (!draw_context)
|
|
|
|
{
|
|
|
|
flags = SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN;
|
|
|
|
|
2014-10-05 17:06:35 +00:00
|
|
|
draw_context = SDL_CreateWindow (caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, flags);
|
|
|
|
if (!draw_context) { // scale back fsaa
|
2014-09-05 19:34:43 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
|
2014-10-05 17:06:35 +00:00
|
|
|
draw_context = SDL_CreateWindow (caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, flags);
|
2014-09-05 19:34:43 +00:00
|
|
|
}
|
2014-10-05 17:06:35 +00:00
|
|
|
if (!draw_context) { // scale back SDL_GL_DEPTH_SIZE
|
2014-09-05 19:34:43 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
|
2014-10-05 17:06:35 +00:00
|
|
|
draw_context = SDL_CreateWindow (caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, flags);
|
2014-09-05 19:34:43 +00:00
|
|
|
}
|
2014-10-05 17:06:35 +00:00
|
|
|
if (!draw_context)
|
|
|
|
Sys_Error ("Couldn't create window");
|
|
|
|
|
|
|
|
gl_context = SDL_GL_CreateContext (draw_context);
|
|
|
|
if (!gl_context)
|
|
|
|
Sys_Error ("Couldn't create GL context");
|
2014-09-05 19:34:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Ensure the window is not fullscreen */
|
|
|
|
if (VID_GetFullscreen ())
|
|
|
|
{
|
|
|
|
if (SDL_SetWindowFullscreen (draw_context, 0) != 0)
|
|
|
|
Sys_Error("Couldn't set fullscreen state mode");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set window size and display mode */
|
|
|
|
SDL_SetWindowSize (draw_context, width, height);
|
|
|
|
SDL_SetWindowPosition (draw_context, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
|
|
|
SDL_SetWindowDisplayMode (draw_context, VID_SDL2_GetDisplayMode(width, height, bpp));
|
|
|
|
|
|
|
|
/* Make window fullscreen if needed, and show the window */
|
|
|
|
if (fullscreen)
|
|
|
|
{
|
|
|
|
if (SDL_SetWindowFullscreen (draw_context, SDL_WINDOW_FULLSCREEN) != 0)
|
|
|
|
Sys_Error ("Couldn't set fullscreen state mode");
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_ShowWindow (draw_context);
|
|
|
|
|
|
|
|
gl_swap_control = true;
|
|
|
|
if (SDL_GL_SetSwapInterval ((vid_vsync.value) ? 1 : 0) == -1)
|
|
|
|
gl_swap_control = false;
|
|
|
|
|
|
|
|
#else /* !defined(USE_SDL2) */
|
|
|
|
|
|
|
|
flags = DEFAULT_SDL_FLAGS;
|
|
|
|
if (fullscreen)
|
|
|
|
flags |= SDL_FULLSCREEN;
|
|
|
|
|
|
|
|
gl_swap_control = true;
|
|
|
|
if (SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, (vid_vsync.value) ? 1 : 0) == -1)
|
|
|
|
gl_swap_control = false;
|
|
|
|
|
|
|
|
bpp = SDL_VideoModeOK(width, height, bpp, flags);
|
|
|
|
|
2013-02-18 19:19:32 +00:00
|
|
|
draw_context = SDL_SetVideoMode(width, height, bpp, flags);
|
2014-08-12 19:39:20 +00:00
|
|
|
if (!draw_context) { // scale back fsaa
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
|
|
|
|
draw_context = SDL_SetVideoMode(width, height, bpp, flags);
|
|
|
|
}
|
2014-07-15 07:03:56 +00:00
|
|
|
if (!draw_context) { // scale back SDL_GL_DEPTH_SIZE
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
|
|
|
|
draw_context = SDL_SetVideoMode(width, height, bpp, flags);
|
|
|
|
if (!draw_context)
|
|
|
|
Sys_Error ("Couldn't set video mode");
|
|
|
|
}
|
2010-04-26 13:33:07 +00:00
|
|
|
|
2010-08-29 02:22:55 +00:00
|
|
|
SDL_WM_SetCaption(caption, caption);
|
2014-09-21 11:01:02 +00:00
|
|
|
#endif /* !defined(USE_SDL2) */
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
vid.width = VID_GetCurrentWidth();
|
|
|
|
vid.height = VID_GetCurrentHeight();
|
2010-02-17 23:32:04 +00:00
|
|
|
vid.conwidth = vid.width & 0xFFFFFFF8;
|
|
|
|
vid.conheight = vid.conwidth * vid.height / vid.width;
|
|
|
|
vid.numpages = 2;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-07-15 07:03:56 +00:00
|
|
|
// read the obtained z-buffer depth
|
|
|
|
if (SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &depthbits) == -1)
|
|
|
|
depthbits = 0;
|
|
|
|
|
2014-08-12 19:39:20 +00:00
|
|
|
// read obtained fsaa samples
|
|
|
|
if (SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &fsaa_obtained) == -1)
|
|
|
|
fsaa_obtained = 0;
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
modestate = VID_GetFullscreen() ? MS_FULLSCREEN : MS_WINDOWED;
|
2013-02-18 19:19:32 +00:00
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
CDAudio_Resume ();
|
Backported external music files support using decoder libraries and the
new raw samples interface from Hammer of Thyrion (uhexen2) :
- bgmusic.c, bgmusic.h: New BGM interface for background music handling.
Handles streaming music as raw sound samples.
- bgmnull.c: BGM source for cases where the engine is configured for no
sound.
- cl_main.c: Include bgmusic.h. Call BGM_Stop() and CDAudio_Stop() in
CL_Disconnect().
- cd_sdl.c: Moved bgmvolume boundary checking to bgmusic.c upon value
changes.
- gl_vidnt.c, gl_vidsdl.c, cl_parse.c: Include bgmusic.h. Add BGM_Pause()
and BGM_Resume() calls along with CDAudio_ counterparts.
- cl_parse.c: Replace CDAudio_Play() call by the new BGM_PlayCDtrack()
which first tries CDAudio_Play() and then streaming music if it fails.
- host.c: Include bgmusic.h. Call BGM_Update() just before S_Update()
in Host_Frame(). In Host_Init(), call BGM_Init() after other audio init
calls. In Host_Shutdown(), call BGM_Shutdown() before all other audio
shutdown calls.
- snd_dma.c: Include snd_codec.h and bgmusic.h. Call S_CodecInit() from
S_Init(). Call S_CodecShutdown() from S_Shutdown().
- snd_codec.c, snd_codec.h: New public codec interface for streaming
music as raw samples. Adapted from quake2 and ioquake3 with changes.
Individual codecs are responsible for handling any necessary byte swap
operations.
- snd_codeci.h: New header for snd_codec internals.
- snd_wave.c, snd_wave.h: Codec for WAV format streaming music. Adapted
from ioquake3 with changes.
- snd_vorbis.c, snd_vorbis.h: Codec for Ogg/Vorbis format streaming music.
- snd_mp3.c, snd_mp3.h: Codec for MP3 format streaming music using libmad.
Adapted from the SoX project with changes.
- Makefile: Adjusted for the new sources. Added switches USE_CODEC_WAVE,
USE_CODEC_MP3, USE_CODEC_VORBIS for enabling and disabling individual
codecs.
- Windows makefiles and project files as well as other CodeBlocks project
files will be updated shortly.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@374 af15c1b1-3010-417e-b628-4374ebc0bcbd
2011-01-05 19:50:43 +00:00
|
|
|
BGM_Resume ();
|
2010-02-15 23:26:55 +00:00
|
|
|
scr_disabled_for_loading = temp;
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
// fix the leftover Alt from any Alt-Tab or the like that switched us away
|
2010-02-15 23:26:55 +00:00
|
|
|
ClearAllStates ();
|
|
|
|
|
2014-08-12 19:39:20 +00:00
|
|
|
Con_SafePrintf ("Video mode %dx%dx%d (%d-bit z-buffer, %dx FSAA) initialized\n",
|
2014-09-05 19:34:43 +00:00
|
|
|
VID_GetCurrentWidth(),
|
|
|
|
VID_GetCurrentHeight(),
|
|
|
|
VID_GetCurrentBPP(),
|
2014-08-12 19:39:20 +00:00
|
|
|
depthbits,
|
|
|
|
fsaa_obtained);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
vid.recalc_refdef = 1;
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
// no pending changes
|
|
|
|
vid_changed = false;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===================
|
|
|
|
VID_Changed_f -- kristian -- notify us that a value has changed that requires a vid_restart
|
|
|
|
===================
|
|
|
|
*/
|
2011-12-24 14:04:01 +00:00
|
|
|
static void VID_Changed_f (cvar_t *var)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2010-02-17 23:32:04 +00:00
|
|
|
vid_changed = true;
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===================
|
|
|
|
VID_Restart -- johnfitz -- change video modes on the fly
|
|
|
|
===================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Restart (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-08-12 19:25:14 +00:00
|
|
|
int width, height, bpp;
|
2013-02-21 19:35:21 +00:00
|
|
|
qboolean fullscreen;
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
if (vid_locked || !vid_changed)
|
|
|
|
return;
|
|
|
|
|
2013-02-21 19:35:21 +00:00
|
|
|
width = (int)vid_width.value;
|
|
|
|
height = (int)vid_height.value;
|
|
|
|
bpp = (int)vid_bpp.value;
|
|
|
|
fullscreen = vid_fullscreen.value ? true : false;
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//
|
2013-02-19 19:20:17 +00:00
|
|
|
// validate new mode
|
2010-02-15 23:26:55 +00:00
|
|
|
//
|
2013-02-21 19:35:21 +00:00
|
|
|
if (!VID_ValidMode (width, height, bpp, fullscreen))
|
2010-02-17 23:32:04 +00:00
|
|
|
{
|
2013-02-19 19:20:17 +00:00
|
|
|
Con_Printf ("%dx%dx%d %s is not a valid mode\n",
|
2013-02-21 19:35:21 +00:00
|
|
|
width, height, bpp, fullscreen? "fullscreen" : "windowed");
|
2013-02-19 19:20:17 +00:00
|
|
|
return;
|
2010-02-17 23:32:04 +00:00
|
|
|
}
|
2015-01-26 20:18:39 +00:00
|
|
|
|
|
|
|
// ericw -- depending on platform / SDL version, after a video mode change we
|
|
|
|
// can have a new context (all textures are already freed) or the same context
|
|
|
|
// as before, in which case we need to delete the old textures to avoid a
|
|
|
|
// memory leak.
|
|
|
|
|
|
|
|
TexMgr_DeleteTextureObjects ();
|
2013-02-19 19:20:17 +00:00
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
//
|
|
|
|
// set new mode
|
|
|
|
//
|
2014-08-12 19:25:14 +00:00
|
|
|
VID_SetMode (width, height, bpp, fullscreen);
|
2010-02-17 23:32:04 +00:00
|
|
|
|
2012-11-07 12:27:39 +00:00
|
|
|
GL_Init ();
|
|
|
|
TexMgr_ReloadImages ();
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
GL_BuildVBOs ();
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
GLMesh_LoadVertexBuffers ();
|
2012-11-07 12:27:39 +00:00
|
|
|
GL_SetupState ();
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
//warpimages needs to be recalculated
|
|
|
|
TexMgr_RecalcWarpImageSize ();
|
|
|
|
|
|
|
|
//conwidth and conheight need to be recalculated
|
2010-04-23 06:55:20 +00:00
|
|
|
vid.conwidth = (scr_conwidth.value > 0) ? (int)scr_conwidth.value : (scr_conscale.value > 0) ? (int)(vid.width/scr_conscale.value) : vid.width;
|
2010-02-17 23:32:04 +00:00
|
|
|
vid.conwidth = CLAMP (320, vid.conwidth, vid.width);
|
|
|
|
vid.conwidth &= 0xFFFFFFF8;
|
|
|
|
vid.conheight = vid.conwidth * vid.height / vid.width;
|
|
|
|
//
|
2010-02-15 23:26:55 +00:00
|
|
|
// keep cvars in line with actual mode
|
|
|
|
//
|
2013-02-17 18:12:00 +00:00
|
|
|
VID_SyncCvars();
|
2012-10-06 18:09:23 +00:00
|
|
|
//
|
|
|
|
// update mouse grab
|
|
|
|
//
|
2013-02-24 13:42:23 +00:00
|
|
|
if (key_dest == key_console || key_dest == key_menu)
|
|
|
|
{
|
|
|
|
if (modestate == MS_WINDOWED)
|
|
|
|
IN_Deactivate(true);
|
|
|
|
else if (modestate == MS_FULLSCREEN)
|
|
|
|
IN_Activate();
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Test -- johnfitz -- like vid_restart, but asks for confirmation after switching modes
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Test (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-08-12 19:25:14 +00:00
|
|
|
int old_width, old_height, old_bpp, old_fullscreen;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
if (vid_locked || !vid_changed)
|
|
|
|
return;
|
|
|
|
//
|
|
|
|
// now try the switch
|
|
|
|
//
|
2014-09-05 19:34:43 +00:00
|
|
|
old_width = VID_GetCurrentWidth();
|
|
|
|
old_height = VID_GetCurrentHeight();
|
|
|
|
old_bpp = VID_GetCurrentBPP();
|
|
|
|
old_fullscreen = VID_GetFullscreen() ? true : false;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
VID_Restart ();
|
|
|
|
|
|
|
|
//pop up confirmation dialoge
|
|
|
|
if (!SCR_ModalMessage("Would you like to keep this\nvideo mode? (y/n)\n", 5.0f))
|
|
|
|
{
|
|
|
|
//revert cvars and mode
|
2013-02-19 19:00:19 +00:00
|
|
|
Cvar_SetValueQuick (&vid_width, old_width);
|
|
|
|
Cvar_SetValueQuick (&vid_height, old_height);
|
|
|
|
Cvar_SetValueQuick (&vid_bpp, old_bpp);
|
|
|
|
Cvar_SetQuick (&vid_fullscreen, old_fullscreen ? "1" : "0");
|
2010-02-15 23:26:55 +00:00
|
|
|
VID_Restart ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Unlock -- johnfitz
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Unlock (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
vid_locked = false;
|
2012-11-01 17:34:40 +00:00
|
|
|
VID_SyncCvars();
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
//
|
|
|
|
// OPENGL STUFF
|
|
|
|
//
|
|
|
|
//==============================================================================
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
GL_MakeNiceExtensionsList -- johnfitz
|
|
|
|
===============
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static char *GL_MakeNiceExtensionsList (const char *in)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
char *copy, *token, *out;
|
|
|
|
int i, count;
|
|
|
|
|
2012-11-07 12:44:30 +00:00
|
|
|
if (!in) return Z_Strdup("(none)");
|
2012-11-07 07:51:41 +00:00
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//each space will be replaced by 4 chars, so count the spaces before we malloc
|
2011-12-29 19:06:08 +00:00
|
|
|
for (i = 0, count = 1; i < (int) strlen(in); i++)
|
2011-12-30 14:00:28 +00:00
|
|
|
{
|
2010-02-15 23:26:55 +00:00
|
|
|
if (in[i] == ' ')
|
|
|
|
count++;
|
2011-12-30 14:00:28 +00:00
|
|
|
}
|
|
|
|
|
host_cmd.c, console.c, gl_draw.c, image.c, gl_model.c, r_sprite.c, cl_parse.c,
gl_warp.c, host.c, gl_mesh.c, gl_sky.c, gl_texmgr.c, cvar.c, sv_main.c, cvar.h,
gl_screen.c, r_brush.c, gl_vidsdl.c, zone.c, cl_main.c, cmd.c, snd_dma.c,
snd_mem.c, common.c, sv_phys.c: Added explicit casts to eliminate -Wc++-compat
warnings.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@170 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-05-31 07:42:36 +00:00
|
|
|
out = (char *) Z_Malloc (strlen(in) + count*3 + 1); //usually about 1-2k
|
2010-02-15 23:26:55 +00:00
|
|
|
out[0] = 0;
|
|
|
|
|
2010-08-29 02:22:55 +00:00
|
|
|
copy = (char *) Z_Strdup(in);
|
2010-02-15 23:26:55 +00:00
|
|
|
for (token = strtok(copy, " "); token; token = strtok(NULL, " "))
|
|
|
|
{
|
|
|
|
strcat(out, "\n ");
|
|
|
|
strcat(out, token);
|
|
|
|
}
|
|
|
|
|
|
|
|
Z_Free (copy);
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
GL_Info_f -- johnfitz
|
|
|
|
===============
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void GL_Info_f (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
Con_SafePrintf ("GL_VENDOR: %s\n", gl_vendor);
|
|
|
|
Con_SafePrintf ("GL_RENDERER: %s\n", gl_renderer);
|
|
|
|
Con_SafePrintf ("GL_VERSION: %s\n", gl_version);
|
|
|
|
Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions_nice);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
2012-11-07 07:51:41 +00:00
|
|
|
GL_CheckExtensions
|
2010-02-15 23:26:55 +00:00
|
|
|
===============
|
|
|
|
*/
|
2012-11-07 07:51:41 +00:00
|
|
|
static qboolean GL_ParseExtensionList (const char *list, const char *name)
|
|
|
|
{
|
|
|
|
const char *start;
|
|
|
|
const char *where, *terminator;
|
|
|
|
|
|
|
|
if (!list || !name || !*name)
|
|
|
|
return false;
|
|
|
|
if (strchr(name, ' ') != NULL)
|
|
|
|
return false; // extension names must not have spaces
|
|
|
|
|
|
|
|
start = list;
|
|
|
|
while (1) {
|
|
|
|
where = strstr (start, name);
|
|
|
|
if (!where)
|
|
|
|
break;
|
|
|
|
terminator = where + strlen (name);
|
|
|
|
if (where == start || where[-1] == ' ')
|
|
|
|
if (*terminator == ' ' || *terminator == '\0')
|
|
|
|
return true;
|
|
|
|
start = terminator;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static void GL_CheckExtensions (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2010-02-17 23:32:04 +00:00
|
|
|
int swap_control;
|
2014-09-21 11:01:02 +00:00
|
|
|
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
// ARB_vertex_buffer_object
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-novbo"))
|
|
|
|
Con_Warning ("Vertex buffer objects disabled at command line\n");
|
2014-10-03 18:31:58 +00:00
|
|
|
else if (gl_version_major < 1 || (gl_version_major == 1 && gl_version_minor < 5))
|
|
|
|
Con_Warning ("OpenGL version < 1.5, skipping ARB_vertex_buffer_object check\n");
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
GL_BindBufferFunc = (PFNGLBINDBUFFERARBPROC) SDL_GL_GetProcAddress("glBindBufferARB");
|
|
|
|
GL_BufferDataFunc = (PFNGLBUFFERDATAARBPROC) SDL_GL_GetProcAddress("glBufferDataARB");
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
GL_BufferSubDataFunc = (PFNGLBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glBufferSubDataARB");
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
GL_DeleteBuffersFunc = (PFNGLDELETEBUFFERSARBPROC) SDL_GL_GetProcAddress("glDeleteBuffersARB");
|
|
|
|
GL_GenBuffersFunc = (PFNGLGENBUFFERSARBPROC) SDL_GL_GetProcAddress("glGenBuffersARB");
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
if (GL_BindBufferFunc && GL_BufferDataFunc && GL_BufferSubDataFunc && GL_DeleteBuffersFunc && GL_GenBuffersFunc)
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
{
|
|
|
|
Con_Printf("FOUND: ARB_vertex_buffer_object\n");
|
|
|
|
gl_vbo_able = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("ARB_vertex_buffer_object not available\n");
|
|
|
|
}
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
// multitexture
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-nomtex"))
|
2010-04-23 06:43:24 +00:00
|
|
|
Con_Warning ("Mutitexture disabled at command line\n");
|
2012-11-07 07:51:41 +00:00
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_ARB_multitexture"))
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
GL_MTexCoord2fFunc = (PFNGLMULTITEXCOORD2FARBPROC) SDL_GL_GetProcAddress("glMultiTexCoord2fARB");
|
|
|
|
GL_SelectTextureFunc = (PFNGLACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress("glActiveTextureARB");
|
Load world and brush models into a VBO, and draw it in batches in R_DrawTextureChains_Multitexture. Uses the same immediate mode code as before if VBOs are not available, or if "-novbo" used at the command line. I only touched R_DrawTextureChains_Multitexture because it's usually the main bottleneck aside from alias model rendering.
This seems to help fps a fair bit on maps with a lot of world polys like jam2_tronyn. Tried on a few computers with intel and nvidia gpus, windows, mac os, linux, and there's always at least some fps improvement. Best case was 70fps -> 96fps on jam2_tronyn, on OS X + nvidia 650gt.
Interested to hear how this works for amd gpu's, just do a timedemo with and without "-novbo".
Only downside is I had to disable the fast path in Vid_Toggle_f() because at least with SDL1, the vbo no longer works after a toggle. So as a result, fullscreen toggles with alt-enter are slightly slower.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1018 af15c1b1-3010-417e-b628-4374ebc0bcbd
2014-09-11 04:55:16 +00:00
|
|
|
GL_ClientActiveTextureFunc = (PFNGLCLIENTACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress("glClientActiveTextureARB");
|
|
|
|
if (GL_MTexCoord2fFunc && GL_SelectTextureFunc && GL_ClientActiveTextureFunc)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2010-12-26 22:10:44 +00:00
|
|
|
Con_Printf("FOUND: ARB_multitexture\n");
|
2014-08-30 06:30:49 +00:00
|
|
|
gl_mtexable = true;
|
2014-09-20 01:08:13 +00:00
|
|
|
|
|
|
|
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gl_max_texture_units);
|
|
|
|
Con_Printf("GL_MAX_TEXTURE_UNITS: %d\n", (int)gl_max_texture_units);
|
2014-08-30 06:30:49 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("Couldn't link to multitexture functions\n");
|
|
|
|
}
|
|
|
|
}
|
2010-12-26 22:10:44 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("multitexture not supported (extension not found)\n");
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
// texture_env_combine
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-nocombine"))
|
2010-04-23 06:43:24 +00:00
|
|
|
Con_Warning ("texture_env_combine disabled at command line\n");
|
2012-11-07 07:51:41 +00:00
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_ARB_texture_env_combine"))
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Printf("FOUND: ARB_texture_env_combine\n");
|
|
|
|
gl_texture_env_combine = true;
|
|
|
|
}
|
2012-11-07 07:51:41 +00:00
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_EXT_texture_env_combine"))
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Printf("FOUND: EXT_texture_env_combine\n");
|
|
|
|
gl_texture_env_combine = true;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
else
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Warning ("texture_env_combine not supported\n");
|
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
// texture_env_add
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-noadd"))
|
|
|
|
Con_Warning ("texture_env_add disabled at command line\n");
|
2012-11-07 07:51:41 +00:00
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_ARB_texture_env_add"))
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Printf("FOUND: ARB_texture_env_add\n");
|
|
|
|
gl_texture_env_add = true;
|
|
|
|
}
|
2012-11-07 07:51:41 +00:00
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_EXT_texture_env_add"))
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Printf("FOUND: EXT_texture_env_add\n");
|
|
|
|
gl_texture_env_add = true;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
else
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
|
|
|
Con_Warning ("texture_env_add not supported\n");
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-09-21 07:52:22 +00:00
|
|
|
// swap control
|
2010-02-15 23:26:55 +00:00
|
|
|
//
|
2012-11-11 17:35:43 +00:00
|
|
|
if (!gl_swap_control)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-09-21 07:52:22 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
Con_Warning ("vertical sync not supported (SDL_GL_SetSwapInterval failed)\n");
|
|
|
|
#else
|
2012-11-11 17:35:43 +00:00
|
|
|
Con_Warning ("vertical sync not supported (SDL_GL_SetAttribute failed)\n");
|
2014-09-21 07:52:22 +00:00
|
|
|
#endif
|
2012-11-11 17:35:43 +00:00
|
|
|
}
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
else if ((swap_control = SDL_GL_GetSwapInterval()) == -1)
|
|
|
|
#else
|
2012-11-11 17:35:43 +00:00
|
|
|
else if (SDL_GL_GetAttribute(SDL_GL_SWAP_CONTROL, &swap_control) == -1)
|
2014-09-21 07:52:22 +00:00
|
|
|
#endif
|
2012-11-11 17:35:43 +00:00
|
|
|
{
|
|
|
|
gl_swap_control = false;
|
2014-09-21 07:52:22 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
Con_Warning ("vertical sync not supported (SDL_GL_GetSwapInterval failed)\n");
|
|
|
|
#else
|
2012-11-11 17:35:43 +00:00
|
|
|
Con_Warning ("vertical sync not supported (SDL_GL_GetAttribute failed)\n");
|
2014-09-05 19:34:43 +00:00
|
|
|
#endif
|
2014-09-21 07:52:22 +00:00
|
|
|
}
|
2012-11-11 17:35:43 +00:00
|
|
|
else if ((vid_vsync.value && swap_control != 1) || (!vid_vsync.value && swap_control != 0))
|
|
|
|
{
|
|
|
|
gl_swap_control = false;
|
|
|
|
Con_Warning ("vertical sync not supported (swap_control doesn't match vid_vsync)\n");
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
else
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
2014-09-21 07:52:22 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
Con_Printf("FOUND: SDL_GL_SetSwapInterval\n");
|
|
|
|
#else
|
2012-11-11 17:35:43 +00:00
|
|
|
Con_Printf("FOUND: SDL_GL_SWAP_CONTROL\n");
|
2014-09-21 07:52:22 +00:00
|
|
|
#endif
|
2010-12-26 22:10:44 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
// anisotropic filtering
|
|
|
|
//
|
2012-11-07 07:51:41 +00:00
|
|
|
if (GL_ParseExtensionList(gl_extensions, "GL_EXT_texture_filter_anisotropic"))
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
float test1,test2;
|
2010-02-17 23:32:04 +00:00
|
|
|
GLuint tex;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
// test to make sure we really have control over it
|
|
|
|
// 1.0 and 2.0 should always be legal values
|
|
|
|
glGenTextures(1, &tex);
|
|
|
|
glBindTexture (GL_TEXTURE_2D, tex);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
|
|
|
|
glGetTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &test1);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f);
|
|
|
|
glGetTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &test2);
|
|
|
|
glDeleteTextures(1, &tex);
|
|
|
|
|
|
|
|
if (test1 == 1 && test2 == 2)
|
|
|
|
{
|
|
|
|
Con_Printf("FOUND: EXT_texture_filter_anisotropic\n");
|
|
|
|
gl_anisotropy_able = true;
|
|
|
|
}
|
|
|
|
else
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
2010-04-23 06:43:24 +00:00
|
|
|
Con_Warning ("anisotropic filtering locked by driver. Current driver setting is %f\n", test1);
|
2010-12-26 22:10:44 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
//get max value either way, so the menu and stuff know it
|
|
|
|
glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max_anisotropy);
|
2012-01-20 17:11:24 +00:00
|
|
|
if (gl_max_anisotropy < 2)
|
2012-01-19 20:55:27 +00:00
|
|
|
{
|
|
|
|
gl_anisotropy_able = false;
|
|
|
|
gl_max_anisotropy = 1;
|
2012-01-20 17:11:24 +00:00
|
|
|
Con_Warning ("anisotropic filtering broken: disabled\n");
|
2012-01-19 20:55:27 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
else
|
2010-12-26 22:10:44 +00:00
|
|
|
{
|
2012-01-19 20:55:27 +00:00
|
|
|
gl_max_anisotropy = 1;
|
2010-04-23 06:43:24 +00:00
|
|
|
Con_Warning ("texture_filter_anisotropic not supported\n");
|
2010-12-26 22:10:44 +00:00
|
|
|
}
|
2014-07-11 06:56:09 +00:00
|
|
|
|
|
|
|
// texture_non_power_of_two
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-notexturenpot"))
|
|
|
|
Con_Warning ("texture_non_power_of_two disabled at command line\n");
|
|
|
|
else if (GL_ParseExtensionList(gl_extensions, "GL_ARB_texture_non_power_of_two"))
|
|
|
|
{
|
|
|
|
Con_Printf("FOUND: GL_ARB_texture_non_power_of_two\n");
|
|
|
|
gl_texture_NPOT = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("texture_non_power_of_two not supported\n");
|
|
|
|
}
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
|
|
|
|
// GLSL
|
|
|
|
//
|
|
|
|
if (COM_CheckParm("-noglsl"))
|
|
|
|
Con_Warning ("GLSL disabled at command line\n");
|
|
|
|
else if (gl_version_major >= 2)
|
|
|
|
{
|
|
|
|
GL_CreateShaderFunc = (QS_PFNGLCREATESHADERPROC) SDL_GL_GetProcAddress("glCreateShader");
|
|
|
|
GL_DeleteShaderFunc = (QS_PFNGLDELETESHADERPROC) SDL_GL_GetProcAddress("glDeleteShader");
|
|
|
|
GL_DeleteProgramFunc = (QS_PFNGLDELETEPROGRAMPROC) SDL_GL_GetProcAddress("glDeleteProgram");
|
|
|
|
GL_ShaderSourceFunc = (QS_PFNGLSHADERSOURCEPROC) SDL_GL_GetProcAddress("glShaderSource");
|
|
|
|
GL_CompileShaderFunc = (QS_PFNGLCOMPILESHADERPROC) SDL_GL_GetProcAddress("glCompileShader");
|
|
|
|
GL_GetShaderivFunc = (QS_PFNGLGETSHADERIVPROC) SDL_GL_GetProcAddress("glGetShaderiv");
|
|
|
|
GL_GetShaderInfoLogFunc = (QS_PFNGLGETSHADERINFOLOGPROC) SDL_GL_GetProcAddress("glGetShaderInfoLog");
|
|
|
|
GL_GetProgramivFunc = (QS_PFNGLGETPROGRAMIVPROC) SDL_GL_GetProcAddress("glGetProgramiv");
|
|
|
|
GL_GetProgramInfoLogFunc = (QS_PFNGLGETPROGRAMINFOLOGPROC) SDL_GL_GetProcAddress("glGetProgramInfoLog");
|
|
|
|
GL_CreateProgramFunc = (QS_PFNGLCREATEPROGRAMPROC) SDL_GL_GetProcAddress("glCreateProgram");
|
|
|
|
GL_AttachShaderFunc = (QS_PFNGLATTACHSHADERPROC) SDL_GL_GetProcAddress("glAttachShader");
|
|
|
|
GL_LinkProgramFunc = (QS_PFNGLLINKPROGRAMPROC) SDL_GL_GetProcAddress("glLinkProgram");
|
|
|
|
GL_BindAttribLocationFunc = (QS_PFNGLBINDATTRIBLOCATIONFUNC) SDL_GL_GetProcAddress("glBindAttribLocation");
|
|
|
|
GL_UseProgramFunc = (QS_PFNGLUSEPROGRAMPROC) SDL_GL_GetProcAddress("glUseProgram");
|
|
|
|
GL_GetAttribLocationFunc = (QS_PFNGLGETATTRIBLOCATIONPROC) SDL_GL_GetProcAddress("glGetAttribLocation");
|
|
|
|
GL_VertexAttribPointerFunc = (QS_PFNGLVERTEXATTRIBPOINTERPROC) SDL_GL_GetProcAddress("glVertexAttribPointer");
|
|
|
|
GL_EnableVertexAttribArrayFunc = (QS_PFNGLENABLEVERTEXATTRIBARRAYPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArray");
|
|
|
|
GL_DisableVertexAttribArrayFunc = (QS_PFNGLDISABLEVERTEXATTRIBARRAYPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArray");
|
|
|
|
GL_GetUniformLocationFunc = (QS_PFNGLGETUNIFORMLOCATIONPROC) SDL_GL_GetProcAddress("glGetUniformLocation");
|
|
|
|
GL_Uniform1iFunc = (QS_PFNGLUNIFORM1IPROC) SDL_GL_GetProcAddress("glUniform1i");
|
|
|
|
GL_Uniform1fFunc = (QS_PFNGLUNIFORM1FPROC) SDL_GL_GetProcAddress("glUniform1f");
|
|
|
|
GL_Uniform3fFunc = (QS_PFNGLUNIFORM3FPROC) SDL_GL_GetProcAddress("glUniform3f");
|
|
|
|
GL_Uniform4fFunc = (QS_PFNGLUNIFORM4FPROC) SDL_GL_GetProcAddress("glUniform4f");
|
|
|
|
|
|
|
|
if (GL_CreateShaderFunc &&
|
|
|
|
GL_DeleteShaderFunc &&
|
|
|
|
GL_DeleteProgramFunc &&
|
|
|
|
GL_ShaderSourceFunc &&
|
|
|
|
GL_CompileShaderFunc &&
|
|
|
|
GL_GetShaderivFunc &&
|
|
|
|
GL_GetShaderInfoLogFunc &&
|
|
|
|
GL_GetProgramivFunc &&
|
|
|
|
GL_GetProgramInfoLogFunc &&
|
|
|
|
GL_CreateProgramFunc &&
|
|
|
|
GL_AttachShaderFunc &&
|
|
|
|
GL_LinkProgramFunc &&
|
|
|
|
GL_BindAttribLocationFunc &&
|
|
|
|
GL_UseProgramFunc &&
|
|
|
|
GL_GetAttribLocationFunc &&
|
|
|
|
GL_VertexAttribPointerFunc &&
|
|
|
|
GL_EnableVertexAttribArrayFunc &&
|
|
|
|
GL_DisableVertexAttribArrayFunc &&
|
|
|
|
GL_GetUniformLocationFunc &&
|
|
|
|
GL_Uniform1iFunc &&
|
|
|
|
GL_Uniform1fFunc &&
|
|
|
|
GL_Uniform3fFunc &&
|
|
|
|
GL_Uniform4fFunc)
|
|
|
|
{
|
|
|
|
Con_Printf("FOUND: GLSL\n");
|
|
|
|
gl_glsl_able = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("GLSL not available\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Con_Warning ("OpenGL version < 2, GLSL not available\n");
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
GL_SetupState -- johnfitz
|
|
|
|
|
|
|
|
does all the stuff from GL_Init that needs to be done every time a new GL render context is created
|
|
|
|
===============
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void GL_SetupState (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
glClearColor (0.15,0.15,0.15,0); //johnfitz -- originally 1,0,0,0
|
|
|
|
glCullFace(GL_BACK); //johnfitz -- glquake used CCW with backwards culling -- let's do it right
|
|
|
|
glFrontFace(GL_CW); //johnfitz -- glquake used CCW with backwards culling -- let's do it right
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glEnable(GL_ALPHA_TEST);
|
|
|
|
glAlphaFunc(GL_GREATER, 0.666);
|
|
|
|
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
glShadeModel (GL_FLAT);
|
|
|
|
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //johnfitz
|
|
|
|
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glDepthRange (0, 1); //johnfitz -- moved here becuase gl_ztrick is gone.
|
|
|
|
glDepthFunc (GL_LEQUAL); //johnfitz -- moved here becuase gl_ztrick is gone.
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
GL_Init
|
|
|
|
===============
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void GL_Init (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
gl_vendor = (const char *) glGetString (GL_VENDOR);
|
|
|
|
gl_renderer = (const char *) glGetString (GL_RENDERER);
|
|
|
|
gl_version = (const char *) glGetString (GL_VERSION);
|
|
|
|
gl_extensions = (const char *) glGetString (GL_EXTENSIONS);
|
|
|
|
|
2014-10-03 18:31:58 +00:00
|
|
|
if (gl_version == NULL || sscanf(gl_version, "%d.%d", &gl_version_major, &gl_version_minor) < 2)
|
|
|
|
{
|
|
|
|
gl_version_major = 0;
|
|
|
|
gl_version_minor = 0;
|
|
|
|
}
|
|
|
|
|
2012-11-07 12:44:30 +00:00
|
|
|
if (gl_extensions_nice != NULL)
|
|
|
|
Z_Free (gl_extensions_nice);
|
|
|
|
gl_extensions_nice = GL_MakeNiceExtensionsList (gl_extensions);
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
GL_CheckExtensions (); //johnfitz
|
|
|
|
|
2014-11-02 23:01:20 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
// ericw -- enable multi-threaded OpenGL, gives a decent FPS boost.
|
2014-11-03 09:20:23 +00:00
|
|
|
// https://developer.apple.com/library/mac/technotes/tn2085/
|
|
|
|
if (host_parms->numcpus > 1 &&
|
|
|
|
kCGLNoError != CGLEnable(CGLGetCurrentContext(), kCGLCEMPEngine))
|
2014-11-02 23:01:20 +00:00
|
|
|
{
|
|
|
|
Con_Warning ("Couldn't enable multi-threaded OpenGL");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//johnfitz -- intel video workarounds from Baker
|
|
|
|
if (!strcmp(gl_vendor, "Intel"))
|
|
|
|
{
|
2013-03-02 15:32:27 +00:00
|
|
|
Con_Printf ("Intel Display Adapter detected, enabling gl_clear\n");
|
2013-03-02 13:10:02 +00:00
|
|
|
Cbuf_AddText ("gl_clear 1");
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
//johnfitz
|
Alias model rendering fast-path using OpenGL 2.
In GL_MakeAliasModelDisplayLists, after saving the standerd triangle strips and fans onto the hunk, if the system is GL2 capable, we also save a second version of the mdl on the hunk designed to be loaded into a VBO (GL_MakeAliasModelDisplayLists_VBO). In R_NewMap, and on video mode changes, we call GLMesh_LoadVertexBuffers which loops over all precached mdl's and loads the data into a pair of VBO's (vertices and vertex indices).
Finally, in R_DrawAliasModel, assuming no rendering options are disabling the fast-path (r_drawflat 1, r_lightmap 1, or r_fullbright 1 would disable it), we call GL_DrawAliasFrame_GLSL, which sets up all of the bindings and draws the (possibly lerped) mdl in one glDrawElements call.
Special thanks to MH for some of the code from RMQEngine and the general concept.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1151 af15c1b1-3010-417e-b628-4374ebc0bcbd
2015-01-20 18:59:15 +00:00
|
|
|
|
|
|
|
R_DeleteShaders ();
|
|
|
|
GLAlias_CreateShaders ();
|
|
|
|
GL_ClearBufferBindings ();
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
GL_BeginRendering -- sets values of glx, gly, glwidth, glheight
|
|
|
|
=================
|
|
|
|
*/
|
|
|
|
void GL_BeginRendering (int *x, int *y, int *width, int *height)
|
|
|
|
{
|
|
|
|
*x = *y = 0;
|
|
|
|
*width = vid.width;
|
|
|
|
*height = vid.height;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
GL_EndRendering
|
|
|
|
=================
|
|
|
|
*/
|
|
|
|
void GL_EndRendering (void)
|
|
|
|
{
|
2012-02-10 22:37:07 +00:00
|
|
|
if (!scr_skipupdate)
|
2014-09-05 19:34:43 +00:00
|
|
|
{
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
SDL_GL_SwapWindow(draw_context);
|
|
|
|
#else
|
2010-02-17 23:32:04 +00:00
|
|
|
SDL_GL_SwapBuffers();
|
2014-09-05 19:34:43 +00:00
|
|
|
#endif
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void VID_Shutdown (void)
|
|
|
|
{
|
|
|
|
if (vid_initialized)
|
|
|
|
{
|
|
|
|
VID_Gamma_Shutdown (); //johnfitz
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
|
draw_context = NULL;
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
gl_context = NULL;
|
|
|
|
#endif
|
2010-02-17 23:32:04 +00:00
|
|
|
PL_VID_Shutdown();
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===================================================================
|
|
|
|
|
|
|
|
MAIN WINDOW
|
|
|
|
|
|
|
|
===================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
ClearAllStates
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void ClearAllStates (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
Key_ClearStates ();
|
|
|
|
IN_ClearStates ();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// COMMANDS
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
2013-02-09 16:10:23 +00:00
|
|
|
VID_DescribeCurrentMode_f
|
2010-02-15 23:26:55 +00:00
|
|
|
=================
|
|
|
|
*/
|
2013-02-09 16:10:23 +00:00
|
|
|
static void VID_DescribeCurrentMode_f (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-02-17 17:58:05 +00:00
|
|
|
if (draw_context)
|
2013-02-11 18:03:14 +00:00
|
|
|
Con_Printf("%dx%dx%d %s\n",
|
2014-09-05 19:34:43 +00:00
|
|
|
VID_GetCurrentWidth(),
|
|
|
|
VID_GetCurrentHeight(),
|
|
|
|
VID_GetCurrentBPP(),
|
|
|
|
VID_GetFullscreen() ? "fullscreen" : "windowed");
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
VID_DescribeModes_f -- johnfitz -- changed formatting, and added refresh rates after each mode.
|
|
|
|
=================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_DescribeModes_f (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-02-09 16:10:23 +00:00
|
|
|
int i;
|
2011-12-30 14:00:28 +00:00
|
|
|
int lastwidth, lastheight, lastbpp, count;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
lastwidth = lastheight = lastbpp = count = 0;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:33:30 +00:00
|
|
|
for (i = 0; i < nummodes; i++)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-02-09 16:10:23 +00:00
|
|
|
if (lastwidth != modelist[i].width || lastheight != modelist[i].height || lastbpp != modelist[i].bpp)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2011-12-18 16:27:14 +00:00
|
|
|
if (count > 0)
|
2010-02-15 23:26:55 +00:00
|
|
|
Con_SafePrintf ("\n");
|
2013-02-09 16:10:23 +00:00
|
|
|
Con_SafePrintf (" %4i x %4i x %i", modelist[i].width, modelist[i].height, modelist[i].bpp);
|
|
|
|
lastwidth = modelist[i].width;
|
|
|
|
lastheight = modelist[i].height;
|
|
|
|
lastbpp = modelist[i].bpp;
|
2010-02-15 23:26:55 +00:00
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Con_Printf ("\n%i modes\n", count);
|
|
|
|
}
|
|
|
|
|
2014-08-12 19:39:20 +00:00
|
|
|
/*
|
|
|
|
===================
|
|
|
|
VID_FSAA_f -- ericw -- warn that vid_fsaa requires engine restart
|
|
|
|
===================
|
|
|
|
*/
|
|
|
|
static void VID_FSAA_f (cvar_t *var)
|
|
|
|
{
|
2014-08-30 03:22:36 +00:00
|
|
|
// don't print the warning if vid_fsaa is set during startup
|
|
|
|
if (vid_initialized)
|
|
|
|
Con_Printf("%s %d requires engine restart to take effect\n", var->name, (int)var->value);
|
2014-08-12 19:39:20 +00:00
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// INIT
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
2013-02-24 13:33:30 +00:00
|
|
|
VID_InitModelist
|
2010-02-15 23:26:55 +00:00
|
|
|
=================
|
|
|
|
*/
|
2013-02-24 13:33:30 +00:00
|
|
|
static void VID_InitModelist (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
const int sdlmodes = SDL_GetNumDisplayModes(0);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
nummodes = 0;
|
|
|
|
for (i = 0; i < sdlmodes; i++)
|
|
|
|
{
|
2014-10-12 11:20:34 +00:00
|
|
|
SDL_DisplayMode mode;
|
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
if (nummodes >= MAX_MODE_LIST)
|
|
|
|
break;
|
|
|
|
if (SDL_GetDisplayMode(0, i, &mode) == 0)
|
|
|
|
{
|
|
|
|
modelist[nummodes].width = mode.w;
|
|
|
|
modelist[nummodes].height = mode.h;
|
|
|
|
modelist[nummodes].bpp = SDL_BITSPERPIXEL(mode.format);
|
|
|
|
nummodes++;
|
|
|
|
}
|
|
|
|
}
|
2014-09-21 11:01:02 +00:00
|
|
|
#else /* !defined(USE_SDL2) */
|
2010-02-17 23:32:04 +00:00
|
|
|
SDL_PixelFormat format;
|
|
|
|
SDL_Rect **modes;
|
|
|
|
Uint32 flags;
|
2013-02-24 13:33:30 +00:00
|
|
|
int i, j, k, originalnummodes, existingmode;
|
2012-09-30 21:11:39 +00:00
|
|
|
int bpps[] = {16, 24, 32}; // enumerate >8 bpp modes
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:33:30 +00:00
|
|
|
originalnummodes = nummodes = 0;
|
2010-02-17 23:32:04 +00:00
|
|
|
format.palette = NULL;
|
|
|
|
|
|
|
|
// enumerate fullscreen modes
|
2013-03-03 15:01:14 +00:00
|
|
|
flags = DEFAULT_SDL_FLAGS | SDL_FULLSCREEN;
|
2012-10-01 01:57:20 +00:00
|
|
|
for (i = 0; i < (int)(sizeof(bpps)/sizeof(bpps[0])); i++)
|
2010-02-17 23:32:04 +00:00
|
|
|
{
|
|
|
|
if (nummodes >= MAX_MODE_LIST)
|
|
|
|
break;
|
|
|
|
|
|
|
|
format.BitsPerPixel = bpps[i];
|
|
|
|
modes = SDL_ListModes(&format, flags);
|
|
|
|
|
|
|
|
if (modes == (SDL_Rect **)0 || modes == (SDL_Rect **)-1)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
for (j = 0; modes[j]; j++)
|
|
|
|
{
|
|
|
|
if (modes[j]->w > MAXWIDTH || modes[j]->h > MAXHEIGHT || nummodes >= MAX_MODE_LIST)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
modelist[nummodes].width = modes[j]->w;
|
|
|
|
modelist[nummodes].height = modes[j]->h;
|
|
|
|
modelist[nummodes].bpp = bpps[i];
|
|
|
|
|
|
|
|
for (k=originalnummodes, existingmode = 0 ; k < nummodes ; k++)
|
|
|
|
{
|
|
|
|
if ((modelist[nummodes].width == modelist[k].width) &&
|
|
|
|
(modelist[nummodes].height == modelist[k].height) &&
|
|
|
|
(modelist[nummodes].bpp == modelist[k].bpp))
|
|
|
|
{
|
|
|
|
existingmode = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!existingmode)
|
|
|
|
{
|
|
|
|
nummodes++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
if (nummodes == originalnummodes)
|
|
|
|
Con_SafePrintf ("No fullscreen DIB modes found\n");
|
2014-09-21 11:01:02 +00:00
|
|
|
#endif /* !defined(USE_SDL2) */
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===================
|
|
|
|
VID_Init
|
|
|
|
===================
|
|
|
|
*/
|
|
|
|
void VID_Init (void)
|
|
|
|
{
|
2013-03-03 15:01:14 +00:00
|
|
|
static char vid_center[] = "SDL_VIDEO_CENTERED=center";
|
2014-09-05 19:34:43 +00:00
|
|
|
int p, width, height, bpp, display_width, display_height, display_bpp;
|
2013-02-24 13:23:26 +00:00
|
|
|
qboolean fullscreen;
|
2011-12-20 09:22:19 +00:00
|
|
|
const char *read_vars[] = { "vid_fullscreen",
|
|
|
|
"vid_width",
|
|
|
|
"vid_height",
|
2012-11-01 17:34:40 +00:00
|
|
|
"vid_bpp",
|
2014-08-12 19:39:20 +00:00
|
|
|
"vid_vsync",
|
|
|
|
"vid_fsaa" };
|
2011-12-20 09:22:19 +00:00
|
|
|
#define num_readvars ( sizeof(read_vars)/sizeof(read_vars[0]) )
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-28 22:01:33 +00:00
|
|
|
Cvar_RegisterVariable (&vid_fullscreen); //johnfitz
|
|
|
|
Cvar_RegisterVariable (&vid_width); //johnfitz
|
|
|
|
Cvar_RegisterVariable (&vid_height); //johnfitz
|
|
|
|
Cvar_RegisterVariable (&vid_bpp); //johnfitz
|
2012-11-02 20:04:26 +00:00
|
|
|
Cvar_RegisterVariable (&vid_vsync); //johnfitz
|
2014-08-12 19:39:20 +00:00
|
|
|
Cvar_RegisterVariable (&vid_fsaa); //QuakeSpasm
|
2011-12-28 22:01:33 +00:00
|
|
|
Cvar_SetCallback (&vid_fullscreen, VID_Changed_f);
|
|
|
|
Cvar_SetCallback (&vid_width, VID_Changed_f);
|
|
|
|
Cvar_SetCallback (&vid_height, VID_Changed_f);
|
|
|
|
Cvar_SetCallback (&vid_bpp, VID_Changed_f);
|
2012-11-02 20:04:26 +00:00
|
|
|
Cvar_SetCallback (&vid_vsync, VID_Changed_f);
|
2014-08-12 19:39:20 +00:00
|
|
|
Cvar_SetCallback (&vid_fsaa, VID_FSAA_f);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
Cmd_AddCommand ("vid_unlock", VID_Unlock); //johnfitz
|
|
|
|
Cmd_AddCommand ("vid_restart", VID_Restart); //johnfitz
|
|
|
|
Cmd_AddCommand ("vid_test", VID_Test); //johnfitz
|
|
|
|
Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f);
|
|
|
|
Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f);
|
|
|
|
|
2013-02-24 17:15:04 +00:00
|
|
|
putenv (vid_center); /* SDL_putenv is problematic in versions <= 1.2.9 */
|
2013-02-24 16:28:28 +00:00
|
|
|
|
2014-10-18 16:33:01 +00:00
|
|
|
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
|
|
|
|
Sys_Error("Couldn't init SDL video: %s", SDL_GetError());
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
#if defined(USE_SDL2)
|
|
|
|
{
|
|
|
|
SDL_DisplayMode mode;
|
|
|
|
if (SDL_GetDesktopDisplayMode(0, &mode) != 0)
|
|
|
|
Sys_Error("Could not get desktop display mode");
|
|
|
|
|
|
|
|
display_width = mode.w;
|
|
|
|
display_height = mode.h;
|
|
|
|
display_bpp = SDL_BITSPERPIXEL(mode.format);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
{
|
|
|
|
const SDL_VideoInfo *info = SDL_GetVideoInfo();
|
|
|
|
display_width = info->current_w;
|
|
|
|
display_height = info->current_h;
|
|
|
|
display_bpp = info->vfmt->BitsPerPixel;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
Cvar_SetValueQuick (&vid_bpp, (float)display_bpp);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-20 09:22:19 +00:00
|
|
|
if (CFG_OpenConfig("config.cfg") == 0)
|
|
|
|
{
|
|
|
|
CFG_ReadCvars(read_vars, num_readvars);
|
|
|
|
CFG_CloseConfig();
|
|
|
|
}
|
|
|
|
CFG_ReadCvarOverrides(read_vars, num_readvars);
|
|
|
|
|
2013-02-24 13:33:30 +00:00
|
|
|
VID_InitModelist();
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
width = (int)vid_width.value;
|
|
|
|
height = (int)vid_height.value;
|
|
|
|
bpp = (int)vid_bpp.value;
|
|
|
|
fullscreen = (int)vid_fullscreen.value;
|
2014-08-12 19:39:20 +00:00
|
|
|
fsaa = (int)vid_fsaa.value;
|
2014-08-11 08:08:15 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if (COM_CheckParm("-current"))
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2014-09-05 19:34:43 +00:00
|
|
|
width = display_width;
|
|
|
|
height = display_height;
|
|
|
|
bpp = display_bpp;
|
2013-02-24 13:23:26 +00:00
|
|
|
fullscreen = true;
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-02-24 13:23:26 +00:00
|
|
|
p = COM_CheckParm("-width");
|
|
|
|
if (p && p < com_argc-1)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-02-24 13:23:26 +00:00
|
|
|
width = Q_atoi(com_argv[p+1]);
|
2011-12-20 09:22:19 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if(!COM_CheckParm("-height"))
|
|
|
|
height = width * 3 / 4;
|
2011-12-22 21:55:48 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
p = COM_CheckParm("-height");
|
|
|
|
if (p && p < com_argc-1)
|
2011-12-22 21:55:48 +00:00
|
|
|
{
|
2013-02-24 13:23:26 +00:00
|
|
|
height = Q_atoi(com_argv[p+1]);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if(!COM_CheckParm("-width"))
|
|
|
|
width = height * 4 / 3;
|
2011-12-22 21:55:48 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
p = COM_CheckParm("-bpp");
|
|
|
|
if (p && p < com_argc-1)
|
|
|
|
bpp = Q_atoi(com_argv[p+1]);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if (COM_CheckParm("-window") || COM_CheckParm("-w"))
|
|
|
|
fullscreen = false;
|
|
|
|
else if (COM_CheckParm("-fullscreen") || COM_CheckParm("-f"))
|
|
|
|
fullscreen = true;
|
|
|
|
}
|
2014-08-11 08:08:15 +00:00
|
|
|
|
2014-08-12 19:39:20 +00:00
|
|
|
p = COM_CheckParm ("-fsaa");
|
|
|
|
if (p && p < com_argc-1)
|
|
|
|
fsaa = atoi(com_argv[p+1]);
|
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if (!VID_ValidMode(width, height, bpp, fullscreen))
|
|
|
|
{
|
|
|
|
width = (int)vid_width.value;
|
|
|
|
height = (int)vid_height.value;
|
|
|
|
bpp = (int)vid_bpp.value;
|
|
|
|
fullscreen = (int)vid_fullscreen.value;
|
|
|
|
}
|
2011-12-22 21:55:48 +00:00
|
|
|
|
2013-02-24 13:23:26 +00:00
|
|
|
if (!VID_ValidMode(width, height, bpp, fullscreen))
|
|
|
|
{
|
|
|
|
width = 640;
|
|
|
|
height = 480;
|
2014-09-05 19:34:43 +00:00
|
|
|
bpp = display_bpp;
|
2013-02-24 13:23:26 +00:00
|
|
|
fullscreen = false;
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vid_initialized = true;
|
|
|
|
|
|
|
|
vid.maxwarpwidth = WARP_WIDTH;
|
|
|
|
vid.maxwarpheight = WARP_HEIGHT;
|
|
|
|
vid.colormap = host_colormap;
|
|
|
|
vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
|
|
|
|
|
2010-02-17 23:32:04 +00:00
|
|
|
// set window icon
|
|
|
|
PL_SetWindowIcon();
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2014-08-12 19:25:14 +00:00
|
|
|
VID_SetMode (width, height, bpp, fullscreen);
|
2010-04-24 11:10:07 +00:00
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
GL_Init ();
|
2012-11-06 08:50:45 +00:00
|
|
|
GL_SetupState ();
|
|
|
|
Cmd_AddCommand ("gl_info", GL_Info_f); //johnfitz
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2010-04-24 11:10:07 +00:00
|
|
|
//johnfitz -- removed code creating "glquake" subdirectory
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
vid_menucmdfn = VID_Menu_f; //johnfitz
|
|
|
|
vid_menudrawfn = VID_MenuDraw;
|
|
|
|
vid_menukeyfn = VID_MenuKey;
|
|
|
|
|
|
|
|
VID_Gamma_Init(); //johnfitz
|
|
|
|
VID_Menu_Init(); //johnfitz
|
|
|
|
|
2011-12-20 09:22:19 +00:00
|
|
|
//QuakeSpasm: current vid settings should override config file settings.
|
2010-02-15 23:26:55 +00:00
|
|
|
//so we have to lock the vid mode from now until after all config files are read.
|
2011-12-20 09:22:19 +00:00
|
|
|
vid_locked = true;
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
2010-02-16 09:10:43 +00:00
|
|
|
// new proc by S.A., called by alt-return key binding.
|
|
|
|
void VID_Toggle (void)
|
|
|
|
{
|
2014-09-13 01:48:24 +00:00
|
|
|
static qboolean vid_toggle_works = true;
|
2014-09-05 19:34:43 +00:00
|
|
|
qboolean toggleWorked;
|
2013-02-19 18:18:38 +00:00
|
|
|
|
2010-02-16 09:10:43 +00:00
|
|
|
S_ClearBuffer ();
|
|
|
|
|
2010-02-19 16:03:45 +00:00
|
|
|
if (!vid_toggle_works)
|
|
|
|
goto vrestart;
|
2014-09-13 01:48:24 +00:00
|
|
|
else if (gl_vbo_able)
|
|
|
|
{
|
|
|
|
// disabling the fast path because with SDL 1.2 it invalidates VBOs (using them
|
|
|
|
// causes a crash, sugesting that the fullscreen toggle created a new GL context,
|
|
|
|
// although texture objects remain valid for some reason).
|
|
|
|
//
|
|
|
|
// SDL2 does promise window resizes / fullscreen changes preserve the GL context,
|
|
|
|
// so we could use the fast path with SDL2. --ericw
|
|
|
|
vid_toggle_works = false;
|
|
|
|
goto vrestart;
|
|
|
|
}
|
2014-09-05 19:34:43 +00:00
|
|
|
|
|
|
|
#if defined(USE_SDL2)
|
|
|
|
toggleWorked = SDL_SetWindowFullscreen(draw_context, VID_GetFullscreen() ? 0 : SDL_WINDOW_FULLSCREEN) == 0;
|
|
|
|
#else
|
|
|
|
toggleWorked = SDL_WM_ToggleFullScreen(draw_context) == 1;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (toggleWorked)
|
2010-02-16 09:10:43 +00:00
|
|
|
{
|
2010-02-19 16:03:45 +00:00
|
|
|
Sbar_Changed (); // Sbar seems to need refreshing
|
2013-02-19 18:18:38 +00:00
|
|
|
|
2014-09-05 19:34:43 +00:00
|
|
|
modestate = VID_GetFullscreen() ? MS_FULLSCREEN : MS_WINDOWED;
|
2010-05-02 02:22:24 +00:00
|
|
|
|
2013-02-21 19:35:21 +00:00
|
|
|
VID_SyncCvars();
|
2012-10-05 18:58:59 +00:00
|
|
|
|
2012-10-06 18:09:23 +00:00
|
|
|
// update mouse grab
|
2013-02-24 13:42:23 +00:00
|
|
|
if (key_dest == key_console || key_dest == key_menu)
|
|
|
|
{
|
|
|
|
if (modestate == MS_WINDOWED)
|
|
|
|
IN_Deactivate(true);
|
|
|
|
else if (modestate == MS_FULLSCREEN)
|
|
|
|
IN_Activate();
|
|
|
|
}
|
2010-02-19 16:03:45 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
vid_toggle_works = false;
|
2013-02-19 18:18:38 +00:00
|
|
|
Con_DPrintf ("SDL_WM_ToggleFullScreen failed, attempting VID_Restart\n");
|
2012-10-06 12:28:33 +00:00
|
|
|
vrestart:
|
2014-09-05 19:34:43 +00:00
|
|
|
Cvar_SetQuick (&vid_fullscreen, VID_GetFullscreen() ? "0" : "1");
|
2010-02-19 16:03:45 +00:00
|
|
|
Cbuf_AddText ("vid_restart\n");
|
2010-02-16 09:10:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_SyncCvars -- johnfitz -- set vid cvars to match current video mode
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void VID_SyncCvars (void)
|
|
|
|
{
|
2013-02-17 18:12:00 +00:00
|
|
|
if (draw_context)
|
|
|
|
{
|
2014-09-05 19:34:43 +00:00
|
|
|
Cvar_SetValueQuick (&vid_width, VID_GetCurrentWidth());
|
|
|
|
Cvar_SetValueQuick (&vid_height, VID_GetCurrentHeight());
|
|
|
|
Cvar_SetValueQuick (&vid_bpp, VID_GetCurrentBPP());
|
|
|
|
Cvar_SetQuick (&vid_fullscreen, VID_GetFullscreen() ? "1" : "0");
|
|
|
|
Cvar_SetQuick (&vid_vsync, VID_GetVSync() ? "1" : "0");
|
2013-02-17 18:12:00 +00:00
|
|
|
}
|
2013-02-21 19:35:21 +00:00
|
|
|
|
|
|
|
vid_changed = false;
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// NEW VIDEO MENU -- johnfitz
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
enum {
|
|
|
|
VID_OPT_MODE,
|
|
|
|
VID_OPT_BPP,
|
|
|
|
VID_OPT_FULLSCREEN,
|
|
|
|
VID_OPT_VSYNC,
|
|
|
|
VID_OPT_TEST,
|
|
|
|
VID_OPT_APPLY,
|
|
|
|
VIDEO_OPTIONS_ITEMS
|
|
|
|
};
|
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
static int video_options_cursor = 0;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-30 14:00:28 +00:00
|
|
|
typedef struct {
|
|
|
|
int width,height;
|
|
|
|
} vid_menu_mode;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
//TODO: replace these fixed-length arrays with hunk_allocated buffers
|
2011-12-30 14:00:28 +00:00
|
|
|
static vid_menu_mode vid_menu_modes[MAX_MODE_LIST];
|
|
|
|
static int vid_menu_nummodes = 0;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2012-09-30 21:11:39 +00:00
|
|
|
static int vid_menu_bpps[MAX_BPPS_LIST];
|
2011-12-30 14:00:28 +00:00
|
|
|
static int vid_menu_numbpps = 0;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Menu_Init
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_Init (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2011-12-18 16:27:14 +00:00
|
|
|
int i, j, h, w;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:33:30 +00:00
|
|
|
for (i = 0; i < nummodes; i++)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
w = modelist[i].width;
|
|
|
|
h = modelist[i].height;
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
for (j = 0; j < vid_menu_nummodes; j++)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
if (vid_menu_modes[j].width == w &&
|
|
|
|
vid_menu_modes[j].height == h)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
if (j == vid_menu_nummodes)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
vid_menu_modes[j].width = w;
|
|
|
|
vid_menu_modes[j].height = h;
|
|
|
|
vid_menu_nummodes++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Menu_RebuildBppList
|
|
|
|
|
|
|
|
regenerates bpp list based on current vid_width and vid_height
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_RebuildBppList (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2011-12-18 16:27:14 +00:00
|
|
|
int i, j, b;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
vid_menu_numbpps = 0;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-02-24 13:33:30 +00:00
|
|
|
for (i = 0; i < nummodes; i++)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2012-09-30 21:11:39 +00:00
|
|
|
if (vid_menu_numbpps >= MAX_BPPS_LIST)
|
|
|
|
break;
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//bpp list is limited to bpps available with current width/height
|
|
|
|
if (modelist[i].width != vid_width.value ||
|
|
|
|
modelist[i].height != vid_height.value)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
b = modelist[i].bpp;
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
for (j = 0; j < vid_menu_numbpps; j++)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
if (vid_menu_bpps[j] == b)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
if (j == vid_menu_numbpps)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
vid_menu_bpps[j] = b;
|
|
|
|
vid_menu_numbpps++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-23 06:52:27 +00:00
|
|
|
//if there are no valid fullscreen bpps for this width/height, just pick one
|
|
|
|
if (vid_menu_numbpps == 0)
|
|
|
|
{
|
2011-12-29 21:21:11 +00:00
|
|
|
Cvar_SetValueQuick (&vid_bpp, (float)modelist[0].bpp);
|
2010-04-23 06:52:27 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
//if vid_bpp is not in the new list, change vid_bpp
|
2011-12-18 16:27:14 +00:00
|
|
|
for (i = 0; i < vid_menu_numbpps; i++)
|
2010-02-15 23:26:55 +00:00
|
|
|
if (vid_menu_bpps[i] == (int)(vid_bpp.value))
|
|
|
|
break;
|
|
|
|
|
2011-12-18 16:27:14 +00:00
|
|
|
if (i == vid_menu_numbpps)
|
2011-12-29 21:21:11 +00:00
|
|
|
Cvar_SetValueQuick (&vid_bpp, (float)vid_menu_bpps[0]);
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Menu_ChooseNextMode
|
|
|
|
|
|
|
|
chooses next resolution in order, then updates vid_width and
|
|
|
|
vid_height cvars, then updates bpp and refreshrate lists
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_ChooseNextMode (int dir)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2011-12-22 21:55:48 +00:00
|
|
|
if (vid_menu_nummodes)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2011-12-22 21:55:48 +00:00
|
|
|
for (i = 0; i < vid_menu_nummodes; i++)
|
|
|
|
{
|
|
|
|
if (vid_menu_modes[i].width == vid_width.value &&
|
|
|
|
vid_menu_modes[i].height == vid_height.value)
|
|
|
|
break;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-22 21:55:48 +00:00
|
|
|
if (i == vid_menu_nummodes) //can't find it in list, so it must be a custom windowed res
|
|
|
|
{
|
2010-02-15 23:26:55 +00:00
|
|
|
i = 0;
|
2011-12-22 21:55:48 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
i += dir;
|
|
|
|
if (i >= vid_menu_nummodes)
|
|
|
|
i = 0;
|
|
|
|
else if (i < 0)
|
|
|
|
i = vid_menu_nummodes-1;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-29 21:21:11 +00:00
|
|
|
Cvar_SetValueQuick (&vid_width, (float)vid_menu_modes[i].width);
|
|
|
|
Cvar_SetValueQuick (&vid_height, (float)vid_menu_modes[i].height);
|
2011-12-22 21:55:48 +00:00
|
|
|
VID_Menu_RebuildBppList ();
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Menu_ChooseNextBpp
|
|
|
|
|
2013-03-03 15:01:14 +00:00
|
|
|
chooses next bpp in order, then updates vid_bpp cvar
|
2010-02-15 23:26:55 +00:00
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_ChooseNextBpp (int dir)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2011-12-22 21:55:48 +00:00
|
|
|
if (vid_menu_numbpps)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2011-12-22 21:55:48 +00:00
|
|
|
for (i = 0; i < vid_menu_numbpps; i++)
|
|
|
|
{
|
|
|
|
if (vid_menu_bpps[i] == vid_bpp.value)
|
|
|
|
break;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-22 21:55:48 +00:00
|
|
|
if (i == vid_menu_numbpps) //can't find it in list
|
|
|
|
{
|
2010-02-15 23:26:55 +00:00
|
|
|
i = 0;
|
2011-12-22 21:55:48 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
i += dir;
|
|
|
|
if (i >= vid_menu_numbpps)
|
|
|
|
i = 0;
|
|
|
|
else if (i < 0)
|
|
|
|
i = vid_menu_numbpps-1;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2011-12-29 21:21:11 +00:00
|
|
|
Cvar_SetValueQuick (&vid_bpp, (float)vid_menu_bpps[i]);
|
2011-12-22 21:55:48 +00:00
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_MenuKey
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_MenuKey (int key)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
|
|
|
switch (key)
|
|
|
|
{
|
|
|
|
case K_ESCAPE:
|
|
|
|
VID_SyncCvars (); //sync cvars before leaving menu. FIXME: there are other ways to leave menu
|
|
|
|
S_LocalSound ("misc/menu1.wav");
|
|
|
|
M_Menu_Options_f ();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case K_UPARROW:
|
|
|
|
S_LocalSound ("misc/menu1.wav");
|
|
|
|
video_options_cursor--;
|
|
|
|
if (video_options_cursor < 0)
|
|
|
|
video_options_cursor = VIDEO_OPTIONS_ITEMS-1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case K_DOWNARROW:
|
|
|
|
S_LocalSound ("misc/menu1.wav");
|
|
|
|
video_options_cursor++;
|
|
|
|
if (video_options_cursor >= VIDEO_OPTIONS_ITEMS)
|
|
|
|
video_options_cursor = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case K_LEFTARROW:
|
|
|
|
S_LocalSound ("misc/menu3.wav");
|
|
|
|
switch (video_options_cursor)
|
|
|
|
{
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_MODE:
|
2010-08-14 03:42:52 +00:00
|
|
|
VID_Menu_ChooseNextMode (1);
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_BPP:
|
2010-08-14 03:42:52 +00:00
|
|
|
VID_Menu_ChooseNextBpp (1);
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_FULLSCREEN:
|
2010-02-15 23:26:55 +00:00
|
|
|
Cbuf_AddText ("toggle vid_fullscreen\n");
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_VSYNC:
|
2010-02-17 23:32:04 +00:00
|
|
|
Cbuf_AddText ("toggle vid_vsync\n"); // kristian
|
|
|
|
break;
|
2010-02-15 23:26:55 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case K_RIGHTARROW:
|
|
|
|
S_LocalSound ("misc/menu3.wav");
|
|
|
|
switch (video_options_cursor)
|
|
|
|
{
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_MODE:
|
2010-08-14 03:42:52 +00:00
|
|
|
VID_Menu_ChooseNextMode (-1);
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_BPP:
|
2010-08-14 03:42:52 +00:00
|
|
|
VID_Menu_ChooseNextBpp (-1);
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_FULLSCREEN:
|
2010-02-15 23:26:55 +00:00
|
|
|
Cbuf_AddText ("toggle vid_fullscreen\n");
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_VSYNC:
|
2010-02-17 23:32:04 +00:00
|
|
|
Cbuf_AddText ("toggle vid_vsync\n");
|
|
|
|
break;
|
2010-02-15 23:26:55 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case K_ENTER:
|
2014-09-22 06:21:06 +00:00
|
|
|
case K_KP_ENTER:
|
2010-02-15 23:26:55 +00:00
|
|
|
m_entersound = true;
|
|
|
|
switch (video_options_cursor)
|
|
|
|
{
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_MODE:
|
2010-02-15 23:26:55 +00:00
|
|
|
VID_Menu_ChooseNextMode (1);
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_BPP:
|
2010-02-15 23:26:55 +00:00
|
|
|
VID_Menu_ChooseNextBpp (1);
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_FULLSCREEN:
|
2010-02-15 23:26:55 +00:00
|
|
|
Cbuf_AddText ("toggle vid_fullscreen\n");
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_VSYNC:
|
2010-02-17 23:37:24 +00:00
|
|
|
Cbuf_AddText ("toggle vid_vsync\n");
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_TEST:
|
2010-02-15 23:26:55 +00:00
|
|
|
Cbuf_AddText ("vid_test\n");
|
|
|
|
break;
|
2013-03-03 13:43:11 +00:00
|
|
|
case VID_OPT_APPLY:
|
2012-10-05 18:58:59 +00:00
|
|
|
Cbuf_AddText ("vid_restart\n");
|
2012-10-06 18:09:23 +00:00
|
|
|
key_dest = key_game;
|
|
|
|
m_state = m_none;
|
|
|
|
IN_Activate();
|
2010-02-15 23:26:55 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_MenuDraw
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_MenuDraw (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-03-03 13:43:11 +00:00
|
|
|
int i, y;
|
2010-02-15 23:26:55 +00:00
|
|
|
qpic_t *p;
|
2010-08-29 02:22:55 +00:00
|
|
|
const char *title;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
y = 4;
|
|
|
|
|
|
|
|
// plaque
|
|
|
|
p = Draw_CachePic ("gfx/qplaque.lmp");
|
|
|
|
M_DrawTransPic (16, y, p);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
//p = Draw_CachePic ("gfx/vidmodes.lmp");
|
|
|
|
p = Draw_CachePic ("gfx/p_option.lmp");
|
2013-03-03 13:43:11 +00:00
|
|
|
M_DrawPic ( (320-p->width)/2, y, p);
|
|
|
|
|
|
|
|
y += 28;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
|
|
|
// title
|
|
|
|
title = "Video Options";
|
2013-03-03 13:43:11 +00:00
|
|
|
M_PrintWhite ((320-8*strlen(title))/2, y, title);
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
y += 16;
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
// options
|
|
|
|
for (i = 0; i < VIDEO_OPTIONS_ITEMS; i++)
|
|
|
|
{
|
|
|
|
switch (i)
|
|
|
|
{
|
|
|
|
case VID_OPT_MODE:
|
|
|
|
M_Print (16, y, " Video mode");
|
|
|
|
M_Print (184, y, va("%ix%i", (int)vid_width.value, (int)vid_height.value));
|
|
|
|
break;
|
|
|
|
case VID_OPT_BPP:
|
|
|
|
M_Print (16, y, " Color depth");
|
|
|
|
M_Print (184, y, va("%i", (int)vid_bpp.value));
|
|
|
|
break;
|
|
|
|
case VID_OPT_FULLSCREEN:
|
|
|
|
M_Print (16, y, " Fullscreen");
|
|
|
|
M_DrawCheckbox (184, y, (int)vid_fullscreen.value);
|
|
|
|
break;
|
|
|
|
case VID_OPT_VSYNC:
|
|
|
|
M_Print (16, y, " Vertical sync");
|
|
|
|
if (gl_swap_control)
|
|
|
|
M_DrawCheckbox (184, y, (int)vid_vsync.value);
|
|
|
|
else
|
|
|
|
M_Print (184, y, "N/A");
|
|
|
|
break;
|
|
|
|
case VID_OPT_TEST:
|
|
|
|
y += 8; //separate the test and apply items
|
|
|
|
M_Print (16, y, " Test changes");
|
|
|
|
break;
|
|
|
|
case VID_OPT_APPLY:
|
|
|
|
M_Print (16, y, " Apply changes");
|
|
|
|
break;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
if (video_options_cursor == i)
|
|
|
|
M_DrawCharacter (168, y, 12+((int)(realtime*4)&1));
|
2010-02-15 23:26:55 +00:00
|
|
|
|
2013-03-03 13:43:11 +00:00
|
|
|
y += 8;
|
|
|
|
}
|
2010-02-15 23:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
VID_Menu_f
|
|
|
|
================
|
|
|
|
*/
|
2011-12-30 14:00:28 +00:00
|
|
|
static void VID_Menu_f (void)
|
2010-02-15 23:26:55 +00:00
|
|
|
{
|
2013-02-13 19:07:19 +00:00
|
|
|
IN_Deactivate(modestate == MS_WINDOWED);
|
2010-02-15 23:26:55 +00:00
|
|
|
key_dest = key_menu;
|
|
|
|
m_state = m_video;
|
|
|
|
m_entersound = true;
|
|
|
|
|
|
|
|
//set all the cvars to match the current mode when entering the menu
|
|
|
|
VID_SyncCvars ();
|
|
|
|
|
|
|
|
//set up bpp and rate lists based on current cvars
|
|
|
|
VID_Menu_RebuildBppList ();
|
|
|
|
}
|
2011-12-18 16:27:14 +00:00
|
|
|
|