From aa2e14219e698b5da543826e21227b11d138ab34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kapu=C5=9Bci=C5=84ski?= Date: Fri, 18 Dec 2015 21:04:16 +0100 Subject: [PATCH] Added warnings and error messages to graphics devices regarding unsupported OpenGL version --- src/app/app.cpp | 5 ++++- src/graphics/core/device.h | 9 +++++++++ src/graphics/opengl/gl21device.cpp | 7 ++++++- src/graphics/opengl/gl33device.cpp | 11 +++++++++-- src/graphics/opengl/gldevice.cpp | 14 +++++++++++++- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 5c124083..0a82f32f 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -624,7 +624,10 @@ bool CApplication::Create() if (! m_device->Create() ) { - m_errorMessage = std::string("Error in CDevice::Create()\n") + standardInfoMessage; + m_errorMessage = std::string("Error in CDevice::Create()\n") + + "\n\n" + + m_device->GetError() + + standardInfoMessage; m_exitCode = 5; return false; } diff --git a/src/graphics/core/device.h b/src/graphics/core/device.h index 36ba9580..def5b7f2 100644 --- a/src/graphics/core/device.h +++ b/src/graphics/core/device.h @@ -276,9 +276,18 @@ public: */ class CDevice { +protected: + std::string m_errorMessage; + public: virtual ~CDevice() {} + //! Returns last error message or empty string + inline std::string GetError() + { + return m_errorMessage; + } + //! Provides a hook to debug graphics code (implementation-specific) virtual void DebugHook() = 0; diff --git a/src/graphics/opengl/gl21device.cpp b/src/graphics/opengl/gl21device.cpp index 1a86fade..bd8f2726 100644 --- a/src/graphics/opengl/gl21device.cpp +++ b/src/graphics/opengl/gl21device.cpp @@ -177,6 +177,7 @@ bool CGL21Device::Create() if (glewInit() != GLEW_OK) { GetLogger()->Error("GLEW initialization failed\n"); + m_errorMessage = "An error occured while initializing GLEW."; return false; } @@ -186,7 +187,11 @@ bool CGL21Device::Create() if (m_glMajor < 2) { - GetLogger()->Error("Your hardware does not support OpenGL 2.0 or 2.1."); + GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor); + GetLogger()->Error("OpenGL 2.0 or newer is required to use this engine.\n"); + m_errorMessage = "It seems your graphics card does not support OpenGL 2.0.\n"; + m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n"; + m_errorMessage += "(OpenGL 2.0 is roughly equivalent to Direct3D 9)"; return false; } diff --git a/src/graphics/opengl/gl33device.cpp b/src/graphics/opengl/gl33device.cpp index 1246564d..1560cc8c 100644 --- a/src/graphics/opengl/gl33device.cpp +++ b/src/graphics/opengl/gl33device.cpp @@ -177,6 +177,7 @@ bool CGL33Device::Create() if (glewInit() != GLEW_OK) { GetLogger()->Error("GLEW initialization failed\n"); + m_errorMessage = "An error occured while initializing GLEW."; return false; } @@ -187,12 +188,18 @@ bool CGL33Device::Create() int glVersion = 10 * m_glMajor + m_glMinor; if (glVersion < 30) { - GetLogger()->Error("Your hardware does not support OpenGL 3.0+. Exiting.\n"); + GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor); + GetLogger()->Error("OpenGL 3.0 or newer is required to use this engine.\n"); + m_errorMessage = "It seems your graphics card does not support OpenGL 3.0.\n"; + m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n"; + m_errorMessage += "(OpenGL 3.0 is roughly equivalent to Direct3D 10)"; return false; } else if (glVersion < 33) { - GetLogger()->Warn("Full OpenGL 3.3 unavailable. Graphics might be bugged.\n"); + GetLogger()->Warn("Partially supported OpenGL version: %d.%d\n", m_glMajor, m_glMinor); + GetLogger()->Warn("You may experience problems while running the game on this engine.\n"); + GetLogger()->Warn("OpenGL 3.3 or newer is recommended.\n"); } else { diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index 6070acdf..4eba81a6 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -173,12 +173,24 @@ bool CGLDevice::Create() if (glewInit() != GLEW_OK) { GetLogger()->Error("GLEW initialization failed\n"); + m_errorMessage = "An error occured while initializing GLEW."; return false; } // Extract OpenGL version const char *version = reinterpret_cast(glGetString(GL_VERSION)); sscanf(version, "%d.%d", &m_glMajor, &m_glMinor); + + int glVersion = 10 * m_glMajor + m_glMinor; + if (glVersion < 13) + { + GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor); + GetLogger()->Error("OpenGL 1.3 or newer is required to use this engine.\n"); + m_errorMessage = "It seems your graphics card does not support OpenGL 1.3.\n"; + m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n"; + return false; + } + GetLogger()->Info("OpenGL %d.%d\n", m_glMajor, m_glMinor); // Detect multitexture support @@ -306,7 +318,7 @@ bool CGLDevice::Create() m_framebufferSupport = DetectFramebufferSupport(); if (m_framebufferSupport != FBS_NONE) - GetLogger()->Debug("Framebuffer supported\n"); + GetLogger()->Info("Framebuffer supported\n"); GetLogger()->Info("CDevice created successfully\n");