Fix several issues in swapchain tests
authorRicardo Garcia <rgarcia@igalia.com>
Fri, 28 May 2021 11:53:56 +0000 (13:53 +0200)
committerRicardo Garcia <rgarcia@igalia.com>
Fri, 28 May 2021 13:25:47 +0000 (15:25 +0200)
This commit fixes the following issues found in the swapchain tests:

- The initial image layout in some render passes did not match the
  actual image layout when starting the render pass.

- image_swapchain_create_info tests were using VK_KHR_bind_memory2
  functions without activating the extension on the device or making
  sure it was core in the used Vulkan API version.

- Many devices were being created with the wrong instance, using the
  context instance instead of the custom instance created for the tests.

- Several tests using VK_SHARING_MODE_CONCURRENT did not check for the
  availability of two queues or were always using one, which is invalid.

- VkDeviceGroupSwapchainCreateInfoKHR had a wrong sType.

- Swapchain resize tests were calling vkBeginCommandBuffer() on active
  command buffers without waiting for them to complete execution.

- Typos and other minor issues.

Affected tests:
dEQP-VK.wsi.*.swapchain.*

Components: Vulkan
VK-GL-CTS issue: 2941

Change-Id: I54d5f46cbcb76617260439a59bf3aef4028309bb

external/vulkancts/framework/vulkan/vkWsiUtil.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp

