From 5461a1cbaa40731e82e2a1751cf4e862463aeb8e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 22 Mar 2022 16:25:11 -0400 Subject: [PATCH] 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 Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index fb37b455b2d..4747ed941c8 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -1877,7 +1877,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_QueueWaitIdle( uint64_t timeline = queue->last_fence_timeline; if (fence_finish(queue->device, 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; @@ -2433,7 +2434,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; @@ -2492,7 +2494,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;