From cc973dab6f2c5d0fb7cd8b103aa38f3b54f83752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kapu=C5=9Bci=C5=84ski?= Date: Mon, 15 Feb 2016 23:08:56 +0100 Subject: [PATCH] Added settings and command line switches to request OpenGL context version and profile --- src/app/app.cpp | 145 ++++++++++++++++++++++++++++++++++++++++++++++-- src/app/app.h | 10 +++- 2 files changed, 149 insertions(+), 6 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 652d4643..8d2d7691 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -164,8 +164,6 @@ CApplication::CApplication(CSystemUtils* systemUtils) m_language = LANGUAGE_ENV; m_lowCPU = true; - - m_graphics = "opengl"; } CApplication::~CApplication() @@ -251,7 +249,9 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) OPT_MOD, OPT_RESOLUTION, OPT_HEADLESS, - OPT_DEVICE + OPT_DEVICE, + OPT_OPENGL_VERSION, + OPT_OPENGL_PROFILE }; option options[] = @@ -268,6 +268,8 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) { "resolution", required_argument, nullptr, OPT_RESOLUTION }, { "headless", no_argument, nullptr, OPT_HEADLESS }, { "graphics", required_argument, nullptr, OPT_DEVICE }, + { "glversion", required_argument, nullptr, OPT_OPENGL_VERSION }, + { "glprofile", required_argument, nullptr, OPT_OPENGL_PROFILE }, { nullptr, 0, nullptr, 0} }; @@ -311,6 +313,8 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Message(" -resolution WxH set resolution\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(" -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; } case OPT_DEBUG: @@ -411,6 +415,59 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) case OPT_DEVICE: { 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; } default: @@ -573,11 +630,23 @@ bool CApplication::Create() 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) { - 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"); 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"); @@ -645,10 +714,76 @@ bool CApplication::CreateVideoSurface() 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_STENCIL_SIZE, m_deviceConfig.stencilSize); if (m_deviceConfig.doubleBuf) 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 and fail with error if not available */ if (m_deviceConfig.hardwareAccel) diff --git a/src/app/app.h b/src/app/app.h index 2b96d310..3550b56f 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -410,7 +410,15 @@ protected: SystemTimeStamp* m_manualFrameTime; //! 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 MouseMode m_mouseMode;