Skip shader compile on unsupported ycbcr tests
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / vktTestCase.cpp
index 11bc384..54ec64c 100644 (file)
@@ -36,6 +36,8 @@
 #include "deSTLUtil.hpp"
 #include "deMemory.h"
 
+#include <set>
+
 namespace vkt
 {
 
@@ -43,6 +45,7 @@ namespace vkt
 
 using std::vector;
 using std::string;
+using std::set;
 using namespace vk;
 
 namespace
@@ -89,7 +92,7 @@ vector<string> getValidationLayers (const InstanceInterface& vki, VkPhysicalDevi
        return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
 }
 
-vector<string> filterExtensions(const vector<VkExtensionProperties>& deviceExtensions)
+vector<string> filterExtensions (const vector<VkExtensionProperties>& extensions)
 {
        vector<string>  enabledExtensions;
        const char*             extensionGroups[] =
@@ -99,22 +102,99 @@ vector<string> filterExtensions(const vector<VkExtensionProperties>& deviceExten
                "VK_KHX_"
        };
 
-       for (size_t deviceExtNdx = 0; deviceExtNdx < deviceExtensions.size(); deviceExtNdx++)
+       for (size_t extNdx = 0; extNdx < extensions.size(); extNdx++)
        {
                for (int extGroupNdx = 0; extGroupNdx < DE_LENGTH_OF_ARRAY(extensionGroups); extGroupNdx++)
                {
-                       if (deStringBeginsWith(deviceExtensions[deviceExtNdx].extensionName, extensionGroups[extGroupNdx]))
-                               enabledExtensions.push_back(deviceExtensions[deviceExtNdx].extensionName);
+                       if (deStringBeginsWith(extensions[extNdx].extensionName, extensionGroups[extGroupNdx]))
+                               enabledExtensions.push_back(extensions[extNdx].extensionName);
                }
        }
 
        return enabledExtensions;
 }
 
-Move<VkInstance> createInstance (const PlatformInterface& vkp, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine)
+vector<string> addExtensions (const vector<string>& a, const vector<const char*>& b)
+{
+       vector<string>  res             (a);
+
+       for (vector<const char*>::const_iterator bIter = b.begin(); bIter != b.end(); ++bIter)
+       {
+               if (!de::contains(res.begin(), res.end(), string(*bIter)))
+                       res.push_back(string(*bIter));
+       }
+
+       return res;
+}
+
+vector<string> removeExtensions (const vector<string>& a, const vector<const char*>& b)
+{
+       vector<string>  res;
+       set<string>             removeExts      (b.begin(), b.end());
+
+       for (vector<string>::const_iterator aIter = a.begin(); aIter != a.end(); ++aIter)
+       {
+               if (!de::contains(removeExts, *aIter))
+                       res.push_back(*aIter);
+       }
+
+       return res;
+}
+
+vector<string> addCoreInstanceExtensions (const vector<string>& extensions, deUint32 instanceVersion)
+{
+       vector<const char*> coreExtensions;
+       getCoreInstanceExtensions(instanceVersion, coreExtensions);
+       return addExtensions(extensions, coreExtensions);
+}
+
+vector<string> addCoreDeviceExtensions(const vector<string>& extensions, deUint32 instanceVersion)
+{
+       vector<const char*> coreExtensions;
+       getCoreDeviceExtensions(instanceVersion, coreExtensions);
+       return addExtensions(extensions, coreExtensions);
+}
+
+deUint32 getTargetInstanceVersion (const PlatformInterface& vkp)
+{
+       deUint32 version = pack(ApiVersion(1, 0, 0));
+       if (vkp.enumerateInstanceVersion(&version) != VK_SUCCESS)
+               TCU_THROW(InternalError, "Enumerate instance version error");
+       return version;
+}
+
+std::pair<deUint32, deUint32> determineDeviceVersions(const PlatformInterface& vkp, deUint32 apiVersion, const tcu::CommandLine& cmdLine)
+{
+       Move<VkInstance>                                                preinstance                             = createDefaultInstance(vkp, apiVersion);
+       InstanceDriver                                                  preinterface                    (vkp, preinstance.get());
+
+       const vector<VkPhysicalDevice>                  devices                                 = enumeratePhysicalDevices(preinterface, preinstance.get());
+       deUint32                                                                lowestDeviceVersion             = 0xFFFFFFFFu;
+       for (deUint32 deviceNdx = 0u; deviceNdx < devices.size(); ++deviceNdx)
+       {
+               const VkPhysicalDeviceProperties        props                                   = getPhysicalDeviceProperties(preinterface, devices[deviceNdx]);
+               if (props.apiVersion < lowestDeviceVersion)
+                       lowestDeviceVersion = props.apiVersion;
+       }
+
+       const vk::VkPhysicalDevice                              choosenDevice                   = chooseDevice(preinterface, *preinstance, cmdLine);
+       const VkPhysicalDeviceProperties                props                                   = getPhysicalDeviceProperties(preinterface, choosenDevice);
+       const deUint32                                                  choosenDeviceVersion    = props.apiVersion;
+
+       return std::make_pair(choosenDeviceVersion, lowestDeviceVersion);
+}
+
+
+Move<VkInstance> createInstance (const PlatformInterface& vkp, deUint32 apiVersion, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine)
 {
-       const bool                                                      isValidationEnabled     = cmdLine.isValidationEnabled();
-       vector<string>                                          enabledLayers;
+       const bool                                                              isValidationEnabled     = cmdLine.isValidationEnabled();
+       vector<string>                                                  enabledLayers;
+
+       // \note Extensions in core are not explicitly enabled even though
+       //               they are in the extension list advertised to tests.
+       vector<const char*>                                             coreExtensions;
+       getCoreInstanceExtensions(apiVersion, coreExtensions);
+       vector<string>                                                  nonCoreExtensions       (removeExtensions(enabledExtensions, coreExtensions));
 
        if (isValidationEnabled)
        {
@@ -126,7 +206,7 @@ Move<VkInstance> createInstance (const PlatformInterface& vkp, const vector<stri
                        TCU_THROW(NotSupportedError, "No validation layers found");
        }
 
-       return createDefaultInstance(vkp, enabledLayers, enabledExtensions);
+       return createDefaultInstance(vkp, apiVersion, enabledLayers, nonCoreExtensions);
 }
 
 static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
@@ -142,11 +222,14 @@ static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstanc
        TCU_THROW(NotSupportedError, "No matching queue found");
 }
 
-Move<VkDevice> createDefaultDevice (const InstanceInterface&                   vki,
+Move<VkDevice> createDefaultDevice (const PlatformInterface&                   vkp,
+                                                                       VkInstance                                                      instance,
+                                                                       const InstanceInterface&                        vki,
                                                                        VkPhysicalDevice                                        physicalDevice,
+                                                                       const deUint32                                          apiVersion,
                                                                        deUint32                                                        queueIndex,
                                                                        deUint32                                                        sparseQueueIndex,
-                                                                       const VkPhysicalDeviceFeatures2KHR&     enabledFeatures,
+                                                                       const VkPhysicalDeviceFeatures2&        enabledFeatures,
                                                                        const vector<string>&                           enabledExtensions,
                                                                        const tcu::CommandLine&                         cmdLine)
 {
@@ -173,10 +256,16 @@ Move<VkDevice> createDefaultDevice (const InstanceInterface&                      vki,
        for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
                layerPtrs[ndx] = enabledLayers[ndx].c_str();
 
-       extensionPtrs.resize(enabledExtensions.size());
+       // \note Extensions in core are not explicitly enabled even though
+       //               they are in the extension list advertised to tests.
+       vector<const char*> coreExtensions;
+       getCoreDeviceExtensions(apiVersion, coreExtensions);
+       vector<string>  nonCoreExtensions(removeExtensions(enabledExtensions, coreExtensions));
+
+       extensionPtrs.resize(nonCoreExtensions.size());
 
-       for (size_t ndx = 0; ndx < enabledExtensions.size(); ++ndx)
-               extensionPtrs[ndx] = enabledExtensions[ndx].c_str();
+       for (size_t ndx = 0; ndx < nonCoreExtensions.size(); ++ndx)
+               extensionPtrs[ndx] = nonCoreExtensions[ndx].c_str();
 
        queueInfo[0].sType                                              = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
        queueInfo[0].pNext                                              = DE_NULL;
@@ -206,41 +295,59 @@ Move<VkDevice> createDefaultDevice (const InstanceInterface&                      vki,
        deviceInfo.ppEnabledLayerNames                  = (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]);
        deviceInfo.pEnabledFeatures                             = enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features;
 
-       return createDevice(vki, physicalDevice, &deviceInfo);
+       return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
 };
 
-bool isPhysicalDeviceFeatures2Supported (const vector<string>& instanceExtensions)
+bool isPhysicalDeviceFeatures2Supported (const deUint32 version, const vector<string>& instanceExtensions)
 {
-       return de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2");
+       return isInstanceExtensionSupported(version, instanceExtensions, "VK_KHR_get_physical_device_properties2");
 }
 
-struct DeviceFeatures
+class DeviceFeatures
 {
-       VkPhysicalDeviceFeatures2KHR                                            coreFeatures;
-       VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR       samplerYCbCrConversionFeatures;
+public:
+       VkPhysicalDeviceFeatures2                                               coreFeatures;
+       VkPhysicalDeviceSamplerYcbcrConversionFeatures  samplerYCbCrConversionFeatures;
+       VkPhysicalDevice16BitStorageFeatures                    sixteenBitStorageFeatures;
+       VkPhysicalDeviceVariablePointerFeatures                 variablePointerFeatures;
 
        DeviceFeatures (const InstanceInterface&        vki,
-                                       VkPhysicalDevice                        physicalDevice,
+                                       const deUint32                          apiVersion,
+                                       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));
+               deMemset(&sixteenBitStorageFeatures, 0, sizeof(sixteenBitStorageFeatures));
+               deMemset(&variablePointerFeatures, 0, sizeof(variablePointerFeatures));
 
-               coreFeatures.sType                                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
-               samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;
+               coreFeatures.sType                                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+               samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
+               sixteenBitStorageFeatures.sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
+               variablePointerFeatures.sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR;
 
-               if (isPhysicalDeviceFeatures2Supported(instanceExtensions))
+               if (isPhysicalDeviceFeatures2Supported(apiVersion, instanceExtensions))
                {
+                       void** nextPtr = &coreFeatures.pNext;
+
                        if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion"))
                        {
-                               *curExtPoint = &samplerYCbCrConversionFeatures;
-                               curExtPoint = &samplerYCbCrConversionFeatures.pNext;
+                               *nextPtr        = &samplerYCbCrConversionFeatures;
+                               nextPtr         = &samplerYCbCrConversionFeatures.pNext;
+                       }
+                       if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_16bit_storage"))
+                       {
+                               *nextPtr        = &sixteenBitStorageFeatures;
+                               nextPtr         = &sixteenBitStorageFeatures.pNext;
+                       }
+                       if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_variable_pointers"))
+                       {
+                               *nextPtr        = &variablePointerFeatures;
+                               nextPtr         = &variablePointerFeatures.pNext;
                        }
 
-                       vki.getPhysicalDeviceFeatures2KHR(physicalDevice, &coreFeatures);
+                       vki.getPhysicalDeviceFeatures2(physicalDevice, &coreFeatures);
                }
                else
                        coreFeatures.features = getPhysicalDeviceFeatures(vki, physicalDevice);
@@ -255,34 +362,47 @@ struct DeviceFeatures
 class DefaultDevice
 {
 public:
-                                                                               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;                                           }
-       const vector<string>&                           getInstanceExtensions                   (void) const    { return m_instanceExtensions;                                          }
-
-       VkPhysicalDevice                                        getPhysicalDevice                               (void) const    { return m_physicalDevice;                                                      }
-       const VkPhysicalDeviceFeatures&         getDeviceFeatures                               (void) const    { return m_deviceFeatures.coreFeatures.features;        }
-       const VkPhysicalDeviceFeatures2KHR&     getDeviceFeatures2                              (void) const    { return m_deviceFeatures.coreFeatures;                         }
-       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                                                        getUniversalQueueFamilyIndex    (void) const    { return m_universalQueueFamilyIndex;                           }
-       VkQueue                                                         getUniversalQueue                               (void) const;
-       deUint32                                                        getSparseQueueFamilyIndex               (void) const    { return m_sparseQueueFamilyIndex;                                      }
-       VkQueue                                                         getSparseQueue                                  (void) const;
+                                                                                                                       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                                                                                                getAvailableInstanceVersion                     (void) const    { return m_availableInstanceVersion;                                            }
+       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.coreFeatures.features;                        }
+       const VkPhysicalDeviceFeatures2&                                                getDeviceFeatures2                                      (void) const    { return m_deviceFeatures.coreFeatures; }
+       const VkPhysicalDeviceSamplerYcbcrConversionFeatures&   getSamplerYCbCrConversionFeatures       (void) const    { return m_deviceFeatures.samplerYCbCrConversionFeatures;       }
+       const VkPhysicalDevice16BitStorageFeatures&                             get16BitStorageFeatures                         (void) const    { return m_deviceFeatures.sixteenBitStorageFeatures;            }
+       const VkPhysicalDeviceVariablePointerFeatures&                  getVariablePointerFeatures                      (void) const    { return m_deviceFeatures.variablePointerFeatures;                      }
+       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                                                                                                getUniversalQueueFamilyIndex            (void) const    { return m_universalQueueFamilyIndex;                                           }
+       VkQueue                                                                                                 getUniversalQueue                                       (void) const;
+       deUint32                                                                                                getSparseQueueFamilyIndex               (void) const    { return m_sparseQueueFamilyIndex;                                      }
+       VkQueue                                                                                                 getSparseQueue                                  (void) const;
 
 private:
-       static VkPhysicalDeviceFeatures         filterDefaultDeviceFeatures             (const VkPhysicalDeviceFeatures& deviceFeatures);
+
+       const deUint32                                          m_availableInstanceVersion;
+
+       const std::pair<deUint32, deUint32> m_deviceVersions;
+       const deUint32                                          m_usedApiVersion;
 
        const vector<string>                            m_instanceExtensions;
        const Unique<VkInstance>                        m_instance;
        const InstanceDriver                            m_instanceInterface;
 
        const VkPhysicalDevice                          m_physicalDevice;
+       const deUint32                                          m_deviceVersion;
+
        const vector<string>                            m_deviceExtensions;
        const DeviceFeatures                            m_deviceFeatures;
 
@@ -292,21 +412,30 @@ private:
 
        const Unique<VkDevice>                          m_device;
        const DeviceDriver                                      m_deviceInterface;
+
 };
 
 DefaultDevice::DefaultDevice (const PlatformInterface& vkPlatform, const tcu::CommandLine& cmdLine)
-       : m_instanceExtensions                  (filterExtensions(enumerateInstanceExtensionProperties(vkPlatform, DE_NULL)))
-       , m_instance                                    (createInstance(vkPlatform, m_instanceExtensions, cmdLine))
+       : m_availableInstanceVersion    (getTargetInstanceVersion(vkPlatform))
+       , m_deviceVersions                              (determineDeviceVersions(vkPlatform, m_availableInstanceVersion, cmdLine))
+       , m_usedApiVersion                              (deMinu32(m_availableInstanceVersion, m_deviceVersions.first))
+
+       , m_instanceExtensions                  (addCoreInstanceExtensions(filterExtensions(enumerateInstanceExtensionProperties(vkPlatform, DE_NULL)), m_usedApiVersion))
+       , m_instance                                    (createInstance(vkPlatform, m_usedApiVersion, m_instanceExtensions, cmdLine))
+
        , m_instanceInterface                   (vkPlatform, *m_instance)
        , m_physicalDevice                              (chooseDevice(m_instanceInterface, *m_instance, cmdLine))
-       , m_deviceExtensions                    (filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL)))
-       , m_deviceFeatures                              (m_instanceInterface, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
+       , m_deviceVersion                               (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice).apiVersion)
+
+       , m_deviceExtensions                    (addCoreDeviceExtensions(filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL)), m_usedApiVersion))
+       , m_deviceFeatures                              (m_instanceInterface, m_usedApiVersion, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
        , m_universalQueueFamilyIndex   (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
        , m_sparseQueueFamilyIndex              (m_deviceFeatures.coreFeatures.features.sparseBinding ? findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_SPARSE_BINDING_BIT) : 0)
        , m_deviceProperties                    (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
-       , m_device                                              (createDefaultDevice(m_instanceInterface, m_physicalDevice, m_universalQueueFamilyIndex, m_sparseQueueFamilyIndex, m_deviceFeatures.coreFeatures, m_deviceExtensions, cmdLine))
-       , m_deviceInterface                             (m_instanceInterface, *m_device)
+       , m_device                                              (createDefaultDevice(vkPlatform, *m_instance, m_instanceInterface, m_physicalDevice, m_usedApiVersion, m_universalQueueFamilyIndex, m_sparseQueueFamilyIndex, m_deviceFeatures.coreFeatures, m_deviceExtensions, cmdLine))
+       , m_deviceInterface                             (vkPlatform, *m_instance, *m_device)
 {
+       DE_ASSERT(m_deviceVersions.first == m_deviceVersion);
 }
 
 DefaultDevice::~DefaultDevice (void)
@@ -342,9 +471,9 @@ vk::Allocator* createAllocator (DefaultDevice* device)
 
 // Context
 
-Context::Context (tcu::TestContext&                                                    testCtx,
-                                 const vk::PlatformInterface&                          platformInterface,
-                                 vk::ProgramCollection<vk::ProgramBinary>&     progCollection)
+Context::Context (tcu::TestContext&                            testCtx,
+                                 const vk::PlatformInterface&  platformInterface,
+                                 vk::BinaryCollection&                 progCollection)
        : m_testCtx                             (testCtx)
        , m_platformInterface   (platformInterface)
        , m_progCollection              (progCollection)
@@ -357,12 +486,21 @@ Context::~Context (void)
 {
 }
 
+deUint32                                                               Context::getAvailableInstanceVersion    (void) const { return m_device->getAvailableInstanceVersion();  }
 const vector<string>&                                  Context::getInstanceExtensions                  (void) const { return m_device->getInstanceExtensions();                }
 vk::VkInstance                                                 Context::getInstance                                    (void) const { return m_device->getInstance();                                  }
 const vk::InstanceInterface&                   Context::getInstanceInterface                   (void) const { return m_device->getInstanceInterface();                 }
 vk::VkPhysicalDevice                                   Context::getPhysicalDevice                              (void) const { return m_device->getPhysicalDevice();                    }
+deUint32                                                               Context::getDeviceVersion                               (void) const { return m_device->getDeviceVersion();                             }
 const vk::VkPhysicalDeviceFeatures&            Context::getDeviceFeatures                              (void) const { return m_device->getDeviceFeatures();                    }
-const vk::VkPhysicalDeviceFeatures2KHR&        Context::getDeviceFeatures2                             (void) const { return m_device->getDeviceFeatures2();                   }
+const vk::VkPhysicalDeviceFeatures2&   Context::getDeviceFeatures2                             (void) const { return m_device->getDeviceFeatures2();                   }
+const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures&
+                                                                               Context::getSamplerYCbCrConversionFeatures
+                                                                                                                                                               (void) const { return m_device->getSamplerYCbCrConversionFeatures();    }
+const vk::VkPhysicalDevice16BitStorageFeatures&
+                                                                               Context::get16BitStorageFeatures                (void) const { return m_device->get16BitStorageFeatures();              }
+const vk::VkPhysicalDeviceVariablePointerFeatures&
+                                                                               Context::getVariablePointerFeatures             (void) const { return m_device->getVariablePointerFeatures();   }
 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();                                    }
@@ -372,6 +510,13 @@ vk::VkQueue                                                                Context::getUniversalQueue                              (void) const { return m_device-
 deUint32                                                               Context::getSparseQueueFamilyIndex              (void) const { return m_device->getSparseQueueFamilyIndex();    }
 vk::VkQueue                                                            Context::getSparseQueue                                 (void) const { return m_device->getSparseQueue();                               }
 vk::Allocator&                                                 Context::getDefaultAllocator                    (void) const { return *m_allocator;                                                             }
+deUint32                                                               Context::getUsedApiVersion                              (void) const { return m_device->getUsedApiVersion();                    }
+bool                                                                   Context::contextSupports                                (const deUint32 majorNum, const deUint32 minorNum, const deUint32 patchNum) const
+                                                                                                                                                                                       { return m_device->getUsedApiVersion() >= VK_MAKE_VERSION(majorNum, minorNum, patchNum); }
+bool                                                                   Context::contextSupports                                (const ApiVersion version) const
+                                                                                                                                                                                       { return m_device->getUsedApiVersion() >= pack(version); }
+bool                                                                   Context::contextSupports                                (const deUint32 requiredApiVersionBits) const
+                                                                                                                                                                                       { return m_device->getUsedApiVersion() >= requiredApiVersionBits; }
 
 // TestCase
 
@@ -379,4 +524,8 @@ void TestCase::initPrograms (SourceCollections&) const
 {
 }
 
+void TestCase::checkSupport (Context&) const
+{
+}
+
 } // vkt