From 40f7d085f4a04a6e76a861de3f9ba99504d979c2 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Mon, 12 Apr 2021 21:44:32 +0200 Subject: [PATCH] Fix #9028: [OpenGL] Clear cursor cache on destroying the OpenGL backend. --- src/video/opengl.cpp | 22 +++++++++++++++------- src/video/opengl.h | 2 ++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index c1c1afaaec..bb509bcd74 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -510,7 +510,7 @@ OpenGLBackend::~OpenGLBackend() _glDeleteBuffers(1, &this->anim_pbo); } if (_glDeleteTextures != nullptr) { - ClearCursorCache(); + this->InternalClearCursorCache(); OpenGLSprite::Destroy(); _glDeleteTextures(1, &this->vid_texture); @@ -1082,12 +1082,7 @@ void OpenGLBackend::PopulateCursorCache() 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); - } + this->InternalClearCursorCache(); } this->cursor_pos = _cursor.pos; @@ -1113,6 +1108,19 @@ void OpenGLBackend::PopulateCursorCache() /** * Clear all cached cursor sprites. */ +void OpenGLBackend::InternalClearCursorCache() +{ + Sprite *sp; + while ((sp = this->cursor_cache.Pop()) != nullptr) { + OpenGLSprite *sprite = (OpenGLSprite *)sp->data; + sprite->~OpenGLSprite(); + free(sp); + } +} + +/** + * Queue a request for cursor cache clear. + */ void OpenGLBackend::ClearCursorCache() { /* If the game loop is threaded, this function might be called diff --git a/src/video/opengl.h b/src/video/opengl.h index 7e42b20bed..b0318f9882 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -77,6 +77,8 @@ private: const char *Init(); bool InitShaders(); + void InternalClearCursorCache(); + void RenderOglSprite(OpenGLSprite *gl_sprite, PaletteID pal, int x, int y, ZoomLevel zoom); public: