dEQP-VK.ycbcr.* tests throw NotSupported incorrectly
authorMarcin Rogucki <marcin.rogucki@mobica.com>
Mon, 9 Oct 2017 13:56:44 +0000 (15:56 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Tue, 10 Oct 2017 18:15:04 +0000 (14:15 -0400)
Generic way of checking samplerYcbcrConversion support
added to DefaultDevice and Context.
Used in dEQP-VK.ycbcr.* tests group in checkImageSupport() function.

Component: Vulkan

VK-GL-CTS issue: 755

Affects: dEQP-VK.ycbcr.*

Change-Id: I0774a476f7ed94351c00387bc2e75d9c09492970

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

index ed71e93..08cd185 100644 (file)
@@ -266,35 +266,31 @@ Move<VkDevice> createDefaultDevice (const InstanceInterface&                      vki,
 
 bool isPhysicalDeviceFeatures2Supported (const deUint32 version, const vector<string>& instanceExtensions)
 {
-       return isInstanceExtensionSupported(version, instanceExtensions, "VK_KHR_get_physical_device_properties");
+       return isInstanceExtensionSupported(version, instanceExtensions, "VK_KHR_get_physical_device_properties2");
 }
 
-struct DeviceFeatures
+class DeviceFeatures
 {
+public:
        VkPhysicalDeviceFeatures2                                               coreFeatures;
        VkPhysicalDeviceSamplerYcbcrConversionFeatures  samplerYCbCrConversionFeatures;
 
        DeviceFeatures (const InstanceInterface&        vki,
                                        const deUint32                          apiVersion,
-                                       VkPhysicalDevice                        physicalDevice,
+                                       const VkPhysicalDevice&         physicalDevice,
                                        const vector<string>&           instanceExtensions,
                                        const vector<string>&           deviceExtensions)
        {
-               void**  curExtPoint             = &coreFeatures.pNext;
-
                deMemset(&coreFeatures, 0, sizeof(coreFeatures));
                deMemset(&samplerYCbCrConversionFeatures, 0, sizeof(samplerYCbCrConversionFeatures));
 
                coreFeatures.sType                                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
-               samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;
+               samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
 
                if (isPhysicalDeviceFeatures2Supported(apiVersion, instanceExtensions))
                {
                        if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion"))
-                       {
-                               *curExtPoint = &samplerYCbCrConversionFeatures;
-                               curExtPoint = &samplerYCbCrConversionFeatures.pNext;
-                       }
+                               coreFeatures.pNext = &samplerYCbCrConversionFeatures;
 
                        vki.getPhysicalDeviceFeatures2(physicalDevice, &coreFeatures);
                }
@@ -311,30 +307,30 @@ struct DeviceFeatures
 class DefaultDevice
 {
 public:
-                                                                               DefaultDevice                                   (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine);
-                                                                               ~DefaultDevice                                  (void);
+                                                                                                                       DefaultDevice                                           (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine);
+                                                                                                                       ~DefaultDevice                                          (void);
 
-       VkInstance                                                      getInstance                                             (void) const    { return *m_instance;                                   }
-       const InstanceInterface&                        getInstanceInterface                    (void) const    { return m_instanceInterface;                   }
-       deUint32                                                        getInstanceVersion                              (void) const    { return m_instanceVersion;                             }
-       const vector<string>&                           getInstanceExtensions                   (void) const    { return m_instanceExtensions;                  }
+       VkInstance                                                                                              getInstance                                                     (void) const    { return *m_instance;                                                                           }
+       const InstanceInterface&                                                                getInstanceInterface                            (void) const    { return m_instanceInterface;                                                           }
+       deUint32                                                                                                getInstanceVersion                                      (void) const    { return m_instanceVersion;                                                                     }
+       const vector<string>&                                                                   getInstanceExtensions                           (void) const    { return m_instanceExtensions;                                                          }
 
-       VkPhysicalDevice                                        getPhysicalDevice                               (void) const    { return m_physicalDevice;                              }
-       deUint32                                                        getDeviceVersion                                (void) const    { return m_deviceVersion;                               }
-       const VkPhysicalDeviceFeatures&         getDeviceFeatures                               (void) const    { return m_deviceFeatures;                              }
-       const VkPhysicalDeviceFeatures2&        getDeviceFeatures2                              (void) const    { return m_deviceFeatures2;                             }
-       VkDevice                                                        getDevice                                               (void) const    { return *m_device;                                             }
-       const DeviceInterface&                          getDeviceInterface                              (void) const    { return m_deviceInterface;                             }
-       const VkPhysicalDeviceProperties&       getDeviceProperties                             (void) const    { return m_deviceProperties;                    }
-       const vector<string>&                           getDeviceExtensions                             (void) const    { return m_deviceExtensions;                    }
+       VkPhysicalDevice                                                                                getPhysicalDevice                                       (void) const    { return m_physicalDevice;                                                                      }
+       deUint32                                                                                                getDeviceVersion                                        (void) const    { return m_deviceVersion;                                                                       }
+       const VkPhysicalDeviceFeatures&                                                 getDeviceFeatures                                       (void) const    { return m_deviceFeatures.coreFeatures.features;                        }
+       const VkPhysicalDeviceFeatures2&                                                getDeviceFeatures2                                      (void) const    { return m_deviceFeatures.coreFeatures; }
+       const VkPhysicalDeviceSamplerYcbcrConversionFeatures&   getSamplerYCbCrConversionFeatures       (void) const    { return m_deviceFeatures.samplerYCbCrConversionFeatures;       }
+       VkDevice                                                                                                getDevice                                                       (void) const    { return *m_device;                                                                                     }
+       const DeviceInterface&                                                                  getDeviceInterface                                      (void) const    { return m_deviceInterface;                                                                     }
+       const VkPhysicalDeviceProperties&                                               getDeviceProperties                                     (void) const    { return m_deviceProperties;                                                            }
+       const vector<string>&                                                                   getDeviceExtensions                                     (void) const    { return m_deviceExtensions;                                                            }
 
-       deUint32                                                        getUsedApiVersion                               (void) const    { return m_usedApiVersion;                              }
+       deUint32                                                                                                getUsedApiVersion                                       (void) const    { return m_usedApiVersion;                                                                      }
 
-       deUint32                                                        getUniversalQueueFamilyIndex    (void) const    { return m_universalQueueFamilyIndex;   }
-       VkQueue                                                         getUniversalQueue                               (void) const;
+       deUint32                                                                                                getUniversalQueueFamilyIndex            (void) const    { return m_universalQueueFamilyIndex;                                           }
+       VkQueue                                                                                                 getUniversalQueue                                       (void) const;
 
 private:
-       static VkPhysicalDeviceFeatures         filterDefaultDeviceFeatures             (const VkPhysicalDeviceFeatures& deviceFeatures);
 
        const deUint32                                          m_instanceVersion;
        const vector<string>                            m_instanceExtensions;
@@ -347,10 +343,10 @@ private:
        const deUint32                                          m_usedApiVersion;
 
        const deUint32                                          m_universalQueueFamilyIndex;
-       const VkPhysicalDeviceFeatures          m_deviceFeatures;
-       const VkPhysicalDeviceFeatures2         m_deviceFeatures2;
        const VkPhysicalDeviceProperties        m_deviceProperties;
+
        const vector<string>                            m_deviceExtensions;
+       const DeviceFeatures                            m_deviceFeatures;
 
        const Unique<VkDevice>                          m_device;
        const DeviceDriver                                      m_deviceInterface;
@@ -366,11 +362,10 @@ DefaultDevice::DefaultDevice (const PlatformInterface& vkPlatform, const tcu::Co
        , m_deviceVersion                               (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice).apiVersion)
        , m_usedApiVersion                              (deMin32(m_instanceVersion, m_deviceVersion))
        , m_universalQueueFamilyIndex   (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
-       , m_deviceFeatures                              (filterDefaultDeviceFeatures(getPhysicalDeviceFeatures(m_instanceInterface, m_physicalDevice)))
-       , m_deviceFeatures2                             (getPhysicalDeviceFeatures2(m_instanceInterface, m_physicalDevice))
        , m_deviceProperties                    (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
        , m_deviceExtensions                    (addCoreDeviceExtensions(filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL)), m_deviceVersion))
-       , m_device                                              (createDefaultDevice(m_instanceInterface, m_physicalDevice, m_deviceVersion, m_universalQueueFamilyIndex, m_deviceFeatures2, m_deviceExtensions, cmdLine))
+       , m_deviceFeatures                              (m_instanceInterface, m_deviceVersion, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
+       , m_device                                              (createDefaultDevice(m_instanceInterface, m_physicalDevice, m_deviceVersion, m_universalQueueFamilyIndex, getDeviceFeatures2(), m_deviceExtensions, cmdLine))
        , m_deviceInterface                             (m_instanceInterface, *m_device)
 {
 }
@@ -384,16 +379,6 @@ VkQueue DefaultDevice::getUniversalQueue (void) const
        return getDeviceQueue(m_deviceInterface, *m_device, m_universalQueueFamilyIndex, 0);
 }
 
-VkPhysicalDeviceFeatures DefaultDevice::filterDefaultDeviceFeatures (const VkPhysicalDeviceFeatures& deviceFeatures)
-{
-       VkPhysicalDeviceFeatures enabledDeviceFeatures = deviceFeatures;
-
-       // Disable robustness by default, as it has an impact on performance on some HW.
-       enabledDeviceFeatures.robustBufferAccess = false;
-
-       return enabledDeviceFeatures;
-}
-
 // Allocator utilities
 
 vk::Allocator* createAllocator (DefaultDevice* device)
@@ -429,6 +414,9 @@ vk::VkPhysicalDevice                                        Context::getPhysicalDevice                              (void) const { return m_d
 deUint32                                                               Context::getDeviceVersion                               (void) const { return m_device->getDeviceVersion();                             }
 const vk::VkPhysicalDeviceFeatures&            Context::getDeviceFeatures                              (void) const { return m_device->getDeviceFeatures();                    }
 const vk::VkPhysicalDeviceFeatures2&   Context::getDeviceFeatures2                             (void) const { return m_device->getDeviceFeatures2();                   }
+const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures&
+                                                                               Context::getSamplerYCbCrConversionFeatures
+                                                                                                                                                               (void) const { return m_device->getSamplerYCbCrConversionFeatures();    }
 const vk::VkPhysicalDeviceProperties&  Context::getDeviceProperties                    (void) const { return m_device->getDeviceProperties();                  }
 const vector<string>&                                  Context::getDeviceExtensions                    (void) const { return m_device->getDeviceExtensions();                  }
 vk::VkDevice                                                   Context::getDevice                                              (void) const { return m_device->getDevice();                                    }
index a7e1507..7d5c46c 100644 (file)
@@ -67,6 +67,9 @@ public:
        deUint32                                                                        getDeviceVersion                                (void) const;
        const vk::VkPhysicalDeviceFeatures&                     getDeviceFeatures                               (void) const;
        const vk::VkPhysicalDeviceFeatures2&            getDeviceFeatures2                              (void) const;
+       const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures&
+                                                                                               getSamplerYCbCrConversionFeatures
+                                                                                                                                                               (void) const;
        const vk::VkPhysicalDeviceProperties&           getDeviceProperties                             (void) const;
        const std::vector<std::string>&                         getDeviceExtensions                             (void) const;
        vk::VkDevice                                                            getDevice                                               (void) const;
index 1c6f17d..c230969 100644 (file)
@@ -196,8 +196,9 @@ void readStagingBuffers (MultiPlaneImageData*                       imageData,
 
 void checkImageSupport (Context& context, VkFormat format, VkImageCreateFlags createFlags, VkImageTiling tiling)
 {
-       const bool              disjoint        = (createFlags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0;
-       vector<string>  reqExts;
+       const bool                                                                                                      disjoint        = (createFlags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0;
+       const VkPhysicalDeviceSamplerYcbcrConversionFeatures            features        = context.getSamplerYCbCrConversionFeatures();
+       vector<string>                                                                                          reqExts;
 
        if (!isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_sampler_ycbcr_conversion"))
                reqExts.push_back("VK_KHR_sampler_ycbcr_conversion");
@@ -216,28 +217,9 @@ void checkImageSupport (Context& context, VkFormat format, VkImageCreateFlags cr
                        TCU_THROW(NotSupportedError, (*extIter + " is not supported").c_str());
        }
 
+       if (features.samplerYcbcrConversion == VK_FALSE)
        {
-               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");
+               TCU_THROW(NotSupportedError, "samplerYcbcrConversion is not supported");
        }
 
        {