1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 07:14:31 +01:00

Adjust code, deprecate and fallback to HW if software was selected

This commit is contained in:
ζeh Matt
2025-04-30 18:04:06 +03:00
parent bac84cf17f
commit 730ceb5c33
7 changed files with 100 additions and 88 deletions

View File

@@ -136,7 +136,7 @@ namespace OpenRCT2
std::unique_ptr<GameScene> _gameScene;
IScene* _activeScene = nullptr;
DrawingEngine _drawingEngineType = DrawingEngine::Software;
DrawingEngine _drawingEngineType = DrawingEngine::SoftwareWithHardwareDisplay;
std::unique_ptr<IDrawingEngine> _drawingEngine;
std::unique_ptr<Painter> _painter;
@@ -612,59 +612,74 @@ namespace OpenRCT2
{
assert(_drawingEngine == nullptr);
_drawingEngineType = Config::Get().general.DrawingEngine;
auto drawingEngineFactory = _uiContext->GetDrawingEngineFactory();
auto drawingEngine = drawingEngineFactory->Create(_drawingEngineType, _uiContext);
if (drawingEngine == nullptr)
{
if (_drawingEngineType == DrawingEngine::Software)
const auto initializeEngine = [&](DrawingEngine engine) -> std::unique_ptr<IDrawingEngine> {
try
{
_drawingEngineType = DrawingEngine::None;
LOG_FATAL("Unable to create a drawing engine.");
exit(-1);
auto drawingEngineFactory = _uiContext->GetDrawingEngineFactory();
auto drawingEngine = drawingEngineFactory->Create(engine, _uiContext);
if (drawingEngine == nullptr)
{
LOG_FATAL("Unable to create a drawing engine.");
return nullptr;
}
drawingEngine->Initialise();
drawingEngine->SetVSync(Config::Get().general.UseVSync);
return drawingEngine;
}
catch (std::exception& ex)
{
LOG_ERROR(ex.what());
LOG_ERROR("Unable to initialise drawing engine.");
return nullptr;
}
return nullptr;
};
auto drawingEngineType = Config::Get().general.DrawingEngine;
if (drawingEngineType == DrawingEngine::SoftwareDeprecated)
{
drawingEngineType = DrawingEngine::SoftwareWithHardwareDisplay;
}
// Attempt to create drawing engine of the type specified in the config.
{
auto drawingEngine = initializeEngine(_drawingEngineType);
if (drawingEngine != nullptr)
{
_drawingEngine = std::move(drawingEngine);
}
else
{
LOG_ERROR("Unable to create drawing engine. Falling back to software.");
// Fallback to software
Config::Get().general.DrawingEngine = DrawingEngine::Software;
Config::Save();
DrawingEngineInit();
}
}
else
{
try
{
drawingEngine->Initialise();
drawingEngine->SetVSync(Config::Get().general.UseVSync);
_drawingEngine = std::move(drawingEngine);
}
catch (const std::exception& ex)
{
if (_drawingEngineType == DrawingEngine::Software)
// If the drawing engine creation failed, try to create a software engine.
if (drawingEngineType == DrawingEngine::OpenGL)
{
_drawingEngineType = DrawingEngine::None;
LOG_ERROR(ex.what());
LOG_FATAL("Unable to initialise a drawing engine.");
exit(-1);
}
else
{
LOG_ERROR(ex.what());
LOG_ERROR("Unable to initialise drawing engine. Falling back to software.");
drawingEngineType = DrawingEngine::SoftwareWithHardwareDisplay;
// Fallback to software
Config::Get().general.DrawingEngine = DrawingEngine::Software;
Config::Get().general.DrawingEngine = _drawingEngineType;
Config::Save();
DrawingEngineInit();
LOG_ERROR("Trying fallback back to software...");
drawingEngine = initializeEngine(_drawingEngineType);
if (drawingEngine != nullptr)
{
_drawingEngine = std::move(drawingEngine);
}
else
{
LOG_FATAL("Unable to create any renderer.");
exit(-1);
}
}
}
}
Config::Get().general.DrawingEngine = drawingEngineType;
Config::Save();
WindowCheckAllValidZoom();
}