diff --git a/src/openrct2/drawing/IDrawingEngine.h b/src/openrct2/drawing/IDrawingEngine.h index 41c3adb383..92e5e8b783 100644 --- a/src/openrct2/drawing/IDrawingEngine.h +++ b/src/openrct2/drawing/IDrawingEngine.h @@ -32,6 +32,11 @@ enum DRAWING_ENGINE_FLAGS * Whether or not the engine will only draw changed blocks of the screen each frame. */ DEF_DIRTY_OPTIMISATIONS = 1 << 0, + + /** + * The drawing engine is capable of processing the drawing in parallel. + */ + DEF_PARALLEL_DRAWING = 1 << 1, }; struct rct_drawpixelinfo; diff --git a/src/openrct2/drawing/X8DrawingEngine.cpp b/src/openrct2/drawing/X8DrawingEngine.cpp index 9cbbcdcf77..ddaa2d381f 100644 --- a/src/openrct2/drawing/X8DrawingEngine.cpp +++ b/src/openrct2/drawing/X8DrawingEngine.cpp @@ -284,7 +284,7 @@ rct_drawpixelinfo* X8DrawingEngine::GetDrawingPixelInfo() DRAWING_ENGINE_FLAGS X8DrawingEngine::GetFlags() { - return DEF_DIRTY_OPTIMISATIONS; + return static_cast(DEF_DIRTY_OPTIMISATIONS | DEF_PARALLEL_DRAWING); } void X8DrawingEngine::InvalidateImage([[maybe_unused]] uint32_t image) diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 53200d366d..c16ddeb253 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -996,6 +996,12 @@ void viewport_paint( _paintJobs.reset(); } + bool useParallelDrawing = false; + if (useMultithreading && (dpi->DrawingEngine->GetFlags() & DEF_PARALLEL_DRAWING)) + { + useParallelDrawing = true; + } + // Create space to record sessions and keep track which index is being drawn size_t index = 0; if (recorded_sessions != nullptr)