Add tests for VK_EXT_image_compression_control_swapchain
authorVidar Lilleboe <vidar.lillebo@arm.com>
Tue, 5 Apr 2022 15:07:03 +0000 (17:07 +0200)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Fri, 22 Jul 2022 15:14:12 +0000 (15:14 +0000)
Add tests for creating swapchain images with image compression control
extension.

New Tests:
dEQP-VK.api.image_compression_control.swapchain.*

Components: Vulkan
VK-GL-CTS issue: 3379

Change-Id: I9060110bf5af847109a87ffd35e061583b8ae9d4

android/cts/main/vk-master-2022-03-01/api.txt
android/cts/main/vk-master/api.txt
external/vulkancts/framework/vulkan/generated/vulkan/vkMandatoryFeatures.inl
external/vulkancts/modules/vulkan/api/vktApiImageCompressionControlTests.cpp
external/vulkancts/mustpass/main/vk-default/api.txt
external/vulkancts/scripts/src/extensions/VK_EXT_image_compression_control_swapchain.json [new file with mode: 0644]

index adfebbf..c43449c 100644 (file)
@@ -857,6 +857,34 @@ dEQP-VK.api.image_compression_control.android_hardware_buffer.default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.fixed_rate_default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.disabled
 dEQP-VK.api.image_compression_control.android_hardware_buffer.explicit
+dEQP-VK.api.image_compression_control.swapchain.xlib.default
+dEQP-VK.api.image_compression_control.swapchain.xlib.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xlib.disabled
+dEQP-VK.api.image_compression_control.swapchain.xlib.explicit
+dEQP-VK.api.image_compression_control.swapchain.xcb.default
+dEQP-VK.api.image_compression_control.swapchain.xcb.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xcb.disabled
+dEQP-VK.api.image_compression_control.swapchain.xcb.explicit
+dEQP-VK.api.image_compression_control.swapchain.wayland.default
+dEQP-VK.api.image_compression_control.swapchain.wayland.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.wayland.disabled
+dEQP-VK.api.image_compression_control.swapchain.wayland.explicit
+dEQP-VK.api.image_compression_control.swapchain.android.default
+dEQP-VK.api.image_compression_control.swapchain.android.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.android.disabled
+dEQP-VK.api.image_compression_control.swapchain.android.explicit
+dEQP-VK.api.image_compression_control.swapchain.win32.default
+dEQP-VK.api.image_compression_control.swapchain.win32.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.win32.disabled
+dEQP-VK.api.image_compression_control.swapchain.win32.explicit
+dEQP-VK.api.image_compression_control.swapchain.macos.default
+dEQP-VK.api.image_compression_control.swapchain.macos.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.macos.disabled
+dEQP-VK.api.image_compression_control.swapchain.macos.explicit
+dEQP-VK.api.image_compression_control.swapchain.headless.default
+dEQP-VK.api.image_compression_control.swapchain.headless.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.headless.disabled
+dEQP-VK.api.image_compression_control.swapchain.headless.explicit
 dEQP-VK.api.format_feature_flags2.r4g4_unorm_pack8
 dEQP-VK.api.format_feature_flags2.r4g4b4a4_unorm_pack16
 dEQP-VK.api.format_feature_flags2.b4g4r4a4_unorm_pack16
index 13d278d..87cd84c 100644 (file)
@@ -5111,6 +5111,34 @@ dEQP-VK.api.image_compression_control.android_hardware_buffer.default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.fixed_rate_default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.disabled
 dEQP-VK.api.image_compression_control.android_hardware_buffer.explicit
