Fix: Data races on cursor state in OpenGL backends
This commit is contained in:
		 Jonathan G Rennison
					Jonathan G Rennison
				
			
				
					committed by
					
						 Michael Lutz
						Michael Lutz
					
				
			
			
				
	
			
			
			 Michael Lutz
						Michael Lutz
					
				
			
						parent
						
							fbd0a2e65a
						
					
				
				
					commit
					39b7ef31f8
				
			| @@ -134,7 +134,7 @@ static bool _allowSoftware; | ||||
| 	CGLSetCurrentContext(ctx); | ||||
|  | ||||
| 	OpenGLBackend::Get()->Paint(); | ||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | ||||
| 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||
|  | ||||
| 	[ super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts ]; | ||||
| } | ||||
|   | ||||
| @@ -1053,18 +1053,20 @@ void OpenGLBackend::Paint() | ||||
|  */ | ||||
| void OpenGLBackend::DrawMouseCursor() | ||||
| { | ||||
| 	if (!this->cursor_in_window) return; | ||||
|  | ||||
| 	/* Draw cursor on screen */ | ||||
| 	_cur_dpi = &_screen; | ||||
| 	for (uint i = 0; i < _cursor.sprite_count; ++i) { | ||||
| 		SpriteID sprite = _cursor.sprite_seq[i].sprite; | ||||
| 	for (uint i = 0; i < this->cursor_sprite_count; ++i) { | ||||
| 		SpriteID sprite = this->cursor_sprite_seq[i].sprite; | ||||
|  | ||||
| 		/* Sprites are cached by PopulateCursorCache(). */ | ||||
| 		if (this->cursor_cache.Contains(sprite)) { | ||||
| 			Sprite *spr = this->cursor_cache.Get(sprite); | ||||
|  | ||||
| 			this->RenderOglSprite((OpenGLSprite *)spr->data, _cursor.sprite_seq[i].pal, | ||||
| 					_cursor.pos.x + _cursor.sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), | ||||
| 					_cursor.pos.y + _cursor.sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), | ||||
| 			this->RenderOglSprite((OpenGLSprite *)spr->data, this->cursor_sprite_seq[i].pal, | ||||
| 					this->cursor_pos.x + this->cursor_sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), | ||||
| 					this->cursor_pos.y + this->cursor_sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), | ||||
| 					ZOOM_LVL_GUI); | ||||
| 		} | ||||
| 	} | ||||
| @@ -1072,6 +1074,9 @@ void OpenGLBackend::DrawMouseCursor() | ||||
|  | ||||
| void OpenGLBackend::PopulateCursorCache() | ||||
| { | ||||
| 	static_assert(lengthof(_cursor.sprite_seq) == lengthof(this->cursor_sprite_seq)); | ||||
| 	static_assert(lengthof(_cursor.sprite_pos) == lengthof(this->cursor_sprite_pos)); | ||||
|  | ||||
| 	if (this->clear_cursor_cache) { | ||||
| 		/* We have a pending cursor cache clear to do first. */ | ||||
| 		this->clear_cursor_cache = false; | ||||
| @@ -1085,7 +1090,13 @@ void OpenGLBackend::PopulateCursorCache() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	this->cursor_pos = _cursor.pos; | ||||
| 	this->cursor_sprite_count = _cursor.sprite_count; | ||||
| 	this->cursor_in_window = _cursor.in_window; | ||||
|  | ||||
| 	for (uint i = 0; i < _cursor.sprite_count; ++i) { | ||||
| 		this->cursor_sprite_seq[i] = _cursor.sprite_seq[i]; | ||||
| 		this->cursor_sprite_pos[i] = _cursor.sprite_pos[i]; | ||||
| 		SpriteID sprite = _cursor.sprite_seq[i].sprite; | ||||
|  | ||||
| 		if (!this->cursor_cache.Contains(sprite)) { | ||||
|   | ||||
| @@ -65,6 +65,12 @@ private: | ||||
| 	PaletteID last_sprite_pal = (PaletteID)-1; ///< Last uploaded remap palette. | ||||
| 	bool clear_cursor_cache = false;           ///< A clear of the cursor cache is pending. | ||||
|  | ||||
| 	Point cursor_pos;                    ///< Cursor position | ||||
| 	bool cursor_in_window;               ///< Cursor inside this window | ||||
| 	PalSpriteID cursor_sprite_seq[16];   ///< Current image of cursor | ||||
| 	Point cursor_sprite_pos[16];         ///< Relative position of individual cursor sprites | ||||
| 	uint cursor_sprite_count;            ///< Number of cursor sprites to draw | ||||
|  | ||||
| 	OpenGLBackend(); | ||||
| 	~OpenGLBackend(); | ||||
|  | ||||
|   | ||||
| @@ -174,7 +174,7 @@ void VideoDriver_SDL_OpenGL::Paint() | ||||
| 	} | ||||
|  | ||||
| 	OpenGLBackend::Get()->Paint(); | ||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | ||||
| 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||
|  | ||||
| 	SDL_GL_SwapWindow(this->sdl_window); | ||||
| } | ||||
|   | ||||
| @@ -1454,7 +1454,7 @@ void VideoDriver_Win32OpenGL::Paint() | ||||
| 	} | ||||
|  | ||||
| 	OpenGLBackend::Get()->Paint(); | ||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | ||||
| 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||
|  | ||||
| 	SwapBuffers(this->dc); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user