diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 46ea44be0..737a00d59 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -681,7 +681,19 @@ bool GMainWindow::LoadROM(const QString& filename) { "the " "log for more details. " "Ensure that you have the latest graphics drivers for your GPU.")); + break; + case Core::System::ResultStatus::ErrorVideoCore_ErrorGenericDrivers: + QMessageBox::critical( + this, tr("An error occured in the video core."), + tr("You are running default Windows drivers for your GPU. You need to install the " + "proper drivers for your graphics card from the manufacturer's website.")); + break; + + case Core::System::ResultStatus::ErrorVideoCore_ErrorBelowGL33: + QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"), + tr("Your GPU may not support OpenGL 3.3, or you do not " + "have the latest graphics driver.")); break; default: diff --git a/src/core/core.cpp b/src/core/core.cpp index 013ef4c2e..6176fac1d 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -178,8 +178,9 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { GDBStub::Init(); Movie::GetInstance().Init(); - if (!VideoCore::Init(emu_window)) { - return ResultStatus::ErrorVideoCore; + ResultStatus result = VideoCore::Init(emu_window); + if (result != ResultStatus::Success) { + return result; } LOG_DEBUG(Core, "Initialized OK"); diff --git a/src/core/core.h b/src/core/core.h index 036179149..ff5d5934b 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -46,12 +46,16 @@ public: ErrorSystemMode, ///< Error determining the system mode ErrorLoader, ///< Error loading the specified application ErrorLoader_ErrorEncrypted, ///< Error loading the specified application due to encryption - ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an - /// invalid format - ErrorSystemFiles, ///< Error in finding system files - ErrorSharedFont, ///< Error in finding shared font - ErrorVideoCore, ///< Error in the video core - ErrorUnknown ///< Any other error + ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an + /// invalid format + ErrorSystemFiles, ///< Error in finding system files + ErrorSharedFont, ///< Error in finding shared font + ErrorVideoCore, ///< Error in the video core + ErrorVideoCore_ErrorGenericDrivers, ///< Error in the video core due to the user having + /// generic drivers installed + ErrorVideoCore_ErrorBelowGL33, ///< Error in the video core due to the user not having + /// OpenGL 3.3 or higher + ErrorUnknown ///< Any other error }; /** diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index 589aca857..8bc545dd0 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -6,6 +6,7 @@ #include #include "common/common_types.h" +#include "core/core.h" #include "video_core/rasterizer_interface.h" class EmuWindow; @@ -27,7 +28,7 @@ public: virtual void SetWindow(EmuWindow* window) = 0; /// Initialize the renderer - virtual bool Init() = 0; + virtual Core::System::ResultStatus Init() = 0; /// Shutdown the renderer virtual void ShutDown() = 0; diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 4dc492299..73e7e0178 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -505,7 +505,7 @@ static void APIENTRY DebugHandler(GLenum source, GLenum type, GLuint id, GLenum } /// Initialize the renderer -bool RendererOpenGL::Init() { +Core::System::ResultStatus RendererOpenGL::Init() { render_window->MakeCurrent(); if (GLAD_GL_KHR_debug) { @@ -525,15 +525,19 @@ bool RendererOpenGL::Init() { Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_Model", gpu_model); Core::Telemetry().AddField(Telemetry::FieldType::UserSystem, "GPU_OpenGL_Version", gl_version); + if (gpu_vendor == "GDI Generic") { + return Core::System::ResultStatus::ErrorVideoCore_ErrorGenericDrivers; + } + if (!GLAD_GL_VERSION_3_3) { - return false; + return Core::System::ResultStatus::ErrorVideoCore_ErrorBelowGL33; } InitOpenGLObjects(); RefreshRasterizerSetting(); - return true; + return Core::System::ResultStatus::Success; } /// Shutdown the renderer diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 991e9475f..c391e4967 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -47,7 +47,7 @@ public: void SetWindow(EmuWindow* window) override; /// Initialize the renderer - bool Init() override; + Core::System::ResultStatus Init() override; /// Shutdown the renderer void ShutDown() override; diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index d3767a6b4..a3b565dc9 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp @@ -25,19 +25,21 @@ std::atomic g_hw_shader_accurate_mul; std::atomic g_renderer_bg_color_update_requested; /// Initialize the video core -bool Init(EmuWindow* emu_window) { +Core::System::ResultStatus Init(EmuWindow* emu_window) { Pica::Init(); g_emu_window = emu_window; g_renderer = std::make_unique(); g_renderer->SetWindow(g_emu_window); - if (g_renderer->Init()) { - LOG_DEBUG(Render, "initialized OK"); - } else { + Core::System::ResultStatus result = g_renderer->Init(); + + if (result != Core::System::ResultStatus::Success) { LOG_ERROR(Render, "initialization failed !"); - return false; + } else { + LOG_DEBUG(Render, "initialized OK"); } - return true; + + return result; } /// Shutdown the video core diff --git a/src/video_core/video_core.h b/src/video_core/video_core.h index d7a2b26b3..4f40e0873 100644 --- a/src/video_core/video_core.h +++ b/src/video_core/video_core.h @@ -6,6 +6,7 @@ #include #include +#include "core/core.h" class EmuWindow; class RendererBase; @@ -31,7 +32,7 @@ extern std::atomic g_renderer_bg_color_update_requested; void Start(); /// Initialize the video core -bool Init(EmuWindow* emu_window); +Core::System::ResultStatus Init(EmuWindow* emu_window); /// Shutdown the video core void Shutdown();