|
@@ -121,13 +121,13 @@ void VideoDriver_SDL::CheckPaletteAnim()
|
|
|
if (_cur_palette.count_dirty == 0) return;
|
|
|
|
|
|
_local_palette = _cur_palette;
|
|
|
this->MakeDirty(0, 0, _screen.width, _screen.height);
|
|
|
}
|
|
|
|
|
|
static void Paint()
|
|
|
void VideoDriver_SDL::Paint()
|
|
|
{
|
|
|
PerformanceMeasurer framerate(PFE_VIDEO);
|
|
|
|
|
|
if (IsEmptyRect(_dirty_rect) && _cur_palette.count_dirty == 0) return;
|
|
|
|
|
|
if (_cur_palette.count_dirty != 0) {
|
|
@@ -158,28 +158,33 @@ static void Paint()
|
|
|
}
|
|
|
SDL_UpdateWindowSurfaceRects(_sdl_window, &r, 1);
|
|
|
|
|
|
MemSetT(&_dirty_rect, 0);
|
|
|
}
|
|
|
|
|
|
static void PaintThread()
|
|
|
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) {
|
|
|
/* Then just draw and wait till we stop */
|
|
|
Paint();
|
|
|
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 },
|
|
@@ -817,13 +822,13 @@ void VideoDriver_SDL::LoopOnce()
|
|
|
UpdateWindows();
|
|
|
this->CheckPaletteAnim();
|
|
|
|
|
|
if (_draw_mutex != nullptr && !HasModalProgress()) {
|
|
|
_draw_signal->notify_one();
|
|
|
} else {
|
|
|
Paint();
|
|
|
this->Paint();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* Emscripten is running an event-based mainloop; there is already some
|
|
|
* downtime between each iteration, so no need to sleep. */
|
|
|
#ifndef __EMSCRIPTEN__
|
|
@@ -858,13 +863,13 @@ void VideoDriver_SDL::MainLoop()
|
|
|
_draw_threaded = false;
|
|
|
} else {
|
|
|
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", &PaintThread);
|
|
|
_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) {
|
|
|
draw_lock.unlock();
|
|
|
draw_lock.release();
|
|
|
delete _draw_mutex;
|