+dEQP-VK.api.image_compression_control.swapchain.xlib.default
+dEQP-VK.api.image_compression_control.swapchain.xlib.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xlib.disabled
+dEQP-VK.api.image_compression_control.swapchain.xlib.explicit
+dEQP-VK.api.image_compression_control.swapchain.xcb.default
+dEQP-VK.api.image_compression_control.swapchain.xcb.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xcb.disabled
+dEQP-VK.api.image_compression_control.swapchain.xcb.explicit
+dEQP-VK.api.image_compression_control.swapchain.wayland.default
+dEQP-VK.api.image_compression_control.swapchain.wayland.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.wayland.disabled
+dEQP-VK.api.image_compression_control.swapchain.wayland.explicit
+dEQP-VK.api.image_compression_control.swapchain.android.default
+dEQP-VK.api.image_compression_control.swapchain.android.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.android.disabled
+dEQP-VK.api.image_compression_control.swapchain.android.explicit
+dEQP-VK.api.image_compression_control.swapchain.win32.default
+dEQP-VK.api.image_compression_control.swapchain.win32.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.win32.disabled
+dEQP-VK.api.image_compression_control.swapchain.win32.explicit
+dEQP-VK.api.image_compression_control.swapchain.macos.default
+dEQP-VK.api.image_compression_control.swapchain.macos.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.macos.disabled
+dEQP-VK.api.image_compression_control.swapchain.macos.explicit
+dEQP-VK.api.image_compression_control.swapchain.headless.default
+dEQP-VK.api.image_compression_control.swapchain.headless.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.headless.disabled
+dEQP-VK.api.image_compression_control.swapchain.headless.explicit
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8_multiple_subresourcerange
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8_clamp_input
index 3e0035e..c6f9206 100644 (file)
@@ -202,6 +202,16 @@ bool checkMandatoryFeatures(const vkt::Context& context)
                nextPtr  = &physicalDeviceImageCompressionControlFeaturesEXT.pNext;
        }
 
+       vk::VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT physicalDeviceImageCompressionControlSwapchainFeaturesEXT;
+       deMemset(&physicalDeviceImageCompressionControlSwapchainFeaturesEXT, 0, sizeof(physicalDeviceImageCompressionControlSwapchainFeaturesEXT));
+
+       if ( isExtensionStructSupported(deviceExtensions, RequiredExtension("VK_EXT_image_compression_control")) )
+       {
+               physicalDeviceImageCompressionControlSwapchainFeaturesEXT.sType = getStructureType<VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>();
+               *nextPtr = &physicalDeviceImageCompressionControlSwapchainFeaturesEXT;
+               nextPtr  = &physicalDeviceImageCompressionControlSwapchainFeaturesEXT.pNext;
+       }
+
        vk::VkPhysicalDeviceImagelessFramebufferFeatures physicalDeviceImagelessFramebufferFeatures;
        deMemset(&physicalDeviceImagelessFramebufferFeatures, 0, sizeof(physicalDeviceImagelessFramebufferFeatures));
 
@@ -1117,6 +1127,15 @@ bool checkMandatoryFeatures(const vkt::Context& context)
                }
        }
 
