From 876336f455907bb2dff191d4fd38322a7f3f2a81 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 6 Jun 2016 19:13:50 +0100 Subject: [PATCH] fallback to software mode if engine fails to initialise --- src/config.h | 1 + src/drawing/NewDrawing.cpp | 66 ++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/config.h b/src/config.h index 6055702d59..ba5a033006 100644 --- a/src/config.h +++ b/src/config.h @@ -132,6 +132,7 @@ enum { }; enum { + DRAWING_ENGINE_NONE = -1, DRAWING_ENGINE_SOFTWARE, DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY, DRAWING_ENGINE_OPENGL, diff --git a/src/drawing/NewDrawing.cpp b/src/drawing/NewDrawing.cpp index e213207245..c2e2ea20df 100644 --- a/src/drawing/NewDrawing.cpp +++ b/src/drawing/NewDrawing.cpp @@ -14,6 +14,7 @@ *****************************************************************************/ #pragma endregion +#include "../core/Exception.hpp" #include "IDrawingContext.h" #include "IDrawingEngine.h" @@ -24,21 +25,27 @@ extern "C" #include "../platform/platform.h" } -static IDrawingEngine * _drawingEngine = nullptr; +static sint32 _drawingEngineType = DRAWING_ENGINE_SOFTWARE; +static IDrawingEngine * _drawingEngine = nullptr; -extern "C" rct_string_id DrawingEngineStringIds[] = +extern "C" { - STR_DRAWING_ENGINE_SOFTWARE, - STR_DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY, - STR_DRAWING_ENGINE_OPENGL, -}; + rct_string_id DrawingEngineStringIds[] = + { + STR_DRAWING_ENGINE_SOFTWARE, + STR_DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY, + STR_DRAWING_ENGINE_OPENGL, + }; +} extern "C" { void drawing_engine_init() { assert(_drawingEngine == nullptr); - switch (gConfigGeneral.drawing_engine) { + + _drawingEngineType = gConfigGeneral.drawing_engine; + switch (_drawingEngineType) { case DRAWING_ENGINE_SOFTWARE: _drawingEngine = DrawingEngineFactory::CreateSoftware(); break; @@ -52,16 +59,47 @@ extern "C" if (_drawingEngine == nullptr) { - log_error("Unable to create drawing engine. Falling back to software."); + if (_drawingEngineType == DRAWING_ENGINE_SOFTWARE) + { + _drawingEngineType = DRAWING_ENGINE_NONE; + log_fatal("Unable to create a drawing engine."); + exit(-1); + } + else + { + log_error("Unable to create drawing engine. Falling back to software."); - // Fallback to software - gConfigGeneral.drawing_engine = DRAWING_ENGINE_SOFTWARE; - config_save_default(); - - _drawingEngine = DrawingEngineFactory::CreateSoftware(); + // Fallback to software + gConfigGeneral.drawing_engine = DRAWING_ENGINE_SOFTWARE; + config_save_default(); + drawing_engine_init(); + } } + else + { + try + { + _drawingEngine->Initialise(gWindow); + } + catch (Exception ex) + { + if (_drawingEngineType == DRAWING_ENGINE_SOFTWARE) + { + _drawingEngineType = DRAWING_ENGINE_NONE; + log_fatal("Unable to initialise a drawing engine."); + exit(-1); + } + else + { + log_error("Unable to initialise drawing engine. Falling back to software."); - _drawingEngine->Initialise(gWindow); + // Fallback to software + gConfigGeneral.drawing_engine = DRAWING_ENGINE_SOFTWARE; + config_save_default(); + drawing_engine_init(); + } + } + } } void drawing_engine_resize()