|
@@ -329,13 +329,13 @@ bool VideoDriver_Win32::MakeWindow(bool
|
|
|
|
|
|
GameSizeChanged(); // invalidate all windows, force redraw
|
|
|
return true; // the request succeeded
|
|
|
}
|
|
|
|
|
|
/** Do palette animation and blit to the window. */
|
|
|
static void PaintWindow()
|
|
|
void VideoDriver_Win32::Paint()
|
|
|
{
|
|
|
PerformanceMeasurer framerate(PFE_VIDEO);
|
|
|
|
|
|
if (IsEmptyRect(_dirty_rect)) return;
|
|
|
|
|
|
/* Convert update region from logical to device coordinates. */
|
|
@@ -382,31 +382,36 @@ static void PaintWindow()
|
|
|
|
|
|
ReleaseDC(_wnd.main_wnd, dc);
|
|
|
|
|
|
MemSetT(&_dirty_rect, 0);
|
|
|
}
|
|
|
|
|
|
static void PaintWindowThread()
|
|
|
void VideoDriver_Win32::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) {
|
|
|
PaintWindow();
|
|
|
this->Paint();
|
|
|
|
|
|
/* Flush GDI buffer to ensure drawing here doesn't conflict with any GDI usage in the main WndProc. */
|
|
|
GdiFlush();
|
|
|
|
|
|
_draw_signal->wait(*_draw_mutex);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* static */ void VideoDriver_Win32::PaintThreadThunk(VideoDriver_Win32 *drv)
|
|
|
{
|
|
|
drv->PaintThread();
|
|
|
}
|
|
|
|
|
|
/** Forward key presses to the window system. */
|
|
|
static LRESULT HandleCharMsg(uint keycode, WChar charcode)
|
|
|
{
|
|
|
#if !defined(UNICODE)
|
|
|
static char prev_char = 0;
|
|
|
|
|
@@ -1173,13 +1178,13 @@ void VideoDriver_Win32::MainLoop()
|
|
|
}
|
|
|
|
|
|
if (_draw_threaded) {
|
|
|
this->draw_lock = std::unique_lock<std::recursive_mutex>(*_draw_mutex);
|
|
|
|
|
|
_draw_continue = true;
|
|
|
_draw_threaded = StartNewThread(&draw_thread, "ottd:draw-win32", &PaintWindowThread);
|
|
|
_draw_threaded = StartNewThread(&draw_thread, "ottd:draw-win32", &VideoDriver_Win32::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;
|
|
@@ -1251,13 +1256,13 @@ void VideoDriver_Win32::MainLoop()
|
|
|
UpdateWindows();
|
|
|
CheckPaletteAnim();
|
|
|
|
|
|
if (_draw_mutex != nullptr && !HasModalProgress()) {
|
|
|
_draw_signal->notify_one();
|
|
|
} else {
|
|
|
PaintWindow();
|
|
|
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. */
|