# HG changeset patch # User Michael Lutz # Date 2021-04-12 19:44:32 # Node ID d26e97db1dd3cf36e73a7baf8911af0eb6e632f6 # Parent 332152162c17f1f5957d6ced90ae2f0036da7ff5 Fix #9028: [OpenGL] Clear cursor cache on destroying the OpenGL backend. diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp --- 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 --- 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: