mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-02-17 01:21:12 +00:00
Let the video menu skip over non existent renderer libs.
Unitl now the video menu showed all known renderer libs (gl1, gl3, vk and soft), regardless if the lib was available or not. Rework the renderer selection logic to skip over non existent renderer libs: Generate an array combining the menu string and cvar string of all available renderer libs, use this array instead of the hardcoded array. While at it simplify the code a little bit.
This commit is contained in:
parent
e66fd250c2
commit
ddce6691e2
1 changed files with 105 additions and 74 deletions
|
@ -61,45 +61,98 @@ static menulist_s s_msaa_list;
|
|||
static menuaction_s s_defaults_action;
|
||||
static menuaction_s s_apply_action;
|
||||
|
||||
static int
|
||||
GetRenderer(void)
|
||||
// --------
|
||||
|
||||
// gl1, gl3, vk, soft
|
||||
#define MAXRENDERERS 4
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* First element in array is 'OpenGL 1.4' aka gl1.
|
||||
Second element in array is 'OpenGL 3.2' aka gl3.
|
||||
Third element in array is unknown renderer. */
|
||||
if (Q_stricmp(vid_renderer->string, "gl1") == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (Q_stricmp(vid_renderer->string, "gl3") == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#ifdef USE_REFVK
|
||||
else if (Q_stricmp(vid_renderer->string, "vk") == 0)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
else if (Q_stricmp(vid_renderer->string, "soft") == 0)
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
const char *boxstr;
|
||||
const char *cvarstr;
|
||||
} renderer;
|
||||
|
||||
renderer rendererlist[MAXRENDERERS];
|
||||
int numrenderer;
|
||||
|
||||
static qboolean
|
||||
Renderer_CheckIfAvailable(const char *renderer)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
const char* lib_ext = "dylib";
|
||||
#elif defined(_WIN32)
|
||||
const char* lib_ext = "dll";
|
||||
#else
|
||||
else if (Q_stricmp(vid_renderer->string, "soft") == 0)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
const char* lib_ext = "so";
|
||||
#endif
|
||||
|
||||
char reflib_path[MAX_OSPATH] = {0};
|
||||
snprintf(reflib_path, sizeof(reflib_path), "%sref_%s.%s", Sys_GetBinaryDir(), renderer, lib_ext);
|
||||
|
||||
if (Sys_IsFile(reflib_path))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
Renderer_FillRenderdef(void)
|
||||
{
|
||||
numrenderer = -1;
|
||||
|
||||
if (Renderer_CheckIfAvailable("gl1"))
|
||||
{
|
||||
numrenderer++;
|
||||
rendererlist[numrenderer].boxstr = "[OpenGL 1.4]";
|
||||
rendererlist[numrenderer].cvarstr = "gl1";
|
||||
}
|
||||
|
||||
if (Renderer_CheckIfAvailable("gl3"))
|
||||
{
|
||||
numrenderer++;
|
||||
rendererlist[numrenderer].boxstr = "[OpenGL 3.2]";
|
||||
rendererlist[numrenderer].cvarstr = "gl3";
|
||||
}
|
||||
|
||||
if (Renderer_CheckIfAvailable("vk"))
|
||||
{
|
||||
numrenderer++;
|
||||
rendererlist[numrenderer].boxstr = "[Vulkan ]";
|
||||
rendererlist[numrenderer].cvarstr = "vk";
|
||||
}
|
||||
|
||||
if (Renderer_CheckIfAvailable("soft"))
|
||||
{
|
||||
numrenderer++;
|
||||
rendererlist[numrenderer].boxstr = "[Software ]";
|
||||
rendererlist[numrenderer].cvarstr = "soft";
|
||||
}
|
||||
|
||||
// The custom renderer. Must be known to the menu,
|
||||
// but nothing more. The display string is hard
|
||||
// coded below, the cvar is unknown.
|
||||
numrenderer++;
|
||||
}
|
||||
|
||||
static int
|
||||
Renderer_GetRenderer(void)
|
||||
{
|
||||
for (int i = 0; i < numrenderer; i++)
|
||||
{
|
||||
if (strcmp(vid_renderer->string, rendererlist[i].cvarstr) == 0)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
// Unknown renderer.
|
||||
return numrenderer;
|
||||
}
|
||||
|
||||
// --------
|
||||
|
||||
static int
|
||||
GetCustomValue(menulist_s *list)
|
||||
{
|
||||
|
@ -151,39 +204,16 @@ ApplyChanges(void *unused)
|
|||
qboolean restart = false;
|
||||
|
||||
/* Renderer */
|
||||
if (s_renderer_list.curvalue != GetRenderer())
|
||||
if (s_renderer_list.curvalue != Renderer_GetRenderer())
|
||||
{
|
||||
/* First element in array is 'OpenGL 1.4' aka gl1.
|
||||
Second element in array is 'OpenGL 3.2' aka gl3.
|
||||
Third element in array is unknown renderer. */
|
||||
if (s_renderer_list.curvalue == 0)
|
||||
// The custom renderer (the last known renderer) cannot be
|
||||
// set, because the menu doesn't know it's cvar value. TODO:
|
||||
// Hack something that it cannot be selected.
|
||||
if (s_renderer_list.curvalue != numrenderer)
|
||||
{
|
||||
Cvar_Set("vid_renderer", "gl1");
|
||||
Cvar_Set("vid_renderer", (char *)rendererlist[s_renderer_list.curvalue].cvarstr);
|
||||
restart = true;
|
||||
}
|
||||
else if (s_renderer_list.curvalue == 1)
|
||||
{
|
||||
Cvar_Set("vid_renderer", "gl3");
|
||||
restart = true;
|
||||
}
|
||||
#ifdef USE_REFVK
|
||||
else if (s_renderer_list.curvalue == 2)
|
||||
{
|
||||
Cvar_Set("vid_renderer", "vk");
|
||||
restart = true;
|
||||
}
|
||||
else if (s_renderer_list.curvalue == 3)
|
||||
{
|
||||
Cvar_Set("vid_renderer", "soft");
|
||||
restart = true;
|
||||
}
|
||||
#else
|
||||
else if (s_renderer_list.curvalue == 2)
|
||||
{
|
||||
Cvar_Set("vid_renderer", "soft");
|
||||
restart = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* auto mode */
|
||||
|
@ -296,16 +326,17 @@ VID_MenuInit(void)
|
|||
{
|
||||
int y = 0;
|
||||
|
||||
static const char *renderers[] = {
|
||||
"[OpenGL 1.4]",
|
||||
"[OpenGL 3.2]",
|
||||
#ifdef USE_REFVK
|
||||
"[Vulkan ]",
|
||||
#endif
|
||||
"[Software ]",
|
||||
CUSTOM_MODE_NAME,
|
||||
0
|
||||
};
|
||||
// Renderer selection box.
|
||||
// MAXRENDERERS + Custom + NULL.
|
||||
static const char *renderers[MAXRENDERERS + 2] = { NULL };
|
||||
Renderer_FillRenderdef();
|
||||
|
||||
for (int i = 0; i < numrenderer; i++)
|
||||
{
|
||||
renderers[i] = rendererlist[i].boxstr;
|
||||
}
|
||||
|
||||
renderers[numrenderer] = CUSTOM_MODE_NAME;
|
||||
|
||||
// must be kept in sync with vid_modes[] in vid.c
|
||||
static const char *resolutions[] = {
|
||||
|
@ -448,7 +479,7 @@ VID_MenuInit(void)
|
|||
s_renderer_list.generic.x = 0;
|
||||
s_renderer_list.generic.y = (y = 0);
|
||||
s_renderer_list.itemnames = renderers;
|
||||
s_renderer_list.curvalue = GetRenderer();
|
||||
s_renderer_list.curvalue = Renderer_GetRenderer();
|
||||
|
||||
s_mode_list.generic.type = MTYPE_SPINCONTROL;
|
||||
s_mode_list.generic.name = "video mode";
|
||||
|
|
Loading…
Reference in a new issue