gl_vidsdl.c: restore vid_refreshrate from fitz 0.85; SDL2 supports it

git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1461 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
Eric Wasylishen 2017-08-03 06:43:38 +00:00
parent 3b5f3794cb
commit a2fb8317cb

View file

@ -43,6 +43,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define MAX_MODE_LIST 600 //johnfitz -- was 30 #define MAX_MODE_LIST 600 //johnfitz -- was 30
#define MAX_BPPS_LIST 5 #define MAX_BPPS_LIST 5
#define MAX_RATES_LIST 20
#define WARP_WIDTH 320 #define WARP_WIDTH 320
#define WARP_HEIGHT 200 #define WARP_HEIGHT 200
#define MAXWIDTH 10000 #define MAXWIDTH 10000
@ -50,9 +51,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define DEFAULT_SDL_FLAGS SDL_OPENGL #define DEFAULT_SDL_FLAGS SDL_OPENGL
#define DEFAULT_REFRESHRATE 60
typedef struct { typedef struct {
int width; int width;
int height; int height;
int refreshrate;
int bpp; int bpp;
} vmode_t; } vmode_t;
@ -146,6 +150,7 @@ static cvar_t vid_fullscreen = {"vid_fullscreen", "0", CVAR_ARCHIVE}; // QuakeSp
static cvar_t vid_width = {"vid_width", "800", CVAR_ARCHIVE}; // QuakeSpasm, was 640 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_height = {"vid_height", "600", CVAR_ARCHIVE}; // QuakeSpasm, was 480
static cvar_t vid_bpp = {"vid_bpp", "16", CVAR_ARCHIVE}; static cvar_t vid_bpp = {"vid_bpp", "16", CVAR_ARCHIVE};
static cvar_t vid_refreshrate = {"vid_refreshrate", "60", CVAR_ARCHIVE};
static cvar_t vid_vsync = {"vid_vsync", "0", CVAR_ARCHIVE}; static cvar_t vid_vsync = {"vid_vsync", "0", CVAR_ARCHIVE};
static cvar_t vid_fsaa = {"vid_fsaa", "0", CVAR_ARCHIVE}; // QuakeSpasm static cvar_t vid_fsaa = {"vid_fsaa", "0", CVAR_ARCHIVE}; // QuakeSpasm
static cvar_t vid_desktopfullscreen = {"vid_desktopfullscreen", "0", CVAR_ARCHIVE}; // QuakeSpasm static cvar_t vid_desktopfullscreen = {"vid_desktopfullscreen", "0", CVAR_ARCHIVE}; // QuakeSpasm
@ -350,6 +355,30 @@ static int VID_GetCurrentHeight (void)
#endif #endif
} }
/*
====================
VID_GetCurrentRefreshRate
====================
*/
static int VID_GetCurrentRefreshRate (void)
{
#if defined(USE_SDL2)
SDL_DisplayMode mode;
int current_display;
current_display = SDL_GetWindowDisplayIndex(draw_context);
if (0 != SDL_GetCurrentDisplayMode(current_display, &mode))
return DEFAULT_REFRESHRATE;
return mode.refresh_rate;
#else
// SDL1.2 doesn't support refresh rates
return DEFAULT_REFRESHRATE;
#endif
}
/* /*
==================== ====================
VID_GetCurrentBPP VID_GetCurrentBPP
@ -472,7 +501,7 @@ 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. 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 *VID_SDL2_GetDisplayMode(int width, int height, int refreshrate, int bpp)
{ {
static SDL_DisplayMode mode; static SDL_DisplayMode mode;
const int sdlmodes = SDL_GetNumDisplayModes(0); const int sdlmodes = SDL_GetNumDisplayModes(0);
@ -480,9 +509,12 @@ static SDL_DisplayMode *VID_SDL2_GetDisplayMode(int width, int height, int bpp)
for (i = 0; i < sdlmodes; i++) for (i = 0; i < sdlmodes; i++)
{ {
if (SDL_GetDisplayMode(0, i, &mode) == 0 if (SDL_GetDisplayMode(0, i, &mode) != 0)
&& mode.w == width && mode.h == height continue;
&& SDL_BITSPERPIXEL(mode.format) == bpp)
if (mode.w == width && mode.h == height
&& SDL_BITSPERPIXEL(mode.format) == bpp
&& mode.refresh_rate == refreshrate)
{ {
return &mode; return &mode;
} }
@ -496,7 +528,7 @@ static SDL_DisplayMode *VID_SDL2_GetDisplayMode(int width, int height, int bpp)
VID_ValidMode VID_ValidMode
================ ================
*/ */
static qboolean VID_ValidMode (int width, int height, int bpp, qboolean fullscreen) static qboolean VID_ValidMode (int width, int height, int refreshrate, int bpp, qboolean fullscreen)
{ {
// ignore width / height / bpp if vid_desktopfullscreen is enabled // ignore width / height / bpp if vid_desktopfullscreen is enabled
if (fullscreen && vid_desktopfullscreen.value) if (fullscreen && vid_desktopfullscreen.value)
@ -509,7 +541,7 @@ static qboolean VID_ValidMode (int width, int height, int bpp, qboolean fullscre
return false; return false;
#if defined(USE_SDL2) #if defined(USE_SDL2)
if (fullscreen && VID_SDL2_GetDisplayMode(width, height, bpp) == NULL) if (fullscreen && VID_SDL2_GetDisplayMode(width, height, refreshrate, bpp) == NULL)
bpp = 0; bpp = 0;
#else #else
{ {
@ -539,7 +571,7 @@ static qboolean VID_ValidMode (int width, int height, int bpp, qboolean fullscre
VID_SetMode VID_SetMode
================ ================
*/ */
static qboolean VID_SetMode (int width, int height, int bpp, qboolean fullscreen) static qboolean VID_SetMode (int width, int height, int refreshrate, int bpp, qboolean fullscreen)
{ {
int temp; int temp;
Uint32 flags; Uint32 flags;
@ -621,7 +653,7 @@ static qboolean VID_SetMode (int width, int height, int bpp, qboolean fullscreen
SDL_SetWindowPosition (draw_context, SDL_WINDOWPOS_CENTERED_DISPLAY(previous_display), SDL_WINDOWPOS_CENTERED_DISPLAY(previous_display)); SDL_SetWindowPosition (draw_context, SDL_WINDOWPOS_CENTERED_DISPLAY(previous_display), SDL_WINDOWPOS_CENTERED_DISPLAY(previous_display));
else else
SDL_SetWindowPosition(draw_context, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); SDL_SetWindowPosition(draw_context, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
SDL_SetWindowDisplayMode (draw_context, VID_SDL2_GetDisplayMode(width, height, bpp)); SDL_SetWindowDisplayMode (draw_context, VID_SDL2_GetDisplayMode(width, height, refreshrate, bpp));
SDL_SetWindowBordered (draw_context, vid_borderless.value ? SDL_FALSE : SDL_TRUE); SDL_SetWindowBordered (draw_context, vid_borderless.value ? SDL_FALSE : SDL_TRUE);
/* Make window fullscreen if needed, and show the window */ /* Make window fullscreen if needed, and show the window */
@ -708,10 +740,11 @@ static qboolean VID_SetMode (int width, int height, int bpp, qboolean fullscreen
// fix the leftover Alt from any Alt-Tab or the like that switched us away // fix the leftover Alt from any Alt-Tab or the like that switched us away
ClearAllStates (); ClearAllStates ();
Con_SafePrintf ("Video mode %dx%dx%d (%d-bit z-buffer, %dx FSAA) initialized\n", Con_SafePrintf ("Video mode %dx%dx%d %dHz (%d-bit z-buffer, %dx FSAA) initialized\n",
VID_GetCurrentWidth(), VID_GetCurrentWidth(),
VID_GetCurrentHeight(), VID_GetCurrentHeight(),
VID_GetCurrentBPP(), VID_GetCurrentBPP(),
VID_GetCurrentRefreshRate(),
depthbits, depthbits,
fsaa_obtained); fsaa_obtained);
@ -740,7 +773,7 @@ VID_Restart -- johnfitz -- change video modes on the fly
*/ */
static void VID_Restart (void) static void VID_Restart (void)
{ {
int width, height, bpp; int width, height, refreshrate, bpp;
qboolean fullscreen; qboolean fullscreen;
if (vid_locked || !vid_changed) if (vid_locked || !vid_changed)
@ -748,16 +781,17 @@ static void VID_Restart (void)
width = (int)vid_width.value; width = (int)vid_width.value;
height = (int)vid_height.value; height = (int)vid_height.value;
refreshrate = (int)vid_refreshrate.value;
bpp = (int)vid_bpp.value; bpp = (int)vid_bpp.value;
fullscreen = vid_fullscreen.value ? true : false; fullscreen = vid_fullscreen.value ? true : false;
// //
// validate new mode // validate new mode
// //
if (!VID_ValidMode (width, height, bpp, fullscreen)) if (!VID_ValidMode (width, height, refreshrate, bpp, fullscreen))
{ {
Con_Printf ("%dx%dx%d %s is not a valid mode\n", Con_Printf ("%dx%dx%d %dHz %s is not a valid mode\n",
width, height, bpp, fullscreen? "fullscreen" : "windowed"); width, height, bpp, refreshrate, fullscreen? "fullscreen" : "windowed");
return; return;
} }
@ -778,7 +812,7 @@ static void VID_Restart (void)
// //
// set new mode // set new mode
// //
VID_SetMode (width, height, bpp, fullscreen); VID_SetMode (width, height, refreshrate, bpp, fullscreen);
GL_Init (); GL_Init ();
TexMgr_ReloadImages (); TexMgr_ReloadImages ();
@ -818,7 +852,7 @@ VID_Test -- johnfitz -- like vid_restart, but asks for confirmation after switch
*/ */
static void VID_Test (void) static void VID_Test (void)
{ {
int old_width, old_height, old_bpp, old_fullscreen; int old_width, old_height, old_refreshrate, old_bpp, old_fullscreen;
if (vid_locked || !vid_changed) if (vid_locked || !vid_changed)
return; return;
@ -827,6 +861,7 @@ static void VID_Test (void)
// //
old_width = VID_GetCurrentWidth(); old_width = VID_GetCurrentWidth();
old_height = VID_GetCurrentHeight(); old_height = VID_GetCurrentHeight();
old_refreshrate = VID_GetCurrentRefreshRate();
old_bpp = VID_GetCurrentBPP(); old_bpp = VID_GetCurrentBPP();
old_fullscreen = VID_GetFullscreen() ? true : false; old_fullscreen = VID_GetFullscreen() ? true : false;
@ -838,6 +873,7 @@ static void VID_Test (void)
//revert cvars and mode //revert cvars and mode
Cvar_SetValueQuick (&vid_width, old_width); Cvar_SetValueQuick (&vid_width, old_width);
Cvar_SetValueQuick (&vid_height, old_height); Cvar_SetValueQuick (&vid_height, old_height);
Cvar_SetValueQuick (&vid_refreshrate, old_refreshrate);
Cvar_SetValueQuick (&vid_bpp, old_bpp); Cvar_SetValueQuick (&vid_bpp, old_bpp);
Cvar_SetQuick (&vid_fullscreen, old_fullscreen ? "1" : "0"); Cvar_SetQuick (&vid_fullscreen, old_fullscreen ? "1" : "0");
VID_Restart (); VID_Restart ();
@ -1389,10 +1425,11 @@ VID_DescribeCurrentMode_f
static void VID_DescribeCurrentMode_f (void) static void VID_DescribeCurrentMode_f (void)
{ {
if (draw_context) if (draw_context)
Con_Printf("%dx%dx%d %s\n", Con_Printf("%dx%dx%d %dHz %s\n",
VID_GetCurrentWidth(), VID_GetCurrentWidth(),
VID_GetCurrentHeight(), VID_GetCurrentHeight(),
VID_GetCurrentBPP(), VID_GetCurrentBPP(),
VID_GetCurrentRefreshRate(),
VID_GetFullscreen() ? "fullscreen" : "windowed"); VID_GetFullscreen() ? "fullscreen" : "windowed");
} }
@ -1414,7 +1451,7 @@ static void VID_DescribeModes_f (void)
{ {
if (count > 0) if (count > 0)
Con_SafePrintf ("\n"); Con_SafePrintf ("\n");
Con_SafePrintf (" %4i x %4i x %i", modelist[i].width, modelist[i].height, modelist[i].bpp); Con_SafePrintf (" %4i x %4i x %i : %i", modelist[i].width, modelist[i].height, modelist[i].bpp, modelist[i].refreshrate);
lastwidth = modelist[i].width; lastwidth = modelist[i].width;
lastheight = modelist[i].height; lastheight = modelist[i].height;
lastbpp = modelist[i].bpp; lastbpp = modelist[i].bpp;
@ -1465,6 +1502,7 @@ static void VID_InitModelist (void)
modelist[nummodes].width = mode.w; modelist[nummodes].width = mode.w;
modelist[nummodes].height = mode.h; modelist[nummodes].height = mode.h;
modelist[nummodes].bpp = SDL_BITSPERPIXEL(mode.format); modelist[nummodes].bpp = SDL_BITSPERPIXEL(mode.format);
modelist[nummodes].refreshrate = mode.refresh_rate;
nummodes++; nummodes++;
} }
} }
@ -1499,6 +1537,7 @@ static void VID_InitModelist (void)
modelist[nummodes].width = modes[j]->w; modelist[nummodes].width = modes[j]->w;
modelist[nummodes].height = modes[j]->h; modelist[nummodes].height = modes[j]->h;
modelist[nummodes].bpp = bpps[i]; modelist[nummodes].bpp = bpps[i];
modelist[nummodes].refreshrate = DEFAULT_REFRESHRATE;
for (k=originalnummodes, existingmode = 0 ; k < nummodes ; k++) for (k=originalnummodes, existingmode = 0 ; k < nummodes ; k++)
{ {
@ -1531,11 +1570,13 @@ VID_Init
void VID_Init (void) void VID_Init (void)
{ {
static char vid_center[] = "SDL_VIDEO_CENTERED=center"; static char vid_center[] = "SDL_VIDEO_CENTERED=center";
int p, width, height, bpp, display_width, display_height, display_bpp; int p, width, height, refreshrate, bpp;
int display_width, display_height, display_refreshrate, display_bpp;
qboolean fullscreen; qboolean fullscreen;
const char *read_vars[] = { "vid_fullscreen", const char *read_vars[] = { "vid_fullscreen",
"vid_width", "vid_width",
"vid_height", "vid_height",
"vid_refreshrate",
"vid_bpp", "vid_bpp",
"vid_vsync", "vid_vsync",
"vid_fsaa", "vid_fsaa",
@ -1546,6 +1587,7 @@ void VID_Init (void)
Cvar_RegisterVariable (&vid_fullscreen); //johnfitz Cvar_RegisterVariable (&vid_fullscreen); //johnfitz
Cvar_RegisterVariable (&vid_width); //johnfitz Cvar_RegisterVariable (&vid_width); //johnfitz
Cvar_RegisterVariable (&vid_height); //johnfitz Cvar_RegisterVariable (&vid_height); //johnfitz
Cvar_RegisterVariable (&vid_refreshrate); //johnfitz
Cvar_RegisterVariable (&vid_bpp); //johnfitz Cvar_RegisterVariable (&vid_bpp); //johnfitz
Cvar_RegisterVariable (&vid_vsync); //johnfitz Cvar_RegisterVariable (&vid_vsync); //johnfitz
Cvar_RegisterVariable (&vid_fsaa); //QuakeSpasm Cvar_RegisterVariable (&vid_fsaa); //QuakeSpasm
@ -1554,6 +1596,7 @@ void VID_Init (void)
Cvar_SetCallback (&vid_fullscreen, VID_Changed_f); Cvar_SetCallback (&vid_fullscreen, VID_Changed_f);
Cvar_SetCallback (&vid_width, VID_Changed_f); Cvar_SetCallback (&vid_width, VID_Changed_f);
Cvar_SetCallback (&vid_height, VID_Changed_f); Cvar_SetCallback (&vid_height, VID_Changed_f);
Cvar_SetCallback (&vid_refreshrate, VID_Changed_f);
Cvar_SetCallback (&vid_bpp, VID_Changed_f); Cvar_SetCallback (&vid_bpp, VID_Changed_f);
Cvar_SetCallback (&vid_vsync, VID_Changed_f); Cvar_SetCallback (&vid_vsync, VID_Changed_f);
Cvar_SetCallback (&vid_fsaa, VID_FSAA_f); Cvar_SetCallback (&vid_fsaa, VID_FSAA_f);
@ -1579,6 +1622,7 @@ void VID_Init (void)
display_width = mode.w; display_width = mode.w;
display_height = mode.h; display_height = mode.h;
display_refreshrate = mode.refresh_rate;
display_bpp = SDL_BITSPERPIXEL(mode.format); display_bpp = SDL_BITSPERPIXEL(mode.format);
} }
#else #else
@ -1586,6 +1630,7 @@ void VID_Init (void)
const SDL_VideoInfo *info = SDL_GetVideoInfo(); const SDL_VideoInfo *info = SDL_GetVideoInfo();
display_width = info->current_w; display_width = info->current_w;
display_height = info->current_h; display_height = info->current_h;
display_refreshrate = DEFAULT_REFRESHRATE;
display_bpp = info->vfmt->BitsPerPixel; display_bpp = info->vfmt->BitsPerPixel;
} }
#endif #endif
@ -1603,6 +1648,7 @@ void VID_Init (void)
width = (int)vid_width.value; width = (int)vid_width.value;
height = (int)vid_height.value; height = (int)vid_height.value;
refreshrate = (int)vid_refreshrate.value;
bpp = (int)vid_bpp.value; bpp = (int)vid_bpp.value;
fullscreen = (int)vid_fullscreen.value; fullscreen = (int)vid_fullscreen.value;
fsaa = (int)vid_fsaa.value; fsaa = (int)vid_fsaa.value;
@ -1611,6 +1657,7 @@ void VID_Init (void)
{ {
width = display_width; width = display_width;
height = display_height; height = display_height;
refreshrate = display_refreshrate;
bpp = display_bpp; bpp = display_bpp;
fullscreen = true; fullscreen = true;
} }
@ -1634,6 +1681,10 @@ void VID_Init (void)
width = height * 4 / 3; width = height * 4 / 3;
} }
p = COM_CheckParm("-refreshrate");
if (p && p < com_argc-1)
refreshrate = Q_atoi(com_argv[p+1]);
p = COM_CheckParm("-bpp"); p = COM_CheckParm("-bpp");
if (p && p < com_argc-1) if (p && p < com_argc-1)
bpp = Q_atoi(com_argv[p+1]); bpp = Q_atoi(com_argv[p+1]);
@ -1648,18 +1699,20 @@ void VID_Init (void)
if (p && p < com_argc-1) if (p && p < com_argc-1)
fsaa = atoi(com_argv[p+1]); fsaa = atoi(com_argv[p+1]);
if (!VID_ValidMode(width, height, bpp, fullscreen)) if (!VID_ValidMode(width, height, refreshrate, bpp, fullscreen))
{ {
width = (int)vid_width.value; width = (int)vid_width.value;
height = (int)vid_height.value; height = (int)vid_height.value;
refreshrate = (int)vid_refreshrate.value;
bpp = (int)vid_bpp.value; bpp = (int)vid_bpp.value;
fullscreen = (int)vid_fullscreen.value; fullscreen = (int)vid_fullscreen.value;
} }
if (!VID_ValidMode(width, height, bpp, fullscreen)) if (!VID_ValidMode(width, height, refreshrate, bpp, fullscreen))
{ {
width = 640; width = 640;
height = 480; height = 480;
refreshrate = display_refreshrate;
bpp = display_bpp; bpp = display_bpp;
fullscreen = false; fullscreen = false;
} }
@ -1674,7 +1727,7 @@ void VID_Init (void)
// set window icon // set window icon
PL_SetWindowIcon(); PL_SetWindowIcon();
VID_SetMode (width, height, bpp, fullscreen); VID_SetMode (width, height, refreshrate, bpp, fullscreen);
GL_Init (); GL_Init ();
GL_SetupState (); GL_SetupState ();
@ -1775,6 +1828,7 @@ void VID_SyncCvars (void)
Cvar_SetValueQuick (&vid_width, VID_GetCurrentWidth()); Cvar_SetValueQuick (&vid_width, VID_GetCurrentWidth());
Cvar_SetValueQuick (&vid_height, VID_GetCurrentHeight()); Cvar_SetValueQuick (&vid_height, VID_GetCurrentHeight());
} }
Cvar_SetValueQuick (&vid_refreshrate, VID_GetCurrentRefreshRate());
Cvar_SetValueQuick (&vid_bpp, VID_GetCurrentBPP()); Cvar_SetValueQuick (&vid_bpp, VID_GetCurrentBPP());
Cvar_SetQuick (&vid_fullscreen, VID_GetFullscreen() ? "1" : "0"); Cvar_SetQuick (&vid_fullscreen, VID_GetFullscreen() ? "1" : "0");
// don't sync vid_desktopfullscreen, it's a user preference that // don't sync vid_desktopfullscreen, it's a user preference that
@ -1794,6 +1848,7 @@ void VID_SyncCvars (void)
enum { enum {
VID_OPT_MODE, VID_OPT_MODE,
VID_OPT_BPP, VID_OPT_BPP,
VID_OPT_REFRESHRATE,
VID_OPT_FULLSCREEN, VID_OPT_FULLSCREEN,
VID_OPT_VSYNC, VID_OPT_VSYNC,
VID_OPT_TEST, VID_OPT_TEST,
@ -1814,6 +1869,9 @@ static int vid_menu_nummodes = 0;
static int vid_menu_bpps[MAX_BPPS_LIST]; static int vid_menu_bpps[MAX_BPPS_LIST];
static int vid_menu_numbpps = 0; static int vid_menu_numbpps = 0;
static int vid_menu_rates[MAX_RATES_LIST];
static int vid_menu_numrates=0;
/* /*
================ ================
VID_Menu_Init VID_Menu_Init
@ -1898,6 +1956,58 @@ static void VID_Menu_RebuildBppList (void)
Cvar_SetValueQuick (&vid_bpp, (float)vid_menu_bpps[0]); Cvar_SetValueQuick (&vid_bpp, (float)vid_menu_bpps[0]);
} }
/*
================
VID_Menu_RebuildRateList
regenerates rate list based on current vid_width, vid_height and vid_bpp
================
*/
static void VID_Menu_RebuildRateList (void)
{
int i,j,r;
vid_menu_numrates=0;
for (i=0;i<nummodes;i++)
{
//rate list is limited to rates available with current width/height/bpp
if (modelist[i].width != vid_width.value ||
modelist[i].height != vid_height.value ||
modelist[i].bpp != vid_bpp.value)
continue;
r = modelist[i].refreshrate;
for (j=0;j<vid_menu_numrates;j++)
{
if (vid_menu_rates[j] == r)
break;
}
if (j==vid_menu_numrates)
{
vid_menu_rates[j] = r;
vid_menu_numrates++;
}
}
//if there are no valid fullscreen refreshrates for this width/height, just pick one
if (vid_menu_numrates == 0)
{
Cvar_SetValue ("vid_refreshrate",(float)modelist[0].refreshrate);
return;
}
//if vid_refreshrate is not in the new list, change vid_refreshrate
for (i=0;i<vid_menu_numrates;i++)
if (vid_menu_rates[i] == (int)(vid_refreshrate.value))
break;
if (i==vid_menu_numrates)
Cvar_SetValue ("vid_refreshrate",(float)vid_menu_rates[0]);
}
/* /*
================ ================
VID_Menu_ChooseNextMode VID_Menu_ChooseNextMode
@ -1935,6 +2045,7 @@ static void VID_Menu_ChooseNextMode (int dir)
Cvar_SetValueQuick (&vid_width, (float)vid_menu_modes[i].width); Cvar_SetValueQuick (&vid_width, (float)vid_menu_modes[i].width);
Cvar_SetValueQuick (&vid_height, (float)vid_menu_modes[i].height); Cvar_SetValueQuick (&vid_height, (float)vid_menu_modes[i].height);
VID_Menu_RebuildBppList (); VID_Menu_RebuildBppList ();
VID_Menu_RebuildRateList ();
} }
} }
@ -1974,6 +2085,39 @@ static void VID_Menu_ChooseNextBpp (int dir)
} }
} }
/*
================
VID_Menu_ChooseNextRate
chooses next refresh rate in order, then updates vid_refreshrate cvar
================
*/
static void VID_Menu_ChooseNextRate (int dir)
{
int i;
for (i=0;i<vid_menu_numrates;i++)
{
if (vid_menu_rates[i] == vid_refreshrate.value)
break;
}
if (i==vid_menu_numrates) //can't find it in list
{
i = 0;
}
else
{
i+=dir;
if (i>=vid_menu_numrates)
i = 0;
else if (i<0)
i = vid_menu_numrates-1;
}
Cvar_SetValue ("vid_refreshrate",(float)vid_menu_rates[i]);
}
/* /*
================ ================
VID_MenuKey VID_MenuKey
@ -2014,6 +2158,9 @@ static void VID_MenuKey (int key)
case VID_OPT_BPP: case VID_OPT_BPP:
VID_Menu_ChooseNextBpp (1); VID_Menu_ChooseNextBpp (1);
break; break;
case VID_OPT_REFRESHRATE:
VID_Menu_ChooseNextRate (1);
break;
case VID_OPT_FULLSCREEN: case VID_OPT_FULLSCREEN:
Cbuf_AddText ("toggle vid_fullscreen\n"); Cbuf_AddText ("toggle vid_fullscreen\n");
break; break;
@ -2035,6 +2182,9 @@ static void VID_MenuKey (int key)
case VID_OPT_BPP: case VID_OPT_BPP:
VID_Menu_ChooseNextBpp (-1); VID_Menu_ChooseNextBpp (-1);
break; break;
case VID_OPT_REFRESHRATE:
VID_Menu_ChooseNextRate (-1);
break;
case VID_OPT_FULLSCREEN: case VID_OPT_FULLSCREEN:
Cbuf_AddText ("toggle vid_fullscreen\n"); Cbuf_AddText ("toggle vid_fullscreen\n");
break; break;
@ -2058,6 +2208,9 @@ static void VID_MenuKey (int key)
case VID_OPT_BPP: case VID_OPT_BPP:
VID_Menu_ChooseNextBpp (1); VID_Menu_ChooseNextBpp (1);
break; break;
case VID_OPT_REFRESHRATE:
VID_Menu_ChooseNextRate (1);
break;
case VID_OPT_FULLSCREEN: case VID_OPT_FULLSCREEN:
Cbuf_AddText ("toggle vid_fullscreen\n"); Cbuf_AddText ("toggle vid_fullscreen\n");
break; break;
@ -2125,6 +2278,10 @@ static void VID_MenuDraw (void)
M_Print (16, y, " Color depth"); M_Print (16, y, " Color depth");
M_Print (184, y, va("%i", (int)vid_bpp.value)); M_Print (184, y, va("%i", (int)vid_bpp.value));
break; break;
case VID_OPT_REFRESHRATE:
M_Print (16, y, " Refresh rate");
M_Print (184, y, va("%i", (int)vid_refreshrate.value));
break;
case VID_OPT_FULLSCREEN: case VID_OPT_FULLSCREEN:
M_Print (16, y, " Fullscreen"); M_Print (16, y, " Fullscreen");
M_DrawCheckbox (184, y, (int)vid_fullscreen.value); M_DrawCheckbox (184, y, (int)vid_fullscreen.value);
@ -2169,5 +2326,6 @@ static void VID_Menu_f (void)
//set up bpp and rate lists based on current cvars //set up bpp and rate lists based on current cvars
VID_Menu_RebuildBppList (); VID_Menu_RebuildBppList ();
VID_Menu_RebuildRateList ();
} }