+       if ( isExtensionStructSupported(deviceExtensions, RequiredExtension("VK_EXT_image_compression_control")) && isExtensionStructSupported(deviceExtensions, RequiredExtension("VK_EXT_image_compression_control_swapchain")) )
+       {
+               if ( physicalDeviceImageCompressionControlSwapchainFeaturesEXT.imageCompressionControlSwapchain == VK_FALSE )
+               {
+                       log << tcu::TestLog::Message << "Mandatory feature imageCompressionControlSwapchain not supported" << tcu::TestLog::EndMessage;
+                       result = false;
+               }
+       }
+
        if ( isExtensionStructSupported(deviceExtensions, RequiredExtension("VK_EXT_index_type_uint8")) )
        {
                if ( physicalDeviceIndexTypeUint8FeaturesEXT.indexTypeUint8 == VK_FALSE )
index 78c629c..97b3c22 100644 (file)
 #include "vktTestCase.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "wsi/vktNativeObjectsUtil.hpp"
 
 #include "vkDeviceUtil.hpp"
 #include "vkImageUtil.hpp"
 #include "vkQueryUtil.hpp"
 #include "vkRefUtil.hpp"
+#include "vkWsiUtil.hpp"
 
 #include "deString.h"
 #include "deStringUtil.hpp"
 #include <vector>
 
 using namespace vk;
+using namespace vk::wsi;
 using namespace std;
 
+typedef vector<VkExtensionProperties> Extensions;
+
 namespace vkt
 {
 
@@ -69,29 +74,33 @@ struct TestParams
        VkFormat                                         format;
        bool                                             useExtension;
        VkImageCompressionControlEXT control;
+       Type                                             wsiType;
 };
 
-static void checkImageCompressionControlSupport(Context& context)
+static void checkImageCompressionControlSupport(Context& context, bool swapchain = false)
 {
        context.requireDeviceFunctionality("VK_EXT_image_compression_control");
-       vk::VkPhysicalDeviceImageCompressionControlFeaturesEXT imageCompressionControlFeatures{};
-       imageCompressionControlFeatures.sType =
-               vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT;
-       imageCompressionControlFeatures.pNext = DE_NULL;
-
-       vk::VkPhysicalDeviceFeatures2 features2{};
-       features2.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
-       features2.pNext = &imageCompressionControlFeatures;
+       vk::VkPhysicalDeviceImageCompressionControlFeaturesEXT imageCompressionControlFeatures    = initVulkanStructure();
+       vk::VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT imageCompressionSwapchain = initVulkanStructure();
+       vk::VkPhysicalDeviceFeatures2 features2 = initVulkanStructure(&imageCompressionControlFeatures);
+       if (swapchain)
+       {
+               context.requireDeviceFunctionality("VK_EXT_image_compression_control_swapchain");
+               imageCompressionControlFeatures.pNext = &imageCompressionSwapchain;
+       }
 
        context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features2);
 
        if (!imageCompressionControlFeatures.imageCompressionControl)
                TCU_THROW(NotSupportedError, "VK_EXT_image_compression_control Image "
                                                                         "compression control feature not supported.");
+       if (swapchain && !imageCompressionSwapchain.imageCompressionControlSwapchain)
+               TCU_THROW(NotSupportedError, "VK_EXT_image_compression_control_swapchain Image "
+                                                                        "compression control feature for swapchains not supported.");
 }
 
