From fa9555b15fc8216794e73a9c20a6988a7e3b8e95 Mon Sep 17 00:00:00 2001 From: Ricardo Garcia Date: Fri, 28 May 2021 13:53:56 +0200 Subject: [PATCH] Fix several issues in swapchain tests 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 | 34 ++++--- .../modules/vulkan/wsi/vktWsiSwapchainTests.cpp | 110 ++++++++++++--------- 2 files changed, 84 insertions(+), 60 deletions(-) diff --git a/external/vulkancts/framework/vulkan/vkWsiUtil.cpp b/external/vulkancts/framework/vulkan/vkWsiUtil.cpp index ac5dafd..097af2d 100644 --- a/external/vulkancts/framework/vulkan/vkWsiUtil.cpp +++ b/external/vulkancts/framework/vulkan/vkWsiUtil.cpp @@ -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 diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp index f239c44..8688a0e 100644 --- a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp +++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp @@ -57,6 +57,7 @@ #include #include +#include namespace vkt { @@ -130,17 +131,19 @@ VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void) } Move createDeviceWithWsi (const PlatformInterface& vkp, + deUint32 apiVersion, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const Extensions& supportedExtensions, + const vector& additionalExtensions, const vector& queueFamilyIndices, bool validationEnabled, const VkAllocationCallbacks* pAllocator = DE_NULL) { - const float queuePriorities[] = { 1.0f }; - + const float queuePriorities[] = { 1.0f }; vector queueInfos; + for (const auto familyIndex : queueFamilyIndices) { const VkDeviceQueueCreateInfo info = @@ -156,63 +159,64 @@ Move createDeviceWithWsi (const PlatformInterface& vkp, queueInfos.push_back(info); } + vector 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 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 to std::vector. + std::vector 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(queueInfos.size()), queueInfos.data(), - 0u, // enabledLayerCount - DE_NULL, // ppEnabledLayerNames - (deUint32)extensions.size(), // enabledExtensionCount - &extensions[0], // ppEnabledExtensionNames + 0u, // enabledLayerCount + nullptr, // ppEnabledLayerNames + static_cast(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 createDeviceWithWsi (const PlatformInterface& vkp, + deUint32 apiVersion, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const Extensions& supportedExtensions, + const vector& additionalExtensions, const deUint32 queueFamilyIndex, bool validationEnabled, const VkAllocationCallbacks* pAllocator = DE_NULL) { - return createDeviceWithWsi(vkp, instance, vki, physicalDevice, supportedExtensions, vector(1u, queueFamilyIndex), validationEnabled, pAllocator); + return createDeviceWithWsi(vkp, apiVersion, instance, vki, physicalDevice, supportedExtensions, additionalExtensions, vector(1u, queueFamilyIndex), validationEnabled, pAllocator); } struct InstanceHelper @@ -256,18 +260,21 @@ struct DeviceHelper const InstanceInterface& vki, VkInstance instance, const vector& surface, + const vector& additionalExtensions = vector(), 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& additionalExtensions = vector(), const VkAllocationCallbacks* pAllocator = DE_NULL) - : DeviceHelper(context, vki, instance, vector(1u, surface), pAllocator) + : DeviceHelper(context, vki, instance, vector(1u, surface), additionalExtensions, pAllocator) { } }; @@ -295,18 +303,21 @@ struct MultiQueueDeviceHelper const InstanceInterface& vki, VkInstance instance, const vector& surface, + const vector& additionalExtensions = vector(), 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 additionalExtensions = vector(), const VkAllocationCallbacks* pAllocator = DE_NULL) - : MultiQueueDeviceHelper(context, vki, instance, vector(1u, surface), pAllocator) + : MultiQueueDeviceHelper(context, vki, instance, vector(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 surface (createSurface(instHelper.vki, instHelper.instance, params.wsiType, native.getDisplay(), native.getWindow())); - const MultiQueueDeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface); + const vector extraExts (1u, "VK_EXT_private_data"); + const MultiQueueDeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface, extraExts); const vector 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(), failingAllocator.getCallbacks()); const vector 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(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::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)); } } -- 2.7.4