Fix checkImageSupport()
authorAlexander Galazin <alexander.galazin@arm.com>
Fri, 6 Oct 2017 22:27:45 +0000 (00:27 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Sat, 7 Oct 2017 15:49:15 +0000 (11:49 -0400)
Use proper getPhysicalDeviceFeatures2() to detect
samplerYcbcrConversion support.

Component: Vulkan

VK-GL-CTS issue: 755

Affects: dEQP-VK.ycbcr.*

Change-Id: I5e25eae7a1c25340e56eabb1ab6ca3709eb15399

external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp

index 5add903..1c6f17d 100644 (file)
@@ -196,9 +196,8 @@ void readStagingBuffers (MultiPlaneImageData*                       imageData,
 
 void checkImageSupport (Context& context, VkFormat format, VkImageCreateFlags createFlags, VkImageTiling tiling)
 {
-       const bool                                                                                                      disjoint        = (createFlags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0;
-       const VkPhysicalDeviceSamplerYcbcrConversionFeatures*           features        = findStructure<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(context.getDeviceFeatures2().pNext);
-       vector<string>                                                                                          reqExts;
+       const bool              disjoint        = (createFlags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0;
+       vector<string>  reqExts;
 
        if (!isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_sampler_ycbcr_conversion"))
                reqExts.push_back("VK_KHR_sampler_ycbcr_conversion");
@@ -213,12 +212,33 @@ void checkImageSupport (Context& context, VkFormat format, VkImageCreateFlags cr
 
        for (vector<string>::const_iterator extIter = reqExts.begin(); extIter != reqExts.end(); ++extIter)
        {
-               if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), *extIter))
+               if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), *extIter))
                        TCU_THROW(NotSupportedError, (*extIter + " is not supported").c_str());
        }
 
-       if (!features || features->samplerYcbcrConversion == VK_FALSE)
-               TCU_THROW(NotSupportedError, "samplerYcbcrConversion is not supported");
+       {
+               vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures              ycbcrFeature    =
+               {
+                       vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
+                       DE_NULL,
+                       VK_FALSE
+               };
+
+               vk::VkPhysicalDeviceFeatures                                    features;
+               deMemset(&features, 0, sizeof(vk::VkPhysicalDeviceFeatures));
+
+               vk::VkPhysicalDeviceFeatures2                           featuresExt             =
+               {
+                       vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
+                       &ycbcrFeature,
+                       features
+               };
+
+               context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &featuresExt);
+
+               if (ycbcrFeature.samplerYcbcrConversion == VK_FALSE)
+                       TCU_THROW(NotSupportedError, "samplerYcbcrConversion is not supported");
+       }
 
        {
                const VkFormatProperties        formatProperties        = getPhysicalDeviceFormatProperties(context.getInstanceInterface(),