-static void validate(Context& context, tcu::ResultCollector& results, VkDevice device, TestParams& testParams,
-                                        VkImage image)
+static void validate(const InstanceInterface& vki, const DeviceInterface& vkd, tcu::ResultCollector& results,
+                                        VkPhysicalDevice physicalDevice, VkDevice device, TestParams& testParams, VkImage image)
 {
 
        for (unsigned planeIndex = 0; planeIndex < testParams.control.compressionControlPlaneCount; planeIndex++)
@@ -105,18 +114,19 @@ static void validate(Context& context, tcu::ResultCollector& results, VkDevice d
                }
 
                VkImageCompressionPropertiesEXT compressionProperties = initVulkanStructure();
-               VkImageSubresource2EXT subresource = initVulkanStructure();
-               subresource.imageSubresource.aspectMask = aspect;
-               VkSubresourceLayout2EXT subresourceLayout = initVulkanStructure(&compressionProperties);
-               context.getDeviceInterface().getImageSubresourceLayout2EXT(device, image, &subresource, &subresourceLayout);
-
-
-               VkImageCompressionControlEXT compressionEnabled = initVulkanStructure();
-               compressionEnabled.compressionControlPlaneCount = testParams.control.compressionControlPlaneCount;
-               compressionEnabled.flags = testParams.control.flags;
-               VkImageCompressionFixedRateFlagsEXT fixedRateFlags[3] = { VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT,
-                                                                                                       VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT,
-                                                                                                       VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT };
+               VkImageSubresource2EXT                  subresource                       = initVulkanStructure();
+               subresource.imageSubresource.aspectMask                           = aspect;
+               VkSubresourceLayout2EXT subresourceLayout                         = initVulkanStructure(&compressionProperties);
+               vkd.getImageSubresourceLayout2EXT(device, image, &subresource, &subresourceLayout);
+
+               VkImageCompressionControlEXT compressionEnabled           = initVulkanStructure();
+               compressionEnabled.compressionControlPlaneCount           = testParams.control.compressionControlPlaneCount;
+               compressionEnabled.flags                                                          = testParams.control.flags;
+               VkImageCompressionFixedRateFlagsEXT fixedRateFlags[3] = {
+                       VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT,
+                       VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT,
+                       VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT
+               };
                compressionEnabled.pFixedRateFlags = fixedRateFlags;
 
                VkPhysicalDeviceImageFormatInfo2 formatInfo = initVulkanStructure(&compressionEnabled);
@@ -128,8 +138,7 @@ static void validate(Context& context, tcu::ResultCollector& results, VkDevice d
                VkImageCompressionPropertiesEXT compressionPropertiesSupported = initVulkanStructure();
                VkImageFormatProperties2                properties2 = initVulkanStructure(&compressionPropertiesSupported);
 
-               context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &formatInfo,
-                                                                                                                                                          &properties2);
+               vki.getPhysicalDeviceImageFormatProperties2(physicalDevice, &formatInfo, &properties2);
 
                if (testParams.useExtension)
                {
@@ -263,7 +272,8 @@ static tcu::TestStatus ahbImageCreateTest(Context& context, TestParams testParam
                        VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, image.get());
 
                VK_CHECK(vkd.bindImageMemory(device, image.get(), memory.get(), 0u));
-               validate(context, results, context.getDevice(), testParams, image.get());
+               validate(context.getInstanceInterface(), context.getDeviceInterface(), results, context.getPhysicalDevice(),
+                                context.getDevice(), testParams, image.get());
        }
        return tcu::TestStatus(results.getResult(), results.getMessage());
 }
@@ -317,7 +327,8 @@ static tcu::TestStatus imageCreateTest(Context& context, TestParams testParams)
 
                Move<VkImage> image = createImage(context.getDeviceInterface(), device, &imageCreateInfo);
 
-               validate(context, results, context.getDevice(), testParams, image.get());
+               validate(context.getInstanceInterface(), context.getDeviceInterface(), results, context.getPhysicalDevice(),
+                                context.getDevice(), testParams, image.get());
        }
        return tcu::TestStatus(results.getResult(), results.getMessage());
 }
@@ -358,6 +369,215 @@ void addImageCompressionControlTests(tcu::TestCaseGroup* group, TestParams testP
        }
 }
 
