From 63b2346d62256fa1cc30d2d79c9c177b93c048df Mon Sep 17 00:00:00 2001 From: Petr Kraus Date: Thu, 14 Nov 2019 00:01:44 +0100 Subject: [PATCH] Add tests of VkSwapchain acquiring too many images --- android/cts/master/vk-master.txt | 4 ++ .../modules/vulkan/wsi/vktWsiSwapchainTests.cpp | 84 ++++++++++++++++++++++ .../mustpass/master/vk-default-no-waivers.txt | 12 ++++ external/vulkancts/mustpass/master/vk-default.txt | 12 ++++ 4 files changed, 112 insertions(+) diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 52c1963..749db5e 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -387645,6 +387645,8 @@ dEQP-VK.wsi.android.swapchain.modify.resize dEQP-VK.wsi.android.swapchain.destroy.null_handle dEQP-VK.wsi.android.swapchain.get_images.incomplete dEQP-VK.wsi.android.swapchain.get_images.count +dEQP-VK.wsi.android.swapchain.acquire.too_many +dEQP-VK.wsi.android.swapchain.acquire.too_many_timeout dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388421,6 +388423,8 @@ dEQP-VK.wsi.macos.swapchain.render.device_group2 dEQP-VK.wsi.macos.swapchain.destroy.null_handle dEQP-VK.wsi.macos.swapchain.get_images.incomplete dEQP-VK.wsi.macos.swapchain.get_images.count +dEQP-VK.wsi.macos.swapchain.acquire.too_many +dEQP-VK.wsi.macos.swapchain.acquire.too_many_timeout dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.pre_multiplied.reference diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp index 34eb45f..d9d1da5 100644 --- a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp +++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp @@ -55,6 +55,7 @@ #include "deSharedPtr.hpp" #include +#include namespace vkt { @@ -2417,6 +2418,82 @@ tcu::TestStatus destroyNullHandleSwapchainTest (Context& context, Type wsiType) return tcu::TestStatus::pass("Destroying a VK_NULL_HANDLE surface has no effect"); } +tcu::TestStatus acquireTooManyTest (Context& context, Type wsiType) +{ + const tcu::UVec2 desiredSize (256, 256); + const InstanceHelper instHelper (context, wsiType); + const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize)); + const Unique surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window)); + const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface); + const VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2); + const Unique swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo)); + + deUint32 numImages; + VK_CHECK(devHelper.vkd.getSwapchainImagesKHR(*devHelper.device, *swapchain, &numImages, DE_NULL)); + const deUint32 minImageCount = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface).minImageCount; + if (numImages < minImageCount) return tcu::TestStatus::fail("Get swapchain images returned less than minImageCount images"); + const deUint32 numAcquirableImages = numImages - minImageCount + 1; + + const auto fences = createFences(devHelper.vkd, *devHelper.device, numAcquirableImages + 1); + deUint32 dummy; + for (deUint32 i = 0; i < numAcquirableImages; ++i) { + VK_CHECK_WSI(devHelper.vkd.acquireNextImageKHR(*devHelper.device, *swapchain, std::numeric_limits::max(), (VkSemaphore)0, **fences[i], &dummy)); + } + + const auto result = devHelper.vkd.acquireNextImageKHR(*devHelper.device, *swapchain, 0, (VkSemaphore)0, **fences[numAcquirableImages], &dummy); + + if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR && result != VK_NOT_READY ){ + return tcu::TestStatus::fail("Implementation failed to respond well acquiring too many images with 0 timeout"); + } + + // cleanup + const deUint32 numFences = (result == VK_NOT_READY) ? static_cast(fences.size() - 1) : static_cast(fences.size()); + vector fencesRaw(numFences); + std::transform(fences.begin(), fences.begin() + numFences, fencesRaw.begin(), [](const FenceSp& f) -> vk::VkFence{ return **f; }); + VK_CHECK(devHelper.vkd.waitForFences(*devHelper.device, numFences, fencesRaw.data(), VK_TRUE, std::numeric_limits::max())); + + return tcu::TestStatus::pass("Acquire too many swapchain images test succeeded"); +} + +tcu::TestStatus acquireTooManyTimeoutTest (Context& context, Type wsiType) +{ + const tcu::UVec2 desiredSize (256, 256); + const InstanceHelper instHelper (context, wsiType); + const NativeObjects native (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize)); + const Unique surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window)); + const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface); + const VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2); + const Unique swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo)); + + deUint32 numImages; + VK_CHECK(devHelper.vkd.getSwapchainImagesKHR(*devHelper.device, *swapchain, &numImages, DE_NULL)); + const deUint32 minImageCount = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface).minImageCount; + if (numImages < minImageCount) return tcu::TestStatus::fail("Get swapchain images returned less than minImageCount images"); + const deUint32 numAcquirableImages = numImages - minImageCount + 1; + + const auto fences = createFences(devHelper.vkd, *devHelper.device, numAcquirableImages + 1); + deUint32 dummy; + for (deUint32 i = 0; i < numAcquirableImages; ++i) { + VK_CHECK_WSI(devHelper.vkd.acquireNextImageKHR(*devHelper.device, *swapchain, std::numeric_limits::max(), (VkSemaphore)0, **fences[i], &dummy)); + } + + const deUint64 millisecond = 1000000; + const deUint64 timeout = 50 * millisecond; // arbitrary realistic non-0 non-infinite timeout + const auto result = devHelper.vkd.acquireNextImageKHR(*devHelper.device, *swapchain, timeout, (VkSemaphore)0, **fences[numAcquirableImages], &dummy); + + if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR && result != VK_TIMEOUT ){ + return tcu::TestStatus::fail("Implementation failed to respond well acquiring too many images with timeout"); + } + + // cleanup + const deUint32 numFences = (result == VK_TIMEOUT) ? static_cast(fences.size() - 1) : static_cast(fences.size()); + vector fencesRaw(numFences); + std::transform(fences.begin(), fences.begin() + numFences, fencesRaw.begin(), [](const FenceSp& f) -> vk::VkFence{ return **f; }); + VK_CHECK(devHelper.vkd.waitForFences(*devHelper.device, numFences, fencesRaw.data(), VK_TRUE, std::numeric_limits::max())); + + return tcu::TestStatus::pass("Acquire too many swapchain images test succeeded"); +} + void getBasicRenderPrograms (SourceCollections& dst, Type) { TriangleRenderer::getPrograms(dst); @@ -2453,6 +2530,12 @@ void populateDestroyGroup (tcu::TestCaseGroup* testGroup, Type wsiType) addFunctionCase(testGroup, "null_handle", "Destroying a VK_NULL_HANDLE swapchain", destroyNullHandleSwapchainTest, wsiType); } +void populateAcquireGroup (tcu::TestCaseGroup* testGroup, Type wsiType) +{ + addFunctionCase(testGroup, "too_many", "Test acquiring too many images with 0 timeout", acquireTooManyTest, wsiType); + addFunctionCase(testGroup, "too_many_timeout", "Test acquiring too many images with timeout", acquireTooManyTimeoutTest, wsiType); +} + } // anonymous void createSwapchainTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType) @@ -2463,6 +2546,7 @@ void createSwapchainTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType) addTestGroup(testGroup, "modify", "Modify VkSwapchain", populateModifyGroup, wsiType); addTestGroup(testGroup, "destroy", "Destroy VkSwapchain", populateDestroyGroup, wsiType); addTestGroup(testGroup, "get_images", "Get swapchain images", populateGetImagesGroup, wsiType); + addTestGroup(testGroup, "acquire", "Ancquire next swapchain image", populateAcquireGroup, wsiType); } } // wsi diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index 8235631..2e9d57c 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -387664,6 +387664,8 @@ dEQP-VK.wsi.xlib.swapchain.render.device_group2 dEQP-VK.wsi.xlib.swapchain.destroy.null_handle dEQP-VK.wsi.xlib.swapchain.get_images.incomplete dEQP-VK.wsi.xlib.swapchain.get_images.count +dEQP-VK.wsi.xlib.swapchain.acquire.too_many +dEQP-VK.wsi.xlib.swapchain.acquire.too_many_timeout dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388080,6 +388082,8 @@ dEQP-VK.wsi.xcb.swapchain.render.device_group2 dEQP-VK.wsi.xcb.swapchain.destroy.null_handle dEQP-VK.wsi.xcb.swapchain.get_images.incomplete dEQP-VK.wsi.xcb.swapchain.get_images.count +dEQP-VK.wsi.xcb.swapchain.acquire.too_many +dEQP-VK.wsi.xcb.swapchain.acquire.too_many_timeout dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388495,6 +388499,8 @@ dEQP-VK.wsi.wayland.swapchain.modify.resize dEQP-VK.wsi.wayland.swapchain.destroy.null_handle dEQP-VK.wsi.wayland.swapchain.get_images.incomplete dEQP-VK.wsi.wayland.swapchain.get_images.count +dEQP-VK.wsi.wayland.swapchain.acquire.too_many +dEQP-VK.wsi.wayland.swapchain.acquire.too_many_timeout dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388911,6 +388917,8 @@ dEQP-VK.wsi.android.swapchain.modify.resize dEQP-VK.wsi.android.swapchain.destroy.null_handle dEQP-VK.wsi.android.swapchain.get_images.incomplete dEQP-VK.wsi.android.swapchain.get_images.count +dEQP-VK.wsi.android.swapchain.acquire.too_many +dEQP-VK.wsi.android.swapchain.acquire.too_many_timeout dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -390047,6 +390055,8 @@ dEQP-VK.wsi.win32.swapchain.render.device_group2 dEQP-VK.wsi.win32.swapchain.destroy.null_handle dEQP-VK.wsi.win32.swapchain.get_images.incomplete dEQP-VK.wsi.win32.swapchain.get_images.count +dEQP-VK.wsi.win32.swapchain.acquire.too_many +dEQP-VK.wsi.win32.swapchain.acquire.too_many_timeout dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -390463,6 +390473,8 @@ dEQP-VK.wsi.macos.swapchain.render.device_group2 dEQP-VK.wsi.macos.swapchain.destroy.null_handle dEQP-VK.wsi.macos.swapchain.get_images.incomplete dEQP-VK.wsi.macos.swapchain.get_images.count +dEQP-VK.wsi.macos.swapchain.acquire.too_many +dEQP-VK.wsi.macos.swapchain.acquire.too_many_timeout dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.pre_multiplied.reference diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index 58e5d7f..0a7b7e4 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -387625,6 +387625,8 @@ dEQP-VK.wsi.xlib.swapchain.render.device_group2 dEQP-VK.wsi.xlib.swapchain.destroy.null_handle dEQP-VK.wsi.xlib.swapchain.get_images.incomplete dEQP-VK.wsi.xlib.swapchain.get_images.count +dEQP-VK.wsi.xlib.swapchain.acquire.too_many +dEQP-VK.wsi.xlib.swapchain.acquire.too_many_timeout dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.xlib.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388041,6 +388043,8 @@ dEQP-VK.wsi.xcb.swapchain.render.device_group2 dEQP-VK.wsi.xcb.swapchain.destroy.null_handle dEQP-VK.wsi.xcb.swapchain.get_images.incomplete dEQP-VK.wsi.xcb.swapchain.get_images.count +dEQP-VK.wsi.xcb.swapchain.acquire.too_many +dEQP-VK.wsi.xcb.swapchain.acquire.too_many_timeout dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.xcb.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388456,6 +388460,8 @@ dEQP-VK.wsi.wayland.swapchain.modify.resize dEQP-VK.wsi.wayland.swapchain.destroy.null_handle dEQP-VK.wsi.wayland.swapchain.get_images.incomplete dEQP-VK.wsi.wayland.swapchain.get_images.count +dEQP-VK.wsi.wayland.swapchain.acquire.too_many +dEQP-VK.wsi.wayland.swapchain.acquire.too_many_timeout dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.wayland.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -388872,6 +388878,8 @@ dEQP-VK.wsi.android.swapchain.modify.resize dEQP-VK.wsi.android.swapchain.destroy.null_handle dEQP-VK.wsi.android.swapchain.get_images.incomplete dEQP-VK.wsi.android.swapchain.get_images.count +dEQP-VK.wsi.android.swapchain.acquire.too_many +dEQP-VK.wsi.android.swapchain.acquire.too_many_timeout dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.android.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -390008,6 +390016,8 @@ dEQP-VK.wsi.win32.swapchain.render.device_group2 dEQP-VK.wsi.win32.swapchain.destroy.null_handle dEQP-VK.wsi.win32.swapchain.get_images.incomplete dEQP-VK.wsi.win32.swapchain.get_images.count +dEQP-VK.wsi.win32.swapchain.acquire.too_many +dEQP-VK.wsi.win32.swapchain.acquire.too_many_timeout dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.win32.incremental_present.scale_none.immediate.identity.pre_multiplied.reference @@ -390424,6 +390434,8 @@ dEQP-VK.wsi.macos.swapchain.render.device_group2 dEQP-VK.wsi.macos.swapchain.destroy.null_handle dEQP-VK.wsi.macos.swapchain.get_images.incomplete dEQP-VK.wsi.macos.swapchain.get_images.count +dEQP-VK.wsi.macos.swapchain.acquire.too_many +dEQP-VK.wsi.macos.swapchain.acquire.too_many_timeout dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.reference dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.opaque.incremental_present dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.identity.pre_multiplied.reference -- 2.7.4