Partially fix data race issues around _cur_palette

See: https://github.com/OpenTTD/OpenTTD/issues/8712
This commit is contained in:
Jonathan G Rennison
2021-04-05 22:35:51 +01:00
parent e9186308e9
commit f2bfcc5524
2 changed files with 8 additions and 6 deletions

View File

@@ -141,6 +141,7 @@ bool VideoDriver_SDL_OpenGL::AllocateBackingStore(int w, int h, bool force)
_cur_palette.first_dirty = 0; _cur_palette.first_dirty = 0;
_cur_palette.count_dirty = 256; _cur_palette.count_dirty = 256;
this->local_palette = _cur_palette; this->local_palette = _cur_palette;
_cur_palette.count_dirty = 0;
return res; return res;
} }
@@ -165,7 +166,7 @@ void VideoDriver_SDL_OpenGL::Paint()
{ {
PerformanceMeasurer framerate(PFE_VIDEO); PerformanceMeasurer framerate(PFE_VIDEO);
if (_cur_palette.count_dirty != 0) { if (this->local_palette.count_dirty != 0) {
Blitter *blitter = BlitterFactory::GetCurrentBlitter(); Blitter *blitter = BlitterFactory::GetCurrentBlitter();
/* Always push a changed palette to OpenGL. */ /* Always push a changed palette to OpenGL. */
@@ -174,7 +175,7 @@ void VideoDriver_SDL_OpenGL::Paint()
blitter->PaletteAnimate(this->local_palette); blitter->PaletteAnimate(this->local_palette);
} }
_cur_palette.count_dirty = 0; this->local_palette.count_dirty = 0;
} }
OpenGLBackend::Get()->Paint(); OpenGLBackend::Get()->Paint();

View File

@@ -887,6 +887,7 @@ void VideoDriver_Win32Base::ClientSizeChanged(int w, int h, bool force)
_cur_palette.first_dirty = 0; _cur_palette.first_dirty = 0;
_cur_palette.count_dirty = 256; _cur_palette.count_dirty = 256;
_local_palette = _cur_palette; _local_palette = _cur_palette;
_cur_palette.count_dirty = 0;
BlitterFactory::GetCurrentBlitter()->PostResize(); BlitterFactory::GetCurrentBlitter()->PostResize();
@@ -1136,7 +1137,7 @@ void VideoDriver_Win32GDI::Paint()
HBITMAP old_bmp = (HBITMAP)SelectObject(dc2, this->dib_sect); HBITMAP old_bmp = (HBITMAP)SelectObject(dc2, this->dib_sect);
HPALETTE old_palette = SelectPalette(dc, this->gdi_palette, FALSE); HPALETTE old_palette = SelectPalette(dc, this->gdi_palette, FALSE);
if (_cur_palette.count_dirty != 0) { if (_local_palette.count_dirty != 0) {
Blitter *blitter = BlitterFactory::GetCurrentBlitter(); Blitter *blitter = BlitterFactory::GetCurrentBlitter();
switch (blitter->UsePaletteAnimation()) { switch (blitter->UsePaletteAnimation()) {
@@ -1155,7 +1156,7 @@ void VideoDriver_Win32GDI::Paint()
default: default:
NOT_REACHED(); NOT_REACHED();
} }
_cur_palette.count_dirty = 0; _local_palette.count_dirty = 0;
} }
BitBlt(dc, 0, 0, this->width, this->height, dc2, 0, 0, SRCCOPY); BitBlt(dc, 0, 0, this->width, this->height, dc2, 0, 0, SRCCOPY);
@@ -1447,7 +1448,7 @@ void VideoDriver_Win32OpenGL::Paint()
{ {
PerformanceMeasurer framerate(PFE_VIDEO); PerformanceMeasurer framerate(PFE_VIDEO);
if (_cur_palette.count_dirty != 0) { if (_local_palette.count_dirty != 0) {
Blitter *blitter = BlitterFactory::GetCurrentBlitter(); Blitter *blitter = BlitterFactory::GetCurrentBlitter();
/* Always push a changed palette to OpenGL. */ /* Always push a changed palette to OpenGL. */
@@ -1456,7 +1457,7 @@ void VideoDriver_Win32OpenGL::Paint()
blitter->PaletteAnimate(_local_palette); blitter->PaletteAnimate(_local_palette);
} }
_cur_palette.count_dirty = 0; _local_palette.count_dirty = 0;
} }
OpenGLBackend::Get()->Paint(); OpenGLBackend::Get()->Paint();