OpenGL: Avoid data races around _cursor
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1085,7 +1087,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();
|
||||
|
||||
|
||||
@@ -179,7 +179,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);
|
||||
}
|
||||
|
||||
@@ -1461,7 +1461,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