+CustomInstance createInstanceWithWsi(Context& context, Type wsiType, const vector<string> extraExtensions,
+                                                                        const VkAllocationCallbacks* pAllocator = DE_NULL)
+{
+       const deUint32 version    = context.getUsedApiVersion();
+       vector<string> extensions = extraExtensions;
+
+       extensions.push_back("VK_KHR_surface");
+       extensions.push_back(getExtensionName(wsiType));
+
+       vector<string> instanceExtensions;
+       for (const auto& ext : extensions)
+       {
+               if (!context.isInstanceFunctionalitySupported(ext))
+                       TCU_THROW(NotSupportedError, (ext + " is not supported").c_str());
+
+               if (!isCoreInstanceExtension(version, ext))
+                       instanceExtensions.push_back(ext);
+       }
+
+       return vkt::createCustomInstanceWithExtensions(context, instanceExtensions, pAllocator);
+}
+struct InstanceHelper
+{
+       const vector<VkExtensionProperties> supportedExtensions;
+       CustomInstance                                          instance;
+       const InstanceDriver&                           vki;
+
+       InstanceHelper(Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
+               : supportedExtensions(enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL))
+               , instance(createInstanceWithWsi(context, wsiType, vector<string>(), pAllocator))
+               , vki(instance.getDriver())
+       {
+       }
+
+       InstanceHelper(Context& context, Type wsiType, const vector<string>& extensions,
+                                  const VkAllocationCallbacks* pAllocator = DE_NULL)
+               : supportedExtensions(enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL))
+               , instance(createInstanceWithWsi(context, wsiType, extensions, pAllocator))
+               , vki(instance.getDriver())
+       {
+       }
+};
+
+Move<VkDevice> createDeviceWithWsi(const PlatformInterface& vkp, deUint32 apiVersion, VkInstance instance,
+                                                                  const InstanceInterface& vki, VkPhysicalDevice physicalDevice,
+                                                                  const Extensions& supportedExtensions, const vector<string>& additionalExtensions,
+                                                                  deUint32 queueFamilyIndex, bool validationEnabled,
+                                                                  const VkAllocationCallbacks* pAllocator = DE_NULL)
+{
+       const float                                       queuePriorities[] = { 1.0f };
+       const VkDeviceQueueCreateInfo queueInfo                 = {
+               VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+               nullptr,
+               (VkDeviceQueueCreateFlags)0,
+               queueFamilyIndex,
+               DE_LENGTH_OF_ARRAY(queuePriorities),
+               &queuePriorities[0],
+       };
+
+       vector<string> extensions;
+       extensions.push_back("VK_KHR_swapchain");
+       extensions.push_back("VK_EXT_image_compression_control");
+       extensions.push_back("VK_EXT_image_compression_control_swapchain");
+       extensions.insert(end(extensions), begin(additionalExtensions), end(additionalExtensions));
+
+       for (const auto& extName : extensions)
+       {
+               if (!isCoreDeviceExtension(apiVersion, extName) &&
+                       !isExtensionStructSupported(supportedExtensions, RequiredExtension(extName)))
+                       TCU_THROW(NotSupportedError, extName + " is not supported");
+       }
+
+       const void*                                        pNext        = nullptr;
+       const VkPhysicalDeviceFeatures features = {};
+
+       // 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,
+                                                                                         1u,
+                                                                                         &queueInfo,
+                                                                                         0u,                                                                                   // enabledLayerCount
+                                                                                         nullptr,                                                                              // ppEnabledLayerNames
+                                                                                         static_cast<deUint32>(extensionsChar.size()), // enabledExtensionCount
+                                                                                         extensionsChar.data(),                                                // ppEnabledExtensionNames
+                                                                                         &features };
+
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+}
+
+struct DeviceHelper
+{
+       const VkPhysicalDevice physicalDevice;
+       const deUint32             queueFamilyIndex;
+       const Unique<VkDevice> device;
+       const DeviceDriver         vkd;
+       const VkQueue              queue;
+
+       DeviceHelper(Context& context, 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.getUsedApiVersion(), instance, vki,
+                                                                        physicalDevice, enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
+                                                                        additionalExtensions, queueFamilyIndex,
+                                                                        context.getTestContext().getCommandLine().isValidationEnabled(), pAllocator))
+               , vkd(context.getPlatformInterface(), instance, *device)
+               , queue(getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
+       {
+       }
+
+       // Single-surface shortcut.
+       DeviceHelper(Context& context, 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), additionalExtensions, pAllocator)
+       {
+       }
+};
+static tcu::TestStatus swapchainCreateTest(Context& context, TestParams testParams)
+{
+       checkImageCompressionControlSupport(context, true);
+
+       tcu::TestLog&            log = context.getTestContext().getLog();
+       tcu::ResultCollector results(log);
+
+       const InstanceHelper     instHelper(context, testParams.wsiType);
+       const wsi::NativeObjects native(context, instHelper.supportedExtensions, testParams.wsiType);
+
+       VkExtent2D                                                      extent2d = { 16, 16 };
+       VkImageCompressionFixedRateFlagsEXT planeFlags[3]{};
+
+       for (unsigned i{}; i < (testParams.control.flags == VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT ? 24 : 1); i++)
+       {
+               planeFlags[0] ^= 3 << i;
+               if (testParams.control.flags == VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT)
+               {
+                       testParams.control.pFixedRateFlags = planeFlags;
+               }
+
+               const Unique<VkSurfaceKHR> surface(createSurface(instHelper.vki, instHelper.instance, testParams.wsiType,
+                                                                                                                native.getDisplay(), native.getWindow()));
+
+               const DeviceHelper devHelper(context, instHelper.vki, instHelper.instance, *surface, vector<string>());
+
+               VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo = initVulkanStructure();
+               VkSurfaceCapabilities2KHR               caps            = initVulkanStructure();
+               surfaceInfo.surface                                                     = surface.get();
+
+               instHelper.vki.getPhysicalDeviceSurfaceCapabilities2KHR(devHelper.physicalDevice, &surfaceInfo, &caps);
+
+               deUint32 numFormats;
+               instHelper.vki.getPhysicalDeviceSurfaceFormats2KHR(devHelper.physicalDevice, &surfaceInfo, &numFormats,
+                                                                                                                  nullptr);
+
+               vector<VkSurfaceFormat2KHR> formats(numFormats);
+               for (auto& surfaceFormat : formats)
+               {
+                       surfaceFormat = initVulkanStructure();
+               }
+
+               instHelper.vki.getPhysicalDeviceSurfaceFormats2KHR(devHelper.physicalDevice, &surfaceInfo, &numFormats,
+                                                                                                                  formats.data());
+
+               deUint32 queueFamilyIndex = devHelper.queueFamilyIndex;
+
+               for (auto& format : formats)
+               {
+                       testParams.format = format.surfaceFormat.format;
+
+                       VkSwapchainCreateInfoKHR swapchainInfo = initVulkanStructure();
+                       swapchainInfo.surface                              = surface.get();
+                       swapchainInfo.minImageCount                        = caps.surfaceCapabilities.minImageCount;
+                       swapchainInfo.imageFormat                          = format.surfaceFormat.format;
+                       swapchainInfo.imageColorSpace              = format.surfaceFormat.colorSpace;
+                       swapchainInfo.imageExtent                          = extent2d;
+                       swapchainInfo.imageArrayLayers             = 1;
+                       swapchainInfo.imageUsage                           = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+                       swapchainInfo.imageSharingMode             = VK_SHARING_MODE_EXCLUSIVE;
+                       swapchainInfo.queueFamilyIndexCount        = 1;
+                       swapchainInfo.pQueueFamilyIndices          = &queueFamilyIndex;
+                       swapchainInfo.preTransform                         = caps.surfaceCapabilities.currentTransform;
+                       swapchainInfo.compositeAlpha               = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
+                       swapchainInfo.presentMode                          = VK_PRESENT_MODE_FIFO_KHR;
+                       swapchainInfo.clipped                              = VK_TRUE;
+
+                       swapchainInfo.pNext = &testParams.control;
+
+                       Move<VkSwapchainKHR> swapchain = createSwapchainKHR(devHelper.vkd, devHelper.device.get(), &swapchainInfo);
+
+                       deUint32 imageCount = 0;
+                       devHelper.vkd.getSwapchainImagesKHR(devHelper.device.get(), swapchain.get(), &imageCount, nullptr);
+                       vector<VkImage> images(imageCount);
+                       devHelper.vkd.getSwapchainImagesKHR(devHelper.device.get(), swapchain.get(), &imageCount, images.data());
+
+                       validate(instHelper.vki, devHelper.vkd, results, devHelper.physicalDevice, devHelper.device.get(),
+                                        testParams, images[0]);
+               }
+       }
+
+       return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
 tcu::TestCaseGroup* createImageCompressionControlTests(tcu::TestContext& testCtx)
 {
        de::MovePtr<tcu::TestCaseGroup> group(
@@ -406,6 +626,23 @@ tcu::TestCaseGroup* createImageCompressionControlTests(tcu::TestContext& testCtx
        }
        group->addChild(subgroup);
 
+       subgroup = new tcu::TestCaseGroup(testCtx, "swapchain", "swapchain");
+       for (int typeNdx = 0; typeNdx < vk::wsi::TYPE_LAST; ++typeNdx)
+       {
+               const vk::wsi::Type wsiType = (vk::wsi::Type)typeNdx;
+               testParams.wsiType                      = wsiType;
+
+               tcu::TestCaseGroup* wsi_subgroup(new tcu::TestCaseGroup(testCtx, getName(wsiType), "Swapchain tests"));
+
+               for (auto& flag : compression_flags)
+               {
+                       testParams.control.flags = flag.flag;
+                       addFunctionCase(wsi_subgroup, flag.name, flag.name, swapchainCreateTest, testParams);
+               }
+               subgroup->addChild(wsi_subgroup);
+       }
+       group->addChild(subgroup);
+
        return group.release();
 }
 
index 2993cdc..c7994d2 100644 (file)
@@ -5108,6 +5108,34 @@ dEQP-VK.api.image_compression_control.android_hardware_buffer.default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.fixed_rate_default
 dEQP-VK.api.image_compression_control.android_hardware_buffer.disabled
 dEQP-VK.api.image_compression_control.android_hardware_buffer.explicit
+dEQP-VK.api.image_compression_control.swapchain.xlib.default
+dEQP-VK.api.image_compression_control.swapchain.xlib.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xlib.disabled
+dEQP-VK.api.image_compression_control.swapchain.xlib.explicit
+dEQP-VK.api.image_compression_control.swapchain.xcb.default
+dEQP-VK.api.image_compression_control.swapchain.xcb.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.xcb.disabled
+dEQP-VK.api.image_compression_control.swapchain.xcb.explicit
+dEQP-VK.api.image_compression_control.swapchain.wayland.default
+dEQP-VK.api.image_compression_control.swapchain.wayland.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.wayland.disabled
+dEQP-VK.api.image_compression_control.swapchain.wayland.explicit
+dEQP-VK.api.image_compression_control.swapchain.android.default
+dEQP-VK.api.image_compression_control.swapchain.android.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.android.disabled
+dEQP-VK.api.image_compression_control.swapchain.android.explicit
+dEQP-VK.api.image_compression_control.swapchain.win32.default
+dEQP-VK.api.image_compression_control.swapchain.win32.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.win32.disabled
+dEQP-VK.api.image_compression_control.swapchain.win32.explicit
+dEQP-VK.api.image_compression_control.swapchain.macos.default
+dEQP-VK.api.image_compression_control.swapchain.macos.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.macos.disabled
+dEQP-VK.api.image_compression_control.swapchain.macos.explicit
+dEQP-VK.api.image_compression_control.swapchain.headless.default
+dEQP-VK.api.image_compression_control.swapchain.headless.fixed_rate_default
+dEQP-VK.api.image_compression_control.swapchain.headless.disabled
+dEQP-VK.api.image_compression_control.swapchain.headless.explicit
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8_multiple_subresourcerange
 dEQP-VK.api.image_clearing.core.clear_color_image.1d.optimal.single_layer.r4g4_unorm_pack8_clamp_input
diff --git a/external/vulkancts/scripts/src/extensions/VK_EXT_image_compression_control_swapchain.json b/external/vulkancts/scripts/src/extensions/VK_EXT_image_compression_control_swapchain.json
new file mode 100644 (file)
index 0000000..6a47fa8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "mandatory_features":
+       {
+               "VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT":
+               [
+                       { "features": ["imageCompressionControlSwapchain"],     "requirements": ["VK_EXT_image_compression_control", "VK_EXT_image_compression_control_swapchain"]      }
+               ]
+       }
+}