summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lutz <michi@icosahedron.de>2021-03-08 21:16:41 +0100
committerMichael Lutz <michi@icosahedron.de>2021-03-08 21:35:35 +0100
commit436cdf1fc898097a8cbe6226ad32a4055a6ca4d9 (patch)
tree1a0cd2e41ac254edce8968b2b9cf7bd7fc0ec8e3
parentee69a0dc2921b42caabf89c76cf9ece691026cf0 (diff)
downloadopenttd-436cdf1fc898097a8cbe6226ad32a4055a6ca4d9.tar.xz
Fix #8825: [OpenGL] Don't clear cursor cache from the game loop thread.
-rw-r--r--src/video/opengl.cpp26
-rw-r--r--src/video/opengl.h1
2 files changed, 19 insertions, 8 deletions
diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp
index 64ea02cf2..26f6f4b4d 100644
--- a/src/video/opengl.cpp
+++ b/src/video/opengl.cpp
@@ -1051,6 +1051,19 @@ void OpenGLBackend::DrawMouseCursor()
void OpenGLBackend::PopulateCursorCache()
{
+ if (this->clear_cursor_cache) {
+ /* We have a pending cursor cache clear to do first. */
+ this->clear_cursor_cache = false;
+ this->last_sprite_pal = (PaletteID)-1;
+
+ Sprite *sp;
+ while ((sp = this->cursor_cache.Pop()) != nullptr) {
+ OpenGLSprite *sprite = (OpenGLSprite *)sp->data;
+ sprite->~OpenGLSprite();
+ free(sp);
+ }
+ }
+
for (uint i = 0; i < _cursor.sprite_count; ++i) {
SpriteID sprite = _cursor.sprite_seq[i].sprite;
@@ -1070,14 +1083,11 @@ void OpenGLBackend::PopulateCursorCache()
*/
void OpenGLBackend::ClearCursorCache()
{
- this->last_sprite_pal = (PaletteID)-1;
-
- Sprite *sp;
- while ((sp = this->cursor_cache.Pop()) != nullptr) {
- OpenGLSprite *sprite = (OpenGLSprite *)sp->data;
- sprite->~OpenGLSprite();
- free(sp);
- }
+ /* If the game loop is threaded, this function might be called
+ * from the game thread. As we can call OpenGL functions only
+ * on the main thread, just set a flag that is handled the next
+ * time we prepare the cursor cache for drawing. */
+ this->clear_cursor_cache = true;
}
/**
diff --git a/src/video/opengl.h b/src/video/opengl.h
index 3919179e4..c17a8536d 100644
--- a/src/video/opengl.h
+++ b/src/video/opengl.h
@@ -63,6 +63,7 @@ private:
LRUCache<SpriteID, Sprite> cursor_cache; ///< Cache of encoded cursor sprites.
PaletteID last_sprite_pal = (PaletteID)-1; ///< Last uploaded remap palette.
+ bool clear_cursor_cache = false; ///< A clear of the cursor cache is pending.
OpenGLBackend();
~OpenGLBackend();