|
@@ -144,13 +144,13 @@ static void CheckPaletteAnim()
|
|
|
NOT_REACHED();
|
|
|
}
|
|
|
_cur_palette.count_dirty = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void DrawSurfaceToScreen()
|
|
|
void VideoDriver_SDL::Paint()
|
|
|
{
|
|
|
PerformanceMeasurer framerate(PFE_VIDEO);
|
|
|
|
|
|
int n = _num_dirty_rects;
|
|
|
if (n == 0) return;
|
|
|
|
|
@@ -170,29 +170,34 @@ static void DrawSurfaceToScreen()
|
|
|
}
|
|
|
|
|
|
SDL_UpdateRects(_sdl_realscreen, n, _dirty_rects);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void DrawSurfaceToScreenThread()
|
|
|
void VideoDriver_SDL::PaintThread()
|
|
|
{
|
|
|
/* First tell the main thread we're started */
|
|
|
std::unique_lock<std::recursive_mutex> lock(*_draw_mutex);
|
|
|
_draw_signal->notify_one();
|
|
|
|
|
|
/* Now wait for the first thing to draw! */
|
|
|
_draw_signal->wait(*_draw_mutex);
|
|
|
|
|
|
while (_draw_continue) {
|
|
|
CheckPaletteAnim();
|
|
|
/* Then just draw and wait till we stop */
|
|
|
DrawSurfaceToScreen();
|
|
|
this->Paint();
|
|
|
_draw_signal->wait(lock);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* static */ void VideoDriver_SDL::PaintThreadThunk(VideoDriver_SDL *drv)
|
|
|
{
|
|
|
drv->PaintThread();
|
|
|
}
|
|
|
|
|
|
static const Dimension _default_resolutions[] = {
|
|
|
{ 640, 480},
|
|
|
{ 800, 600},
|
|
|
{1024, 768},
|
|
|
{1152, 864},
|
|
|
{1280, 800},
|
|
@@ -714,13 +719,13 @@ void VideoDriver_SDL::MainLoop()
|
|
|
_draw_threaded = false;
|
|
|
} else {
|
|
|
this->draw_lock = std::unique_lock<std::recursive_mutex>(*_draw_mutex);
|
|
|
_draw_signal = new std::condition_variable_any();
|
|
|
_draw_continue = true;
|
|
|
|
|
|
_draw_threaded = StartNewThread(&draw_thread, "ottd:draw-sdl", &DrawSurfaceToScreenThread);
|
|
|
_draw_threaded = StartNewThread(&draw_thread, "ottd:draw-sdl", &VideoDriver_SDL::PaintThreadThunk, this);
|
|
|
|
|
|
/* Free the mutex if we won't be able to use it. */
|
|
|
if (!_draw_threaded) {
|
|
|
this->draw_lock.unlock();
|
|
|
this->draw_lock.release();
|
|
|
delete _draw_mutex;
|
|
@@ -779,13 +784,13 @@ void VideoDriver_SDL::MainLoop()
|
|
|
_local_palette = _cur_palette;
|
|
|
|
|
|
if (_draw_mutex != nullptr && !HasModalProgress()) {
|
|
|
_draw_signal->notify_one();
|
|
|
} else {
|
|
|
CheckPaletteAnim();
|
|
|
DrawSurfaceToScreen();
|
|
|
this->Paint();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* If we are not in fast-forward, create some time between calls to ease up CPU usage. */
|
|
|
if (!_fast_forward || _pause_mode) {
|
|
|
/* See how much time there is till we have to process the next event, and try to hit that as close as possible. */
|