| 569 | |
| 570 | public: |
| 571 | void InitialiseDrawingEngine() final override |
| 572 | { |
| 573 | assert(_drawingEngine == nullptr); |
| 574 | |
| 575 | const auto initializeEngine = [&](DrawingEngine engine) -> std::unique_ptr<Drawing::IDrawingEngine> { |
| 576 | try |
| 577 | { |
| 578 | auto drawingEngineFactory = _uiContext->GetDrawingEngineFactory(); |
| 579 | auto drawingEngine = drawingEngineFactory->Create(engine, *_uiContext); |
| 580 | if (drawingEngine == nullptr) |
| 581 | { |
| 582 | LOG_FATAL("Unable to create a drawing engine."); |
| 583 | return nullptr; |
| 584 | } |
| 585 | |
| 586 | drawingEngine->Initialise(); |
| 587 | drawingEngine->SetVSync(Config::Get().general.useVSync); |
| 588 | |
| 589 | return drawingEngine; |
| 590 | } |
| 591 | catch (std::exception& ex) |
| 592 | { |
| 593 | LOG_ERROR(ex.what()); |
| 594 | LOG_ERROR("Unable to initialise drawing engine."); |
| 595 | } |
| 596 | return nullptr; |
| 597 | }; |
| 598 | |
| 599 | auto drawingEngineType = Config::Get().general.drawingEngine; |
| 600 | |
| 601 | // Attempt to create drawing engine of the type specified in the config. |
| 602 | { |
| 603 | auto drawingEngine = initializeEngine(drawingEngineType); |
| 604 | if (drawingEngine != nullptr) |
| 605 | { |
| 606 | _drawingEngine = std::move(drawingEngine); |
| 607 | } |
| 608 | else |
| 609 | { |
| 610 | // If the drawing engine creation failed, try to create a software engine. |
| 611 | if (drawingEngineType == DrawingEngine::OpenGL) |
| 612 | { |
| 613 | drawingEngineType = DrawingEngine::SoftwareWithHardwareDisplay; |
| 614 | LOG_ERROR("Trying fallback back to software..."); |
| 615 | |
| 616 | drawingEngine = initializeEngine(drawingEngineType); |
| 617 | if (drawingEngine != nullptr) |
| 618 | { |
| 619 | _drawingEngine = std::move(drawingEngine); |
| 620 | } |
| 621 | else |
| 622 | { |
| 623 | LOG_FATAL("Unable to create any renderer."); |
| 624 | exit(-1); |
| 625 | } |
| 626 | } |
| 627 | } |
| 628 | } |
no test coverage detected