Changeset - r25017:3c0a0f14110e
[Not reviewed]
master
0 2 0
Michael Lutz - 3 years ago 2021-03-08 20:16:41
michi@icosahedron.de
Fix #8825: [OpenGL] Don't clear cursor cache from the game loop thread.
2 files changed with 19 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/video/opengl.cpp
Show inline comments
 
@@ -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;
 
}
 

	
 
/**
src/video/opengl.h
Show inline comments
 
@@ -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();
0 comments (0 inline, 0 general)