Changeset - r25155:07046ed36b62
[Not reviewed]
master
0 5 0
Jonathan G Rennison - 3 years ago 2021-04-05 22:22:55
j.g.rennison@gmail.com
Fix: Data races on cursor state in OpenGL backends
5 files changed with 25 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/video/cocoa/cocoa_ogl.mm
Show inline comments
 
@@ -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 ];
 
}
src/video/opengl.cpp
Show inline comments
 
@@ -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)) {
src/video/opengl.h
Show inline comments
 
@@ -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();
 

	
src/video/sdl2_opengl_v.cpp
Show inline comments
 
@@ -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);
 
}
src/video/win32_v.cpp
Show inline comments
 
@@ -1454,7 +1454,7 @@ void VideoDriver_Win32OpenGL::Paint()
 
	}
 

	
 
	OpenGLBackend::Get()->Paint();
 
	if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor();
 
	OpenGLBackend::Get()->DrawMouseCursor();
 

	
 
	SwapBuffers(this->dc);
 
}
0 comments (0 inline, 0 general)