Merge vk-gl-cts/vulkan-cts-1.2.7 into vk-gl-cts/vulkan-cts-1.2.8
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / api / vktApiFeatureInfo.cpp
index 2ab1fbf..37aaf16 100644 (file)
@@ -2224,6 +2224,33 @@ tcu::TestStatus enumerateDeviceExtensions (Context& context)
        return tcu::TestStatus(results.getResult(), results.getMessage());
 }
 
+tcu::TestStatus extensionCoreVersions (Context& context)
+{
+       deUint32        major;
+       deUint32        minor;
+       const char*     extName;
+
+       auto&                                   log             = context.getTestContext().getLog();
+       tcu::ResultCollector    results (log);
+
+       const auto instanceExtensionProperties  = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL);
+       const auto deviceExtensionProperties    = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
+
+       for (const auto& majorMinorName : extensionRequiredCoreVersion)
+       {
+               std::tie(major, minor, extName) = majorMinorName;
+               const RequiredExtension reqExt (extName);
+
+               if ((isExtensionSupported(instanceExtensionProperties, reqExt) || isExtensionSupported(deviceExtensionProperties, reqExt)) &&
+                   !context.contextSupports(vk::ApiVersion(major, minor, 0u)))
+               {
+                       results.fail("Required core version for " + std::string(extName) + " not met (" + de::toString(major) + "." + de::toString(minor) + ")");
+               }
+       }
+
+       return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
 #define VK_SIZE_OF(STRUCT, MEMBER)                                     (sizeof(((STRUCT*)0)->MEMBER))
 #define OFFSET_TABLE_ENTRY(STRUCT, MEMBER)                     { (size_t)DE_OFFSET_OF(STRUCT, MEMBER), VK_SIZE_OF(STRUCT, MEMBER) }
 
@@ -3248,14 +3275,34 @@ VkFormatFeatureFlags getRequiredOptimalTilingFeatures (Context& context, VkForma
        }
 }
 
-bool requiresYCbCrConversion(VkFormat format)
+bool requiresYCbCrConversion(Context& context, VkFormat format)
 {
+       if (format == VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16)
+       {
+               if (!context.isDeviceFunctionalitySupported("VK_EXT_rgba10x6_formats"))
+                       return true;
+               VkPhysicalDeviceFeatures2                                               coreFeatures;
+               VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT      rgba10x6features;
+
+               deMemset(&coreFeatures, 0, sizeof(coreFeatures));
+               deMemset(&rgba10x6features, 0, sizeof(rgba10x6features));
+
+               coreFeatures.sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+               coreFeatures.pNext              = &rgba10x6features;
+               rgba10x6features.sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT;
+
+               const InstanceInterface &vk = context.getInstanceInterface();
+               vk.getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &coreFeatures);
+
+               return !rgba10x6features.formatRgba10x6WithoutYCbCrSampler;
+       }
+
        return isYCbCrFormat(format) &&
                        format != VK_FORMAT_R10X6_UNORM_PACK16 && format != VK_FORMAT_R10X6G10X6_UNORM_2PACK16 &&
                        format != VK_FORMAT_R12X4_UNORM_PACK16 && format != VK_FORMAT_R12X4G12X4_UNORM_2PACK16;
 }
 
-VkFormatFeatureFlags getAllowedOptimalTilingFeatures (VkFormat format)
+VkFormatFeatureFlags getAllowedOptimalTilingFeatures (Context &context, VkFormat format)
 {
        // YCbCr formats only support a subset of format feature flags
        const VkFormatFeatureFlags ycbcrAllows =
@@ -3276,7 +3323,7 @@ VkFormatFeatureFlags getAllowedOptimalTilingFeatures (VkFormat format)
        // By default everything is allowed.
        VkFormatFeatureFlags allow = (VkFormatFeatureFlags)~0u;
        // Formats for which SamplerYCbCrConversion is required may not support certain features.
-       if (requiresYCbCrConversion(format))
+       if (requiresYCbCrConversion(context, format))
                allow &= ycbcrAllows;
        // single-plane formats *may not* support DISJOINT_BIT
        if (!isYCbCrFormat(format) || getPlaneCount(format) == 1)
@@ -3285,10 +3332,10 @@ VkFormatFeatureFlags getAllowedOptimalTilingFeatures (VkFormat format)
        return allow;
 }
 
-VkFormatFeatureFlags getAllowedBufferFeatures (VkFormat format)
+VkFormatFeatureFlags getAllowedBufferFeatures (Context &context, VkFormat format)
 {
        // TODO: Do we allow non-buffer flags in the bufferFeatures?
-       return requiresYCbCrConversion(format) ? (VkFormatFeatureFlags)0 : (VkFormatFeatureFlags)(~VK_FORMAT_FEATURE_DISJOINT_BIT);
+       return requiresYCbCrConversion(context, format) ? (VkFormatFeatureFlags)0 : (VkFormatFeatureFlags)(~VK_FORMAT_FEATURE_DISJOINT_BIT);
 }
 
 tcu::TestStatus formatProperties (Context& context, VkFormat format)
@@ -3303,8 +3350,8 @@ tcu::TestStatus formatProperties (Context& context, VkFormat format)
 
        const VkFormatFeatureFlags reqImg       = getRequiredOptimalTilingFeatures(context, format);
        const VkFormatFeatureFlags reqBuf       = getRequiredBufferFeatures(format);
-       const VkFormatFeatureFlags allowImg     = getAllowedOptimalTilingFeatures(format);
-       const VkFormatFeatureFlags allowBuf     = getAllowedBufferFeatures(format);
+       const VkFormatFeatureFlags allowImg     = getAllowedOptimalTilingFeatures(context, format);
+       const VkFormatFeatureFlags allowBuf     = getAllowedBufferFeatures(context, format);
 
        const struct feature_req
        {
@@ -5699,6 +5746,14 @@ tcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx)
        infoTests->addChild(createTestGroup(testCtx, "image_format_properties", "VkGetPhysicalDeviceImageFormatProperties() Tests",     createImageFormatTests, imageFormatProperties));
 
        {
+               de::MovePtr<tcu::TestCaseGroup> extCoreVersionGrp (new tcu::TestCaseGroup(testCtx, "extension_core_versions", "Tests checking extension required core versions"));
+
+               addFunctionCase(extCoreVersionGrp.get(), "extension_core_versions", "", extensionCoreVersions);
+
+               infoTests->addChild(extCoreVersionGrp.release());
+       }
+
+       {
                de::MovePtr<tcu::TestCaseGroup> extendedPropertiesTests (new tcu::TestCaseGroup(testCtx, "get_physical_device_properties2", "VK_KHR_get_physical_device_properties2"));
 
                addFunctionCase(extendedPropertiesTests.get(), "features",                                      "Extended Device Features",                                     deviceFeatures2);