From 276b8a9ec1304d7fbeb230c1e406bad5f2bc9ede Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Mon, 15 Oct 2018 12:45:46 -0700 Subject: [PATCH] Fix swapchain creation in dEQP-VK.wsi.*.swapchain.* In the Vulkan 1.1.87 spec release, the release fixed a bug in VkSwapchainCreateInfoKHR by adding the following VU: * imageFormat, imageUsage, imageExtent, and imageArrayLayers must be supported for VK_IMAGE_TYPE_2D VK_IMAGE_TILING_OPTIMAL images as reported by vkGetPhysicalDeviceImageFormatProperties. Jesse Hall authored the fix in response to behavior discovered by Chad Versace while debugging failures in dEQP-VK.wsi.android.swapchain.* on Intel Chrome OS devices. This patch fixes the failing tests to comply with the spec bugfix. Components: Vulkan VK-GL-CTS Issue: 1395 Affects: dEQP-VK.wsi.*.swapchain.* See-Also: https://gitlab.khronos.org/vulkan/vulkan/issues/1029 Change-Id: I959774833d03b63eb6e23fbd3a7ff33378b44110 (cherry picked from commit 49eab80e4a8b3af1790b9ac88b096aa9bffd193f) --- .../modules/vulkan/wsi/vktWsiSwapchainTests.cpp | 47 +++++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp index 8a435fc..eab2db1 100644 --- a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp +++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp @@ -561,6 +561,7 @@ vector generateSwapchainParameterCases (Type ws tcu::TestStatus createSwapchainTest (Context& context, TestParameters params) { + tcu::TestLog& log = context.getTestContext().getLog(); const InstanceHelper instHelper (context, params.wsiType); const NativeObjects native (context, instHelper.supportedExtensions, params.wsiType); const Unique surface (createSurface(instHelper.vki, *instHelper.instance, params.wsiType, *native.display, *native.window)); @@ -569,21 +570,55 @@ tcu::TestStatus createSwapchainTest (Context& context, TestParameters params) for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx) { + std::ostringstream subcase; + subcase << "Sub-case " << (caseNdx+1) << " / " << cases.size() << ": "; + VkSwapchainCreateInfoKHR curParams = cases[caseNdx]; curParams.surface = *surface; curParams.queueFamilyIndexCount = 1u; curParams.pQueueFamilyIndices = &devHelper.queueFamilyIndex; - context.getTestContext().getLog() - << TestLog::Message << "Sub-case " << (caseNdx+1) << " / " << cases.size() << ": " << curParams << TestLog::EndMessage; - - { - const Unique swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &curParams)); + log << TestLog::Message << subcase.str() << curParams << TestLog::EndMessage; + + // The Vulkan 1.1.87 spec contains the following VU for VkSwapchainCreateInfoKHR: + // + // * imageFormat, imageUsage, imageExtent, and imageArrayLayers must be supported for VK_IMAGE_TYPE_2D + // VK_IMAGE_TILING_OPTIMAL images as reported by vkGetPhysicalDeviceImageFormatProperties. + VkImageFormatProperties properties; + const VkResult propertiesResult = instHelper.vki.getPhysicalDeviceImageFormatProperties(devHelper.physicalDevice, + curParams.imageFormat, + VK_IMAGE_TYPE_2D, + VK_IMAGE_TILING_OPTIMAL, + curParams.imageUsage, + 0, // flags + &properties); + + log << TestLog::Message << subcase.str() + << "vkGetPhysicalDeviceImageFormatProperties => " + << getResultStr(propertiesResult) << TestLog::EndMessage; + + switch (propertiesResult) { + case VK_SUCCESS: + { + const Unique swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &curParams)); + } + log << TestLog::Message << subcase.str() + << "Creating swapchain succeeeded" << TestLog::EndMessage; + break; + case VK_ERROR_FORMAT_NOT_SUPPORTED: + log << TestLog::Message << subcase.str() + << "Skip because vkGetPhysicalDeviceImageFormatProperties returned VK_ERROR_FORMAT_NOT_SUPPORTED" << TestLog::EndMessage; + break; + default: + log << TestLog::Message << subcase.str() + << "Fail because vkGetPhysicalDeviceImageFormatProperties returned " + << getResultStr(propertiesResult) << TestLog::EndMessage; + return tcu::TestStatus::fail("Unexpected result from vkGetPhysicalDeviceImageFormatProperties"); } } - return tcu::TestStatus::pass("Creating swapchain succeeded"); + return tcu::TestStatus::pass("No sub-case failed"); } tcu::TestStatus createSwapchainSimulateOOMTest (Context& context, TestParameters params) -- 2.7.4