1
0
Fork 0

Fix: Data races on cursor state in OpenGL backends

pull/9003/head
Jonathan G Rennison 2021-04-05 23:22:55 +01:00 committed by Michael Lutz
parent fbd0a2e65a
commit 39b7ef31f8
5 changed files with 25 additions and 8 deletions

View File

@ -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 ];
} }

View File

@ -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)) {

View File

@ -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();

View File

@ -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);
} }

View File

@ -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);
} }