layers: Fix tracking of WSI fence retirement
authorChris Forbes <chrisforbes@google.com>
Wed, 21 Sep 2016 01:36:19 +0000 (13:36 +1200)
committerChris Forbes <chrisforbes@google.com>
Wed, 21 Sep 2016 23:47:21 +0000 (11:47 +1200)
Previously we'd note that the fence wasn't submitted to a queue, and so
never call RetireWorkOnQueue, which is the only thing that marked the
fence as retired. In the WSI fence case, we still aren't doing any
tracking of completion of the WSI operation (we should! image ownership
is easily fouled up!) but we can at least retire the fence.

Fixes #954.

Signed-off-by: Chris Forbes <chrisforbes@google.com>
layers/core_validation.cpp

index 6fe036c..bd399bb 100644 (file)
@@ -5215,8 +5215,13 @@ static bool RetireFence(layer_data *dev_data, VkFence fence) {
                                  getQueueNode(dev_data, pFence->signaler.first),
                                  pFence->signaler.second);
     }
-
-    return false;
+    else {
+        /* Fence signaller is the WSI. We're not tracking what the WSI op
+         * actually /was/ in CV yet, but we need to mark the fence as retired.
+         */
+        pFence->state = FENCE_RETIRED;
+        return false;
+    }
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL
@@ -5265,7 +5270,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
     VkResult result = dev_data->device_dispatch_table->GetFenceStatus(device, fence);
     lock.lock();
     if (result == VK_SUCCESS) {
-        skip_call |= RetireFence(fence);
+        skip_call |= RetireFence(dev_data, fence);
     }
     lock.unlock();
     if (skip_call)