Fix dup tests to not free in-use semaphores/fences
authorLiam Middlebrook <lmiddlebrook@nvidia.com>
Thu, 3 Jan 2019 22:07:10 +0000 (14:07 -0800)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 10 Jan 2019 16:26:53 +0000 (11:26 -0500)
The dup{,2,3} tests were subject to a race condition in which a
semaphore may be deleted before a VkQueue which was dependent on it had
completed execution.

This change moves the vkQueueWaitIdle call into the same scope as the
semaphores/fences that the queue is dependent on.

VK-GL-CTS issue: 1538

Components: Vulkan

Affects: dEQP-VK.api.external.{fence,semaphore}.opaque_fd.dup*

Change-Id: I73cf541c9c184790df44b68b8a065787634847d9
(cherry picked from commit 732a8b6800972b271735cf9b865a3612fb56dfc4)

external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp

index 606f7aa..ccafd67 100644 (file)
@@ -1350,11 +1350,11 @@ tcu::TestStatus testSemaphoreFdDup (Context&                                    context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else
@@ -1420,11 +1420,11 @@ tcu::TestStatus testSemaphoreFdDup2 (Context&                                   context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else
@@ -1490,11 +1490,11 @@ tcu::TestStatus testSemaphoreFdDup3 (Context&                                   context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else
@@ -2364,11 +2364,11 @@ tcu::TestStatus testFenceFdDup (Context&                                context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else
@@ -2434,11 +2434,11 @@ tcu::TestStatus testFenceFdDup2 (Context&                               context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else
@@ -2504,11 +2504,11 @@ tcu::TestStatus testFenceFdDup3 (Context&                               context,
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
 
-               VK_CHECK(vkd.queueWaitIdle(queue));
-
                return tcu::TestStatus::pass("Pass");
        }
 #else