Mesa (staging/22.0): lavapipe: enforce monotonic timeline incrementing

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 6 16:30:54 UTC 2022


Module: Mesa
Branch: staging/22.0
Commit: a449f2d8cccdf14cc7bc6ab4d3557c07142a54ef
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a449f2d8cccdf14cc7bc6ab4d3557c07142a54ef

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
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 <omar.akkila at collabora.com>

Reviewed-by: Dave Airlie <airlied at redhat.com>
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;



More information about the mesa-commit mailing list