Changeset - r25176:d26e97db1dd3
[Not reviewed]
master
0 2 0
Michael Lutz - 4 years ago 2021-04-12 19:44:32
michi@icosahedron.de
Fix #9028: [OpenGL] Clear cursor cache on destroying the OpenGL backend.
2 files changed with 17 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/video/opengl.cpp
Show inline comments
 
@@ -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
src/video/opengl.h
Show inline comments
 
@@ -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:
0 comments (0 inline, 0 general)