Added settings and command line switches to request OpenGL context version and profile
parent
0154af39aa
commit
cc973dab6f
145
src/app/app.cpp
145
src/app/app.cpp
|
@ -164,8 +164,6 @@ CApplication::CApplication(CSystemUtils* systemUtils)
|
||||||
m_language = LANGUAGE_ENV;
|
m_language = LANGUAGE_ENV;
|
||||||
|
|
||||||
m_lowCPU = true;
|
m_lowCPU = true;
|
||||||
|
|
||||||
m_graphics = "opengl";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CApplication::~CApplication()
|
CApplication::~CApplication()
|
||||||
|
@ -251,7 +249,9 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
OPT_MOD,
|
OPT_MOD,
|
||||||
OPT_RESOLUTION,
|
OPT_RESOLUTION,
|
||||||
OPT_HEADLESS,
|
OPT_HEADLESS,
|
||||||
OPT_DEVICE
|
OPT_DEVICE,
|
||||||
|
OPT_OPENGL_VERSION,
|
||||||
|
OPT_OPENGL_PROFILE
|
||||||
};
|
};
|
||||||
|
|
||||||
option options[] =
|
option options[] =
|
||||||
|
@ -268,6 +268,8 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
{ "resolution", required_argument, nullptr, OPT_RESOLUTION },
|
{ "resolution", required_argument, nullptr, OPT_RESOLUTION },
|
||||||
{ "headless", no_argument, nullptr, OPT_HEADLESS },
|
{ "headless", no_argument, nullptr, OPT_HEADLESS },
|
||||||
{ "graphics", required_argument, nullptr, OPT_DEVICE },
|
{ "graphics", required_argument, nullptr, OPT_DEVICE },
|
||||||
|
{ "glversion", required_argument, nullptr, OPT_OPENGL_VERSION },
|
||||||
|
{ "glprofile", required_argument, nullptr, OPT_OPENGL_PROFILE },
|
||||||
{ nullptr, 0, nullptr, 0}
|
{ nullptr, 0, nullptr, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -311,6 +313,8 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
GetLogger()->Message(" -resolution WxH set resolution\n");
|
GetLogger()->Message(" -resolution WxH set resolution\n");
|
||||||
GetLogger()->Message(" -headless headless mode - disables graphics, sound and user interaction\n");
|
GetLogger()->Message(" -headless headless mode - disables graphics, sound and user interaction\n");
|
||||||
GetLogger()->Message(" -graphics changes graphics device (defaults to opengl)\n");
|
GetLogger()->Message(" -graphics changes graphics device (defaults to opengl)\n");
|
||||||
|
GetLogger()->Message(" -glversion sets OpenGL context version to use (either default or version in format #.#)\n");
|
||||||
|
GetLogger()->Message(" -glprofile sets OpenGL context profile to use (one of: default, core, compatibility, opengles)\n");
|
||||||
return PARSE_ARGS_HELP;
|
return PARSE_ARGS_HELP;
|
||||||
}
|
}
|
||||||
case OPT_DEBUG:
|
case OPT_DEBUG:
|
||||||
|
@ -411,6 +415,59 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
case OPT_DEVICE:
|
case OPT_DEVICE:
|
||||||
{
|
{
|
||||||
m_graphics = optarg;
|
m_graphics = optarg;
|
||||||
|
m_graphicsOverride = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OPT_OPENGL_VERSION:
|
||||||
|
{
|
||||||
|
if (strcmp(optarg, "default") == 0)
|
||||||
|
{
|
||||||
|
m_glMajor = -1;
|
||||||
|
m_glMinor = -1;
|
||||||
|
m_glVersionOverride = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int major = 1, minor = 1;
|
||||||
|
|
||||||
|
int parsed = sscanf(optarg, "%d.%d", &major, &minor);
|
||||||
|
|
||||||
|
if (parsed < 2)
|
||||||
|
{
|
||||||
|
GetLogger()->Error("Invalid OpenGL version: %s\n", optarg);
|
||||||
|
return PARSE_ARGS_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_glMajor = major;
|
||||||
|
m_glMinor = minor;
|
||||||
|
m_glVersionOverride = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OPT_OPENGL_PROFILE:
|
||||||
|
{
|
||||||
|
if (strcmp(optarg, "default") == 0)
|
||||||
|
{
|
||||||
|
m_glProfile = 0;
|
||||||
|
m_glProfileOverride = true;
|
||||||
|
}
|
||||||
|
else if (strcmp(optarg, "core") == 0)
|
||||||
|
{
|
||||||
|
m_glProfile = SDL_GL_CONTEXT_PROFILE_CORE;
|
||||||
|
m_glProfileOverride = true;
|
||||||
|
}
|
||||||
|
else if (strcmp(optarg, "compatibility") == 0)
|
||||||
|
{
|
||||||
|
m_glProfile = SDL_GL_CONTEXT_PROFILE_COMPATIBILITY;
|
||||||
|
m_glProfileOverride = true;
|
||||||
|
}
|
||||||
|
else if (strcmp(optarg, "opengles") == 0)
|
||||||
|
{
|
||||||
|
m_glProfile = SDL_GL_CONTEXT_PROFILE_ES;
|
||||||
|
m_glProfileOverride = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetLogger()->Error("Invalid OpenGL profile: %s\n", optarg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -573,11 +630,23 @@ bool CApplication::Create()
|
||||||
|
|
||||||
if (!m_headless)
|
if (!m_headless)
|
||||||
{
|
{
|
||||||
m_device = Gfx::CreateDevice(m_deviceConfig, m_graphics.c_str());
|
std::string graphics = "default";
|
||||||
|
std::string value;
|
||||||
|
|
||||||
|
if (m_graphicsOverride)
|
||||||
|
{
|
||||||
|
graphics = m_graphics;
|
||||||
|
}
|
||||||
|
else if (GetConfigFile().GetStringProperty("Experimental", "GraphicsDevice", value))
|
||||||
|
{
|
||||||
|
graphics = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_device = Gfx::CreateDevice(m_deviceConfig, graphics.c_str());
|
||||||
|
|
||||||
if (m_device == nullptr)
|
if (m_device == nullptr)
|
||||||
{
|
{
|
||||||
GetLogger()->Error("Unknown graphics device: %s\n", m_graphics.c_str());
|
GetLogger()->Error("Unknown graphics device: %s\n", graphics.c_str());
|
||||||
GetLogger()->Info("Changing to default device\n");
|
GetLogger()->Info("Changing to default device\n");
|
||||||
m_systemUtils->SystemDialog(SDT_ERROR, "Graphics initialization error", "You have selected invalid graphics device with -graphics switch. Game will use default OpenGL device instead.");
|
m_systemUtils->SystemDialog(SDT_ERROR, "Graphics initialization error", "You have selected invalid graphics device with -graphics switch. Game will use default OpenGL device instead.");
|
||||||
m_device = Gfx::CreateDevice(m_deviceConfig, "opengl");
|
m_device = Gfx::CreateDevice(m_deviceConfig, "opengl");
|
||||||
|
@ -645,10 +714,76 @@ bool CApplication::CreateVideoSurface()
|
||||||
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, m_deviceConfig.alphaSize);
|
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, m_deviceConfig.alphaSize);
|
||||||
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, m_deviceConfig.depthSize);
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, m_deviceConfig.depthSize);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, m_deviceConfig.stencilSize);
|
||||||
|
|
||||||
if (m_deviceConfig.doubleBuf)
|
if (m_deviceConfig.doubleBuf)
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
|
std::string value;
|
||||||
|
|
||||||
|
// set OpenGL context version
|
||||||
|
// -glversion switch overrides config settings
|
||||||
|
if (m_glVersionOverride)
|
||||||
|
{
|
||||||
|
if ((m_glMajor >= 0) && (m_glMinor >= 0))
|
||||||
|
{
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, m_glMajor);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, m_glMinor);
|
||||||
|
|
||||||
|
GetLogger()->Info("Requesting OpenGL context version %d.%d\n", m_glMajor, m_glMinor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (GetConfigFile().GetStringProperty("Experimental", "OpenGLVersion", value))
|
||||||
|
{
|
||||||
|
int major = 1, minor = 1;
|
||||||
|
|
||||||
|
sscanf(value.c_str(), "%d.%d", &major, &minor);
|
||||||
|
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
|
||||||
|
|
||||||
|
GetLogger()->Info("Requesting OpenGL context version %d.%d\n", major, minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set OpenGL context profile
|
||||||
|
// -glprofile switch overrides config settings
|
||||||
|
int profile = 0;
|
||||||
|
|
||||||
|
if (m_glProfileOverride)
|
||||||
|
{
|
||||||
|
profile = m_glProfile;
|
||||||
|
}
|
||||||
|
else if (GetConfigFile().GetStringProperty("Experimental", "OpenGLProfile", value))
|
||||||
|
{
|
||||||
|
if (value == "core")
|
||||||
|
{
|
||||||
|
profile = SDL_GL_CONTEXT_PROFILE_CORE;
|
||||||
|
}
|
||||||
|
else if (value == "compatibility")
|
||||||
|
{
|
||||||
|
profile = SDL_GL_CONTEXT_PROFILE_COMPATIBILITY;
|
||||||
|
}
|
||||||
|
else if (value == "opengles")
|
||||||
|
{
|
||||||
|
profile = SDL_GL_CONTEXT_PROFILE_ES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile);
|
||||||
|
|
||||||
|
switch (profile)
|
||||||
|
{
|
||||||
|
case SDL_GL_CONTEXT_PROFILE_CORE:
|
||||||
|
GetLogger()->Info("Requesting OpenGL core profile\n");
|
||||||
|
break;
|
||||||
|
case SDL_GL_CONTEXT_PROFILE_COMPATIBILITY:
|
||||||
|
GetLogger()->Info("Requesting OpenGL compatibility profile\n");
|
||||||
|
break;
|
||||||
|
case SDL_GL_CONTEXT_PROFILE_ES:
|
||||||
|
GetLogger()->Info("Requesting OpenGL ES profile\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* If hardware acceleration specifically requested, this will force the hw accel
|
/* If hardware acceleration specifically requested, this will force the hw accel
|
||||||
and fail with error if not available */
|
and fail with error if not available */
|
||||||
if (m_deviceConfig.hardwareAccel)
|
if (m_deviceConfig.hardwareAccel)
|
||||||
|
|
|
@ -410,7 +410,15 @@ protected:
|
||||||
SystemTimeStamp* m_manualFrameTime;
|
SystemTimeStamp* m_manualFrameTime;
|
||||||
|
|
||||||
//! Graphics device to use
|
//! Graphics device to use
|
||||||
std::string m_graphics;
|
bool m_graphicsOverride = false;
|
||||||
|
std::string m_graphics = "default";
|
||||||
|
//! OpenGL version to use
|
||||||
|
bool m_glVersionOverride = false;
|
||||||
|
int m_glMajor = -1;
|
||||||
|
int m_glMinor = -1;
|
||||||
|
//! OpenGL profile
|
||||||
|
bool m_glProfileOverride = false;
|
||||||
|
int m_glProfile = 0;
|
||||||
|
|
||||||
//! Current mode of mouse
|
//! Current mode of mouse
|
||||||
MouseMode m_mouseMode;
|
MouseMode m_mouseMode;
|
||||||
|
|
Loading…
Reference in New Issue