cvar_t vid_width = {CVAR_SAVE, "vid_width", "640", "resolution"};
cvar_t vid_height = {CVAR_SAVE, "vid_height", "480", "resolution"};
cvar_t vid_bitsperpixel = {CVAR_SAVE, "vid_bitsperpixel", "32", "how many bits per pixel to render at (32 or 16, 32 is recommended)"};
+cvar_t vid_samples = {CVAR_SAVE, "vid_samples", "1", "how many anti-aliasing samples per pixel to request from the graphics driver (4 is recommended, 1 is faster)"};
cvar_t vid_refreshrate = {CVAR_SAVE, "vid_refreshrate", "60", "refresh rate to use, in hz (higher values flicker less, if supported by your monitor)"};
+cvar_t vid_userefreshrate = {CVAR_SAVE, "vid_userefreshrate", "0", "set this to 1 to make vid_refreshrate used, or to 0 to let the engine choose a sane default"};
cvar_t vid_stereobuffer = {CVAR_SAVE, "vid_stereobuffer", "0", "enables 'quad-buffered' stereo rendering for stereo shutterglasses, HMD (head mounted display) devices, or polarized stereo LCDs, if supported by your drivers"};
cvar_t vid_vsync = {CVAR_SAVE, "vid_vsync", "0", "sync to vertical blank, prevents 'tearing' (seeing part of one frame and part of another on the screen at the same time), automatically disabled when doing timedemo benchmarks"};
cvar_t v_color_white_g = {CVAR_SAVE, "v_color_white_g", "1", "desired color of white"};
cvar_t v_color_white_b = {CVAR_SAVE, "v_color_white_b", "1", "desired color of white"};
cvar_t v_hwgamma = {CVAR_SAVE, "v_hwgamma", "1", "enables use of hardware gamma correction ramps if available (note: does not work very well on Windows2000 and above), values are 0 = off, 1 = attempt to use hardware gamma, 2 = use hardware gamma whether it works or not"};
+cvar_t v_glslgamma = {CVAR_SAVE, "v_glslgamma", "0", "enables use of GLSL to apply gamma correction ramps if available (note: overrides v_hwgamma)"};
cvar_t v_psycho = {0, "v_psycho", "0", "easter egg (does not work on Windows2000 or above)"};
// brand of graphics chip
int failed = false;
const dllfunction_t *func;
- Con_Printf("checking for %s... ", name);
+ Con_DPrintf("checking for %s... ", name);
for (func = funcs;func && func->name;func++)
*func->funcvariable = NULL;
if (disableparm && (COM_CheckParm(disableparm) || COM_CheckParm("-safe")))
{
- Con_Print("disabled by commandline\n");
+ Con_DPrint("disabled by commandline\n");
return false;
}
if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name)))
{
if (!silent)
- Con_Printf("OpenGL extension \"%s\" is missing function \"%s\" - broken driver!\n", name, func->name);
+ Con_DPrintf("OpenGL extension \"%s\" is missing function \"%s\" - broken driver!\n", name, func->name);
failed = true;
}
}
// delay the return so it prints all missing functions
if (failed)
return false;
- Con_Print("enabled\n");
+ Con_DPrint("enabled\n");
return true;
}
else
{
- Con_Print("not detected\n");
+ Con_DPrint("not detected\n");
return false;
}
}
if (!GL_CheckExtension("OpenGL 1.1.0", opengl110funcs, NULL, false))
Sys_Error("OpenGL 1.1.0 functions not found");
- Con_Printf("GL_VENDOR: %s\n", gl_vendor);
- Con_Printf("GL_RENDERER: %s\n", gl_renderer);
- Con_Printf("GL_VERSION: %s\n", gl_version);
- Con_Printf("GL_EXTENSIONS: %s\n", gl_extensions);
- Con_Printf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions);
-
CHECKGLERROR
qglGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max_texture_size);
- Con_Print("Checking OpenGL extensions...\n");
+ Con_DPrint("Checking OpenGL extensions...\n");
// COMMANDLINEOPTION: GL: -nodrawrangeelements disables GL_EXT_draw_range_elements (renders faster)
if (!GL_CheckExtension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true))
if (cls.state == ca_dedicated)
return;
- wantgamma = (vid_activewindow ? v_hwgamma.integer : 0);
+ wantgamma = v_hwgamma.integer;
+ if(r_glsl.integer && v_glslgamma.integer)
+ wantgamma = 0;
+ if(!vid_activewindow)
+ wantgamma = 0;
#define BOUNDCVAR(cvar, m1, m2) c = &(cvar);f = bound(m1, c->value, m2);if (c->value != f) Cvar_SetValueQuick(c, f);
BOUNDCVAR(v_gamma, 0.1, 5);
BOUNDCVAR(v_contrast, 1, 5);
// set vid_gammatables_trivial to true if the current settings would generate the identity gamma table
vid_gammatables_trivial = false;
- if(v_color_enable.integer)
- {
- if(v_contrastboost.value == 1)
- if(v_color_black_r.value == 0)
- if(v_color_black_g.value == 0)
- if(v_color_black_b.value == 0)
- if(fabs(v_color_grey_r.value - 0.5) < 1e-6)
- if(fabs(v_color_grey_g.value - 0.5) < 1e-6)
- if(fabs(v_color_grey_b.value - 0.5) < 1e-6)
- if(v_color_white_r.value == 1)
- if(v_color_white_g.value == 1)
- if(v_color_white_b.value == 1)
- vid_gammatables_trivial = true;
- }
- else
+ if(v_psycho.integer == 0)
+ if(v_contrastboost.value == 1)
{
- if(v_contrastboost.value == 1)
- if(v_gamma.value == 1)
- if(v_contrast.value == 1)
- if(v_brightness.value == 0)
- vid_gammatables_trivial = true;
+ if(v_color_enable.integer)
+ {
+ if(v_color_black_r.value == 0)
+ if(v_color_black_g.value == 0)
+ if(v_color_black_b.value == 0)
+ if(fabs(v_color_grey_r.value - 0.5) < 1e-6)
+ if(fabs(v_color_grey_g.value - 0.5) < 1e-6)
+ if(fabs(v_color_grey_b.value - 0.5) < 1e-6)
+ if(v_color_white_r.value == 1)
+ if(v_color_white_g.value == 1)
+ if(v_color_white_b.value == 1)
+ vid_gammatables_trivial = true;
+ }
+ else
+ {
+ if(v_gamma.value == 1)
+ if(v_contrast.value == 1)
+ if(v_brightness.value == 0)
+ vid_gammatables_trivial = true;
+ }
}
#define GAMMACHECK(cache, value) if (cache != (value)) gamma_changed = true;cache = (value)
Cvar_RegisterVariable(&v_color_white_b);
Cvar_RegisterVariable(&v_hwgamma);
+ Cvar_RegisterVariable(&v_glslgamma);
Cvar_RegisterVariable(&v_psycho);
Cvar_RegisterVariable(&vid_width);
Cvar_RegisterVariable(&vid_height);
Cvar_RegisterVariable(&vid_bitsperpixel);
+ Cvar_RegisterVariable(&vid_samples);
Cvar_RegisterVariable(&vid_refreshrate);
+ Cvar_RegisterVariable(&vid_userefreshrate);
Cvar_RegisterVariable(&vid_stereobuffer);
Cvar_RegisterVariable(&vid_vsync);
Cvar_RegisterVariable(&vid_mouse);
Cvar_Set("gl_combine", "0");
}
-int VID_Mode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer)
+int VID_Mode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer, int samples)
{
cl_ignoremousemoves = 2;
- Con_Printf("Video: %s %dx%dx%dx%dhz%s\n", fullscreen ? "fullscreen" : "window", width, height, bpp, refreshrate, stereobuffer ? " stereo" : "");
- if (VID_InitMode(fullscreen, width, height, bpp, refreshrate, stereobuffer))
+ Con_Printf("Initialized Video Mode: %s %dx%dx%dx%dhz%s%s\n", fullscreen ? "fullscreen" : "window", width, height, bpp, refreshrate, stereobuffer ? " stereo" : "", samples > 1 ? va("(%ix AA)", samples) : "");
+ if (VID_InitMode(fullscreen, width, height, bpp, vid_userefreshrate.integer ? max(1, refreshrate) : 0, stereobuffer, samples))
{
vid.fullscreen = fullscreen;
vid.width = width;
vid.height = height;
vid.bitsperpixel = bpp;
+ vid.samples = samples;
vid.refreshrate = refreshrate;
vid.stereobuffer = stereobuffer;
+ vid.userefreshrate = vid_userefreshrate.integer;
Cvar_SetValueQuick(&vid_fullscreen, fullscreen);
Cvar_SetValueQuick(&vid_width, width);
Cvar_SetValueQuick(&vid_height, height);
Cvar_SetValueQuick(&vid_bitsperpixel, bpp);
- Cvar_SetValueQuick(&vid_refreshrate, refreshrate);
+ Cvar_SetValueQuick(&vid_samples, samples);
+ if(vid_userefreshrate.integer)
+ Cvar_SetValueQuick(&vid_refreshrate, refreshrate);
Cvar_SetValueQuick(&vid_stereobuffer, stereobuffer);
return true;
}
if (vid_commandlinecheck)
return;
- Con_Printf("VID_Restart: changing from %s %dx%dx%dbpp, to %s %dx%dx%dbpp.\n",
- vid.fullscreen ? "fullscreen" : "window", vid.width, vid.height, vid.bitsperpixel,
- vid_fullscreen.integer ? "fullscreen" : "window", vid_width.integer, vid_height.integer, vid_bitsperpixel.integer);
+ Con_Printf("VID_Restart: changing from %s %dx%dx%dbpp%s%s, to %s %dx%dx%dbpp%s%s.\n",
+ vid.fullscreen ? "fullscreen" : "window", vid.width, vid.height, vid.bitsperpixel, vid.fullscreen && vid_userefreshrate.integer ? va("x%ihz", vid.refreshrate) : "", vid.samples > 1 ? va(" (%ix AA)", vid.samples) : "",
+ vid_fullscreen.integer ? "fullscreen" : "window", vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_fullscreen.integer && vid_userefreshrate.integer ? va("x%ihz", vid_refreshrate.integer) : "", vid_samples.integer > 1 ? va(" (%ix AA)", vid_samples.integer) : "");
VID_CloseSystems();
VID_Shutdown();
- if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, vid_stereobuffer.integer))
+ if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, vid_stereobuffer.integer, vid_samples.integer))
{
Con_Print("Video mode change failed\n");
- if (!VID_Mode(vid.fullscreen, vid.width, vid.height, vid.bitsperpixel, vid.refreshrate, vid.stereobuffer))
+ if (!VID_Mode(vid.fullscreen, vid.width, vid.height, vid.bitsperpixel, vid.refreshrate, vid.stereobuffer, vid.samples))
Sys_Error("Unable to restore to last working video mode");
}
VID_OpenSystems();
}
+const char *vidfallbacks[][2] =
+{
+ {"vid_stereobuffer", "0"},
+ {"vid_samples", "1"},
+ {"vid_userefreshrate", "0"},
+ {"vid_width", "640"},
+ {"vid_height", "480"},
+ {"vid_bitsperpixel", "16"},
+ {NULL, NULL}
+};
+
// this is only called once by Host_StartVideo
void VID_Start(void)
{
Cvar_SetQuick(&vid_bitsperpixel, com_argv[i+1]);
}
- Con_Print("Starting video system\n");
- success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, vid_stereobuffer.integer);
+ success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, vid_stereobuffer.integer, vid_samples.integer);
if (!success)
{
Con_Print("Desired video mode fail, trying fallbacks...\n");
- success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, 60, vid_stereobuffer.integer);
- if (!success && vid_stereobuffer.integer)
- success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, false);
- if (!success && vid_bitsperpixel.integer > 16)
- success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, 16, 60, false);
- if (!success && (vid_width.integer > 640 || vid_height.integer > 480))
- success = VID_Mode(vid_fullscreen.integer, 640, 480, 16, 60, false);
- if (!success && vid_fullscreen.integer)
- success = VID_Mode(false, 640, 480, 16, 60, false);
+ for (i = 0;!success && vidfallbacks[i][0] != NULL;i++)
+ {
+ Cvar_Set(vidfallbacks[i][0], vidfallbacks[i][1]);
+ success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.integer, vid_stereobuffer.integer, vid_samples.integer);
+ }
if (!success)
Sys_Error("Video modes failed");
}