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); | 	CGLSetCurrentContext(ctx); | ||||||
|  |  | ||||||
| 	OpenGLBackend::Get()->Paint(); | 	OpenGLBackend::Get()->Paint(); | ||||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||||
|  |  | ||||||
| 	[ super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts ]; | 	[ super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts ]; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1053,18 +1053,20 @@ void OpenGLBackend::Paint() | |||||||
|  */ |  */ | ||||||
| void OpenGLBackend::DrawMouseCursor() | void OpenGLBackend::DrawMouseCursor() | ||||||
| { | { | ||||||
|  | 	if (!this->cursor_in_window) return; | ||||||
|  |  | ||||||
| 	/* Draw cursor on screen */ | 	/* Draw cursor on screen */ | ||||||
| 	_cur_dpi = &_screen; | 	_cur_dpi = &_screen; | ||||||
| 	for (uint i = 0; i < _cursor.sprite_count; ++i) { | 	for (uint i = 0; i < this->cursor_sprite_count; ++i) { | ||||||
| 		SpriteID sprite = _cursor.sprite_seq[i].sprite; | 		SpriteID sprite = this->cursor_sprite_seq[i].sprite; | ||||||
|  |  | ||||||
| 		/* Sprites are cached by PopulateCursorCache(). */ | 		/* Sprites are cached by PopulateCursorCache(). */ | ||||||
| 		if (this->cursor_cache.Contains(sprite)) { | 		if (this->cursor_cache.Contains(sprite)) { | ||||||
| 			Sprite *spr = this->cursor_cache.Get(sprite); | 			Sprite *spr = this->cursor_cache.Get(sprite); | ||||||
|  |  | ||||||
| 			this->RenderOglSprite((OpenGLSprite *)spr->data, _cursor.sprite_seq[i].pal, | 			this->RenderOglSprite((OpenGLSprite *)spr->data, this->cursor_sprite_seq[i].pal, | ||||||
| 					_cursor.pos.x + _cursor.sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), | 					this->cursor_pos.x + this->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->cursor_pos.y + this->cursor_sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), | ||||||
| 					ZOOM_LVL_GUI); | 					ZOOM_LVL_GUI); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -1072,6 +1074,9 @@ void OpenGLBackend::DrawMouseCursor() | |||||||
|  |  | ||||||
| void OpenGLBackend::PopulateCursorCache() | 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) { | 	if (this->clear_cursor_cache) { | ||||||
| 		/* We have a pending cursor cache clear to do first. */ | 		/* We have a pending cursor cache clear to do first. */ | ||||||
| 		this->clear_cursor_cache = false; | 		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) { | 	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; | 		SpriteID sprite = _cursor.sprite_seq[i].sprite; | ||||||
|  |  | ||||||
| 		if (!this->cursor_cache.Contains(sprite)) { | 		if (!this->cursor_cache.Contains(sprite)) { | ||||||
|   | |||||||
| @@ -65,6 +65,12 @@ private: | |||||||
| 	PaletteID last_sprite_pal = (PaletteID)-1; ///< Last uploaded remap palette. | 	PaletteID last_sprite_pal = (PaletteID)-1; ///< Last uploaded remap palette. | ||||||
| 	bool clear_cursor_cache = false;           ///< A clear of the cursor cache is pending. | 	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(); | ||||||
| 	~OpenGLBackend(); | 	~OpenGLBackend(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -174,7 +174,7 @@ void VideoDriver_SDL_OpenGL::Paint() | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	OpenGLBackend::Get()->Paint(); | 	OpenGLBackend::Get()->Paint(); | ||||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||||
|  |  | ||||||
| 	SDL_GL_SwapWindow(this->sdl_window); | 	SDL_GL_SwapWindow(this->sdl_window); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1454,7 +1454,7 @@ void VideoDriver_Win32OpenGL::Paint() | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	OpenGLBackend::Get()->Paint(); | 	OpenGLBackend::Get()->Paint(); | ||||||
| 	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); | 	OpenGLBackend::Get()->DrawMouseCursor(); | ||||||
|  |  | ||||||
| 	SwapBuffers(this->dc); | 	SwapBuffers(this->dc); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user