Module: Mesa Branch: staging/22.0 Commit: a449f2d8cccdf14cc7bc6ab4d3557c07142a54ef URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a449f2d8cccdf14cc7bc6ab4d3557c07142a54ef
Author: Mike Blumenkrantz <[email protected]> Date: Tue Mar 22 16:25:11 2022 -0400 lavapipe: enforce monotonic timeline incrementing maybe just being overly paranoid, but make sure that the timeline id gets compared while the lock is held in every scenario cc: mesa-stable Reviewed-by: Omar Akkila <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15453> (cherry picked from commit 5461a1cbaa40731e82e2a1751cf4e862463aeb8e) --- .pick_status.json | 2 +- src/gallium/frontends/lavapipe/lvp_device.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 355457ee23d..68d4417b2b6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1700,7 +1700,7 @@ "description": "lavapipe: enforce monotonic timeline incrementing", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "because_sha": null }, { diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index a91a85114d0..8809cb2b2cb 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -1622,7 +1622,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_QueueWaitIdle( if (queue->last_fence) { queue->device->pscreen->fence_finish(queue->device->pscreen, NULL, queue->last_fence, PIPE_TIMEOUT_INFINITE); queue->device->pscreen->fence_reference(queue->device->pscreen, &queue->device->queue.last_fence, NULL); - queue->last_finished = timeline; + if (timeline > queue->last_finished) + queue->last_finished = timeline; } simple_mtx_unlock(&queue->last_lock); return VK_SUCCESS; @@ -2136,7 +2137,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetFenceStatus( simple_mtx_lock(&device->queue.last_lock); if (fence->handle == device->queue.last_fence) { device->pscreen->fence_reference(device->pscreen, &device->queue.last_fence, NULL); - device->queue.last_finished = fence->timeline; + if (fence->timeline > device->queue.last_finished) + device->queue.last_finished = fence->timeline; } simple_mtx_unlock(&device->queue.last_lock); return VK_SUCCESS; @@ -2252,7 +2254,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_WaitForFences( simple_mtx_lock(&device->queue.last_lock); if (fence->handle == device->queue.last_fence) { device->pscreen->fence_reference(device->pscreen, &device->queue.last_fence, NULL); - device->queue.last_finished = fence->timeline; + if (fence->timeline > device->queue.last_finished) + device->queue.last_finished = fence->timeline; } simple_mtx_unlock(&device->queue.last_lock); fence->signalled = true;