index ac5dafd..097af2d 100644 (file)
@@ -852,12 +852,17 @@ void WsiTriangleRenderer::recordFrame (VkCommandBuffer    cmdBuffer,
 
        if (m_explicitLayoutTransitions || m_attachmentLayouts[imageNdx] == VK_IMAGE_LAYOUT_UNDEFINED)
        {
-               VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
-               const VkImageMemoryBarrier      barrier = makeImageMemoryBarrier        (0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-                                                                                                                                                m_attachmentLayouts[imageNdx], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-                                                                                                                                                m_aliasImages[imageNdx], range);
-               m_vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &barrier);
-               m_attachmentLayouts[imageNdx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+               const auto range                = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+               const auto newLayout    = (m_explicitLayoutTransitions ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
+               const auto srcStage             = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+               const auto srcMask              = 0u;
+               const auto dstStage             = (m_explicitLayoutTransitions ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT : VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+               const auto dstMask              = (m_explicitLayoutTransitions ? VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT : 0);
+
+               const auto barrier = makeImageMemoryBarrier(srcMask, dstMask, m_attachmentLayouts[imageNdx], newLayout, m_aliasImages[imageNdx], range);
+               m_vkd.cmdPipelineBarrier(cmdBuffer, srcStage, dstStage, 0u, 0u, nullptr, 0u, nullptr, 1u, &barrier);
+
+               m_attachmentLayouts[imageNdx] = newLayout;
        }
 
        beginRenderPass(m_vkd, cmdBuffer, *m_renderPass, curFramebuffer, makeRect2D(0, 0, m_renderSize.x(), m_renderSize.y()), tcu::Vec4(0.125f, 0.25f, 0.75f, 1.0f));
@@ -899,12 +904,17 @@ void WsiTriangleRenderer::recordDeviceGroupFrame (VkCommandBuffer cmdBuffer,
 
        if (m_explicitLayoutTransitions || m_attachmentLayouts[imageNdx] == VK_IMAGE_LAYOUT_UNDEFINED)
        {
-               VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
-               const VkImageMemoryBarrier      barrier = makeImageMemoryBarrier        (0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-                                                                                                                                                m_attachmentLayouts[imageNdx], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-                                                                                                                                                m_aliasImages[imageNdx], range);
-               m_vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &barrier);
-               m_attachmentLayouts[imageNdx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+               const auto range                = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+               const auto newLayout    = (m_explicitLayoutTransitions ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
+               const auto srcStage             = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+               const auto srcMask              = 0u;
+               const auto dstStage             = (m_explicitLayoutTransitions ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT : VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+               const auto dstMask              = (m_explicitLayoutTransitions ? VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT : 0);
+
+               const auto barrier = makeImageMemoryBarrier(srcMask, dstMask, m_attachmentLayouts[imageNdx], newLayout, m_aliasImages[imageNdx], range);
+               m_vkd.cmdPipelineBarrier(cmdBuffer, srcStage, dstStage, 0u, 0u, nullptr, 0u, nullptr, 1u, &barrier);
+
+               m_attachmentLayouts[imageNdx] = newLayout;
        }
 
        // begin renderpass
index f239c44..8688a0e 100644 (file)
@@ -57,6 +57,7 @@
 
 #include <limits>
 #include <algorithm>
+#include <iterator>
 
 namespace vkt
 {
@@ -130,17 +131,19 @@ VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void)
 }
 
 Move<VkDevice> createDeviceWithWsi (const PlatformInterface&           vkp,
+                                                                       deUint32                                                apiVersion,
                                                                        VkInstance                                              instance,
                                                                        const InstanceInterface&                vki,
                                                                        VkPhysicalDevice                                physicalDevice,
                                                                        const Extensions&                               supportedExtensions,
+                                                                       const vector<string>&                   additionalExtensions,
                                                                        const vector<deUint32>&                 queueFamilyIndices,
                                                                        bool                                                    validationEnabled,
                                                                        const VkAllocationCallbacks*    pAllocator = DE_NULL)
 {
-       const float                                             queuePriorities[]       = { 1.0f };
-
+       const float                                             queuePriorities[] = { 1.0f };
        vector<VkDeviceQueueCreateInfo> queueInfos;
+
        for (const auto familyIndex : queueFamilyIndices)
        {
                const VkDeviceQueueCreateInfo info =
@@ -156,63 +159,64 @@ Move<VkDevice> createDeviceWithWsi (const PlatformInterface&              vkp,
                queueInfos.push_back(info);
        }
 
+       vector<string> extensions;
+       extensions.push_back("VK_KHR_swapchain");
+       extensions.insert(end(extensions), begin(additionalExtensions), end(additionalExtensions));
+
+       for (const auto& extName : extensions)
+       {
+               if (!isCoreDeviceExtension(apiVersion, extName) && !isExtensionSupported(supportedExtensions, RequiredExtension(extName)))
+                       TCU_THROW(NotSupportedError, extName + " is not supported");
+       }
+
        const void *                                    pNext                   = nullptr;
        const VkPhysicalDeviceFeatures  features                = getDeviceFeaturesForWsi();
 
-       VkDevicePrivateDataCreateInfoEXT pdci =
-       {
-               VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT,  // VkStructureType                       sType;
-               DE_NULL,                                                                                                // const void*                           pNext;
-               4u,                                                                                                             // uint32_t                              privateDataSlotRequestCount;
-       };
-       VkPhysicalDevicePrivateDataFeaturesEXT privateDataFeatures =
-       {
-               VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT,    // VkStructureType    sType;
-               &pdci,                                                                                                                  // void*              pNext;
-               VK_TRUE,                                                                                                                // VkBool32           privateData;
-       };
+       VkDevicePrivateDataCreateInfoEXT pdci = initVulkanStructure();
+       pdci.privateDataSlotRequestCount = 4u;
 
-       vector<const char*>                             extensions;
-       extensions.push_back("VK_KHR_swapchain");
-       if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_private_data")))
+       VkPhysicalDevicePrivateDataFeaturesEXT privateDataFeatures = initVulkanStructure(&pdci);
+       privateDataFeatures.privateData = VK_TRUE;
+
+       if (de::contains(begin(extensions), end(extensions), "VK_EXT_private_data"))
        {
-               extensions.push_back("VK_EXT_private_data");
                pNext = &privateDataFeatures;
        }
 
-       const VkDeviceCreateInfo                deviceParams    =
+       // Convert from std::vector<std::string> to std::vector<const char*>.
+       std::vector<const char*> extensionsChar;
+       extensionsChar.reserve(extensions.size());
+       std::transform(begin(extensions), end(extensions), std::back_inserter(extensionsChar), [](const std::string& s) { return s.c_str(); });
+
+       const VkDeviceCreateInfo deviceParams =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
                pNext,
                (VkDeviceCreateFlags)0,
                static_cast<deUint32>(queueInfos.size()),
                queueInfos.data(),
-               0u,                                                                     // enabledLayerCount
-               DE_NULL,                                                        // ppEnabledLayerNames
-               (deUint32)extensions.size(),            // enabledExtensionCount
-               &extensions[0],                                         // ppEnabledExtensionNames
+               0u,                                                                                             // enabledLayerCount
+               nullptr,                                                                                // ppEnabledLayerNames
+               static_cast<deUint32>(extensionsChar.size()),   // enabledExtensionCount
+               extensionsChar.data(),                                                  // ppEnabledExtensionNames
                &features
        };
 
-       for (int ndx = 0; ndx < (int)extensions.size(); ++ndx)
-       {
-               if (!isExtensionSupported(supportedExtensions, RequiredExtension(extensions[ndx])))
-                       TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
-       }
-
        return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 Move<VkDevice> createDeviceWithWsi (const PlatformInterface&           vkp,
+                                                                       deUint32                                                apiVersion,
                                                                        VkInstance                                              instance,
                                                                        const InstanceInterface&                vki,
                                                                        VkPhysicalDevice                                physicalDevice,
                                                                        const Extensions&                               supportedExtensions,
+                                                                       const vector<string>&                   additionalExtensions,
                                                                        const deUint32                                  queueFamilyIndex,
                                                                        bool                                                    validationEnabled,
                                                                        const VkAllocationCallbacks*    pAllocator = DE_NULL)
 {
-       return createDeviceWithWsi(vkp, instance, vki, physicalDevice, supportedExtensions, vector<deUint32>(1u, queueFamilyIndex), validationEnabled, pAllocator);
+       return createDeviceWithWsi(vkp, apiVersion, instance, vki, physicalDevice, supportedExtensions, additionalExtensions, vector<deUint32>(1u, queueFamilyIndex), validationEnabled, pAllocator);
 }
 
 struct InstanceHelper
@@ -256,18 +260,21 @@ struct DeviceHelper
                                  const InstanceInterface&              vki,
                                  VkInstance                                    instance,
                                  const vector<VkSurfaceKHR>&   surface,
+                                 const vector<string>&                 additionalExtensions = vector<string>(),
                                  const VkAllocationCallbacks*  pAllocator = DE_NULL)
                : physicalDevice        (chooseDevice(vki, instance, context.getTestContext().getCommandLine()))
                , queueFamilyIndex      (chooseQueueFamilyIndex(vki, physicalDevice, surface))
                , device                        (createDeviceWithWsi(context.getPlatformInterface(),
-                                                                                                context.getInstance(),
+                                                                                                context.getUsedApiVersion(),
+                                                                                                instance,
                                                                                                 vki,
                                                                                                 physicalDevice,
                                                                                                 enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
+                                                                                                additionalExtensions,
                                                                                                 queueFamilyIndex,
                                                                                                 context.getTestContext().getCommandLine().isValidationEnabled(),
                                                                                                 pAllocator))
-               , vkd                           (context.getPlatformInterface(), context.getInstance(), *device)
+               , vkd                           (context.getPlatformInterface(), instance, *device)
                , queue                         (getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
        {
        }
@@ -277,8 +284,9 @@ struct DeviceHelper
                                  const InstanceInterface&              vki,
                                  VkInstance                                    instance,
                                  VkSurfaceKHR                                  surface,
+                                 const vector<string>&                 additionalExtensions = vector<string>(),
                                  const VkAllocationCallbacks*  pAllocator = DE_NULL)
-               : DeviceHelper(context, vki, instance, vector<VkSurfaceKHR>(1u, surface), pAllocator)
+               : DeviceHelper(context, vki, instance, vector<VkSurfaceKHR>(1u, surface), additionalExtensions, pAllocator)
        {
        }
 };
@@ -295,18 +303,21 @@ struct MultiQueueDeviceHelper
                                                        const InstanceInterface&                vki,
                                                        VkInstance                                              instance,
                                                        const vector<VkSurfaceKHR>&             surface,
+                                                       const vector<string>&                   additionalExtensions = vector<string>(),
                                                        const VkAllocationCallbacks*    pAllocator = DE_NULL)
                : physicalDevice        (chooseDevice(vki, instance, context.getTestContext().getCommandLine()))
                , queueFamilyIndices(getCompatibleQueueFamilyIndices(vki, physicalDevice, surface))
                , device                        (createDeviceWithWsi(context.getPlatformInterface(),
-                                                                                                context.getInstance(),
+                                                                                                context.getUsedApiVersion(),
+                                                                                                instance,
                                                                                                 vki,
                                                                                                 physicalDevice,
                                                                                                 enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
+                                                                                                additionalExtensions,
                                                                                                 queueFamilyIndices,
                                                                                                 context.getTestContext().getCommandLine().isValidationEnabled(),
                                                                                                 pAllocator))
-               , vkd                           (context.getPlatformInterface(), context.getInstance(), *device)
+               , vkd                           (context.getPlatformInterface(), instance, *device)
        {
        }
 
@@ -315,8 +326,9 @@ struct MultiQueueDeviceHelper
                                                        const InstanceInterface&                vki,
                                                        VkInstance                                              instance,
                                                        VkSurfaceKHR                                    surface,
+                                                       const vector<string>                    additionalExtensions = vector<string>(),
                                                        const VkAllocationCallbacks*    pAllocator = DE_NULL)
-               : MultiQueueDeviceHelper(context, vki, instance, vector<VkSurfaceKHR>(1u, surface), pAllocator)
+               : MultiQueueDeviceHelper(context, vki, instance, vector<VkSurfaceKHR>(1u, surface), additionalExtensions, pAllocator)
        {
        }
 };
@@ -788,7 +800,8 @@ tcu::TestStatus createSwapchainPrivateDataTest (Context& context, TestParameters
        const InstanceHelper                                    instHelper      (context, params.wsiType);
        const NativeObjects                                             native          (context, instHelper.supportedExtensions, params.wsiType);
        const Unique<VkSurfaceKHR>                              surface         (createSurface(instHelper.vki, instHelper.instance, params.wsiType, native.getDisplay(), native.getWindow()));
-       const MultiQueueDeviceHelper                    devHelper       (context, instHelper.vki, instHelper.instance, *surface);
+       const vector<string>                                    extraExts       (1u, "VK_EXT_private_data");
+       const MultiQueueDeviceHelper                    devHelper       (context, instHelper.vki, instHelper.instance, *surface, extraExts);
        const vector<VkSwapchainCreateInfoKHR>  cases           (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
 
        for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
@@ -933,7 +946,7 @@ tcu::TestStatus createSwapchainSimulateOOMTest (Context& context, TestParameters
                                                                                                                                                        native.getDisplay(),
                                                                                                                                                        native.getWindow(),
                                                                                                                                                        failingAllocator.getCallbacks()));
-               const DeviceHelper                                              devHelper       (context, instHelper.vki, instHelper.instance, *surface, failingAllocator.getCallbacks());
+               const DeviceHelper                                              devHelper       (context, instHelper.vki, instHelper.instance, *surface, vector<string>(), failingAllocator.getCallbacks());
                const vector<VkSwapchainCreateInfoKHR>  allCases        (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
 
                if (maxCases < allCases.size())
@@ -955,6 +968,10 @@ tcu::TestStatus createSwapchainSimulateOOMTest (Context& context, TestParameters
                                {
                                        VkSwapchainCreateInfoKHR        curParams       = allCases[caseNdx];
 
+                                       // With concurrent sharing mode, at least two queues are needed.
+                                       if (curParams.imageSharingMode == VK_SHARING_MODE_CONCURRENT)
+                                               continue;
+
                                        curParams.surface                               = *surface;
                                        curParams.queueFamilyIndexCount = 1u;
                                        curParams.pQueueFamilyIndices   = &devHelper.queueFamilyIndex;
@@ -1002,7 +1019,7 @@ tcu::TestStatus testImageSwapchainCreateInfo (Context& context, Type wsiType)
                                                                                                                                   wsiType,
                                                                                                                                   native.getDisplay(),
                                                                                                                                   native.getWindow()));
-       const DeviceHelper                      devHelper                       (context, instHelper.vki, instHelper.instance, *surface);
+       const DeviceHelper                      devHelper                       (context, instHelper.vki, instHelper.instance, *surface, vector<string>(1u, "VK_KHR_bind_memory2"));
        const Extensions&                       deviceExtensions        = enumerateDeviceExtensionProperties(instHelper.vki, devHelper.physicalDevice, DE_NULL);
 
        // structures this tests checks were added in revision 69
@@ -1760,12 +1777,9 @@ tcu::TestStatus deviceGroupRenderTest (Context& context, Type wsiType)
        SimpleAllocator                                 allocator                                       (vkd, *groupDevice, getPhysicalDeviceMemoryProperties(instHelper.vki, physicalDevicesInGroup[deviceIdx]));
 
        // create swapchain for device group
-       struct VkDeviceGroupSwapchainCreateInfoKHR deviceGroupSwapchainInfo =
-       {
-               VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR,
-               DE_NULL,
-               VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR
-       };
+       VkDeviceGroupSwapchainCreateInfoKHR deviceGroupSwapchainInfo = initVulkanStructure();
+       deviceGroupSwapchainInfo.modes = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR;
+
        VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(wsiType,
                                                                                                                                                 instHelper.vki,
                                                                                                                                                 physicalDevicesInGroup[deviceIdx],
@@ -1954,7 +1968,7 @@ tcu::TestStatus deviceGroupRenderTest2 (Context& context, Type wsiType)
        const deUint32                                                                  deviceIndices[]                         = { firstDeviceID, secondDeviceID };
 
        if (physicalDevicesInGroupCount < 2)
-               TCU_THROW(NotSupportedError, "Test requires more then 1 device in device group");
+               TCU_THROW(NotSupportedError, "Test requires more than 1 device in device group");
 
        // create a device group
        const VkDeviceGroupDeviceCreateInfo groupDeviceInfo =
@@ -2386,7 +2400,7 @@ tcu::TestStatus resizeSwapchainTest (Context& context, Type wsiType)
                                                                                                                                                          *swapchain,
                                                                                                                                                          std::numeric_limits<deUint64>::max(),
                                                                                                                                                          imageReadySemaphore,
-                                                                                                                                                         imageReadyFence,
+                                                                                                                                                         DE_NULL,
                                                                                                                                                          &imageNdx);
 
                                        if (acquireResult == VK_SUBOPTIMAL_KHR)
@@ -2426,7 +2440,7 @@ tcu::TestStatus resizeSwapchainTest (Context& context, Type wsiType)
                                        };
 
                                        renderer.recordFrame(commandBuffer, imageNdx, frameNdx);
-                                       VK_CHECK(vkd.queueSubmit(devHelper.queue, 1u, &submitInfo, (VkFence)0));
+                                       VK_CHECK(vkd.queueSubmit(devHelper.queue, 1u, &submitInfo, imageReadyFence));
                                        VK_CHECK_WSI(vkd.queuePresentKHR(devHelper.queue, &presentInfo));
                                }
                        }