Partially fix thread safety issues around _cur_palette
Replaces: 4c59dfb6
See also: https://github.com/OpenTTD/OpenTTD/issues/8712
This commit is contained in:
@@ -53,6 +53,7 @@ GameMode _game_mode;
|
|||||||
SwitchMode _switch_mode; ///< The next mainloop command.
|
SwitchMode _switch_mode; ///< The next mainloop command.
|
||||||
PauseMode _pause_mode;
|
PauseMode _pause_mode;
|
||||||
Palette _cur_palette;
|
Palette _cur_palette;
|
||||||
|
std::mutex _cur_palette_mutex;
|
||||||
std::string _switch_baseset;
|
std::string _switch_baseset;
|
||||||
|
|
||||||
static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth()
|
static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth()
|
||||||
@@ -1162,6 +1163,7 @@ void DoPaletteAnimations();
|
|||||||
|
|
||||||
void GfxInitPalettes()
|
void GfxInitPalettes()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
|
||||||
memcpy(&_cur_palette, &_palette, sizeof(_cur_palette));
|
memcpy(&_cur_palette, &_palette, sizeof(_cur_palette));
|
||||||
DoPaletteAnimations();
|
DoPaletteAnimations();
|
||||||
}
|
}
|
||||||
|
@@ -82,6 +82,11 @@
|
|||||||
#include "linkgraph/linkgraphschedule.h"
|
#include "linkgraph/linkgraphschedule.h"
|
||||||
#include "tracerestrict.h"
|
#include "tracerestrict.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#include "../3rdparty/mingw-std-threads/mingw.mutex.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
|
||||||
@@ -1971,7 +1976,11 @@ void GameLoop()
|
|||||||
StateGameLoop();
|
StateGameLoop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_pause_mode && HasBit(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations();
|
if (!_pause_mode && HasBit(_display_opt, DO_FULL_ANIMATION)) {
|
||||||
|
extern std::mutex _cur_palette_mutex;
|
||||||
|
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
|
||||||
|
DoPaletteAnimations();
|
||||||
|
}
|
||||||
|
|
||||||
SoundDriver::GetInstance()->MainLoop();
|
SoundDriver::GetInstance()->MainLoop();
|
||||||
MusicLoop();
|
MusicLoop();
|
||||||
|
@@ -174,7 +174,12 @@ void VideoDriver::Tick()
|
|||||||
this->PopulateSystemSprites();
|
this->PopulateSystemSprites();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
extern std::mutex _cur_palette_mutex;
|
||||||
|
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
|
||||||
this->CheckPaletteAnim();
|
this->CheckPaletteAnim();
|
||||||
|
}
|
||||||
|
|
||||||
this->Paint();
|
this->Paint();
|
||||||
|
|
||||||
this->UnlockVideoBuffer();
|
this->UnlockVideoBuffer();
|
||||||
|
Reference in New Issue
Block a user