Merge vk-gl-cts/vulkan-cts-1.3.2 into vk-gl-cts/main
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / framework / vulkan / generated / vulkansc / vkDeviceFeatureTest.inl
index 73785ac..15373f5 100644 (file)
  */
 
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice16BitStorageFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTest16BitStorageFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice16BitStorageFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDevice16BitStorageFeatures, storageBuffer16BitAccess),
                FEATURE_ITEM (VkPhysicalDevice16BitStorageFeatures, uniformAndStorageBuffer16BitAccess),
                FEATURE_ITEM (VkPhysicalDevice16BitStorageFeatures, storagePushConstant16),
                FEATURE_ITEM (VkPhysicalDevice16BitStorageFeatures, storageInputOutput16),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 4, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 4, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceMultiviewFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestMultiviewFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceMultiviewFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceMultiviewFeatures, multiview),
                FEATURE_ITEM (VkPhysicalDeviceMultiviewFeatures, multiviewGeometryShader),
                FEATURE_ITEM (VkPhysicalDeviceMultiviewFeatures, multiviewTessellationShader),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVariablePointersFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVariablePointersFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVariablePointersFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVariablePointersFeatures, variablePointersStorageBuffer),
                FEATURE_ITEM (VkPhysicalDeviceVariablePointersFeatures, variablePointers),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceProtectedMemoryFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestProtectedMemoryFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceProtectedMemoryFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceProtectedMemoryFeatures, protectedMemory),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSamplerYcbcrConversionFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestSamplerYcbcrConversionFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSamplerYcbcrConversionFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceSamplerYcbcrConversionFeatures, samplerYcbcrConversion),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderDrawParametersFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderDrawParametersFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderDrawParametersFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderDrawParametersFeatures, shaderDrawParameters),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkan11Features>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVulkan11Features (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkan11Features>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, storageBuffer16BitAccess),
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, uniformAndStorageBuffer16BitAccess),
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, storagePushConstant16),
@@ -86,15 +339,52 @@ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(de
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, protectedMemory),
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, samplerYcbcrConversion),
                FEATURE_ITEM (VkPhysicalDeviceVulkan11Features, shaderDrawParameters),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 12, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, DE_NULL, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 12, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, DE_NULL, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkan12Features>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVulkan12Features (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkan12Features>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, samplerMirrorClampToEdge),
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, drawIndirectCount),
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, storageBuffer8BitAccess),
@@ -142,49 +432,197 @@ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(de
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, shaderOutputViewportIndex),
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, shaderOutputLayer),
                FEATURE_ITEM (VkPhysicalDeviceVulkan12Features, subgroupBroadcastDynamicId),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 47, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, DE_NULL, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 47, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, DE_NULL, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice8BitStorageFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTest8BitStorageFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice8BitStorageFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDevice8BitStorageFeatures, storageBuffer8BitAccess),
                FEATURE_ITEM (VkPhysicalDevice8BitStorageFeatures, uniformAndStorageBuffer8BitAccess),
                FEATURE_ITEM (VkPhysicalDevice8BitStorageFeatures, storagePushConstant8),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderAtomicInt64Features>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderAtomicInt64Features (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderAtomicInt64Features>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicInt64Features, shaderBufferInt64Atomics),
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicInt64Features, shaderSharedInt64Atomics),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderFloat16Int8Features>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderFloat16Int8Features (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderFloat16Int8Features>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderFloat16Int8Features, shaderFloat16),
                FEATURE_ITEM (VkPhysicalDeviceShaderFloat16Int8Features, shaderInt8),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceDescriptorIndexingFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestDescriptorIndexingFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceDescriptorIndexingFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, shaderInputAttachmentArrayDynamicIndexing),
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, shaderUniformTexelBufferArrayDynamicIndexing),
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, shaderStorageTexelBufferArrayDynamicIndexing),
@@ -205,283 +643,1245 @@ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(de
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, descriptorBindingPartiallyBound),
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, descriptorBindingVariableDescriptorCount),
                FEATURE_ITEM (VkPhysicalDeviceDescriptorIndexingFeatures, runtimeDescriptorArray),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 20, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 20, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceScalarBlockLayoutFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestScalarBlockLayoutFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceScalarBlockLayoutFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceScalarBlockLayoutFeatures, scalarBlockLayout),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkanMemoryModelFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVulkanMemoryModelFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkanMemoryModelFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVulkanMemoryModelFeatures, vulkanMemoryModel),
                FEATURE_ITEM (VkPhysicalDeviceVulkanMemoryModelFeatures, vulkanMemoryModelDeviceScope),
                FEATURE_ITEM (VkPhysicalDeviceVulkanMemoryModelFeatures, vulkanMemoryModelAvailabilityVisibilityChains),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceImagelessFramebufferFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestImagelessFramebufferFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceImagelessFramebufferFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceImagelessFramebufferFeatures, imagelessFramebuffer),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestUniformBufferStandardLayoutFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceUniformBufferStandardLayoutFeatures, uniformBufferStandardLayout),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderSubgroupExtendedTypesFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, shaderSubgroupExtendedTypes),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestSeparateDepthStencilLayoutsFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, separateDepthStencilLayouts),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceHostQueryResetFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestHostQueryResetFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceHostQueryResetFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceHostQueryResetFeatures, hostQueryReset),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTimelineSemaphoreFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestTimelineSemaphoreFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTimelineSemaphoreFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceTimelineSemaphoreFeatures, timelineSemaphore),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceBufferDeviceAddressFeatures>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestBufferDeviceAddressFeatures (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceBufferDeviceAddressFeatures>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress),
                FEATURE_ITEM (VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddressCaptureReplay),
                FEATURE_ITEM (VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddressMultiDevice),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkanSC10Features>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVulkanSC10Features (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVulkanSC10Features>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVulkanSC10Features, shaderAtomicInstructions),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkanSC10Features*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVulkanSC10Features*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevicePerformanceQueryFeaturesKHR>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestPerformanceQueryFeaturesKHR (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevicePerformanceQueryFeaturesKHR>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDevicePerformanceQueryFeaturesKHR, performanceCounterQueryPools),
                FEATURE_ITEM (VkPhysicalDevicePerformanceQueryFeaturesKHR, performanceCounterMultipleQueryPools),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderClockFeaturesKHR>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderClockFeaturesKHR (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderClockFeaturesKHR>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderClockFeaturesKHR, shaderSubgroupClock),
                FEATURE_ITEM (VkPhysicalDeviceShaderClockFeaturesKHR, shaderDeviceClock),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderTerminateInvocationFeaturesKHR (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR, shaderTerminateInvocation),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestFragmentShadingRateFeaturesKHR (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceFragmentShadingRateFeaturesKHR, pipelineFragmentShadingRate),
                FEATURE_ITEM (VkPhysicalDeviceFragmentShadingRateFeaturesKHR, primitiveFragmentShadingRate),
                FEATURE_ITEM (VkPhysicalDeviceFragmentShadingRateFeaturesKHR, attachmentFragmentShadingRate),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSynchronization2FeaturesKHR>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestSynchronization2FeaturesKHR (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSynchronization2FeaturesKHR>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceSynchronization2FeaturesKHR, synchronization2),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestTextureCompressionASTCHDRFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, textureCompressionASTC_HDR),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceASTCDecodeFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestASTCDecodeFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceASTCDecodeFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceASTCDecodeFeaturesEXT, decodeModeSharedExponent),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceDepthClipEnableFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestDepthClipEnableFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceDepthClipEnableFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceDepthClipEnableFeaturesEXT, depthClipEnable),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestBlendOperationAdvancedFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, advancedBlendCoherentOperations),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVertexAttributeDivisorFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, vertexAttributeInstanceRateDivisor),
                FEATURE_ITEM (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, vertexAttributeInstanceRateZeroDivisor),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestSubgroupSizeControlFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, subgroupSizeControl),
                FEATURE_ITEM (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, computeFullSubgroups),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderImageAtomicInt64FeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT, shaderImageInt64Atomics),
                FEATURE_ITEM (VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT, sparseImageInt64Atomics),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestFragmentShaderInterlockFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, fragmentShaderSampleInterlock),
                FEATURE_ITEM (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, fragmentShaderPixelInterlock),
                FEATURE_ITEM (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, fragmentShaderShadingRateInterlock),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestYcbcrImageArraysFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceYcbcrImageArraysFeaturesEXT, ycbcrImageArrays),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceLineRasterizationFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestLineRasterizationFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceLineRasterizationFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, rectangularLines),
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, bresenhamLines),
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, smoothLines),
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledRectangularLines),
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledBresenhamLines),
                FEATURE_ITEM (VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledSmoothLines),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 6, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 6, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderAtomicFloatFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderBufferFloat32Atomics),
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderBufferFloat32AtomicAdd),
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderBufferFloat64Atomics),
@@ -494,134 +1894,640 @@ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(de
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, shaderImageFloat32AtomicAdd),
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, sparseImageFloat32Atomics),
                FEATURE_ITEM (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, sparseImageFloat32AtomicAdd),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 12, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 12, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestIndexTypeUint8FeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceIndexTypeUint8FeaturesEXT, indexTypeUint8),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestExtendedDynamicStateFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, extendedDynamicState),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderDemoteToHelperInvocationFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, shaderDemoteToHelperInvocation),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestTexelBufferAlignmentFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT, texelBufferAlignment),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceRobustness2FeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestRobustness2FeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceRobustness2FeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceRobustness2FeaturesEXT, robustBufferAccess2),
                FEATURE_ITEM (VkPhysicalDeviceRobustness2FeaturesEXT, robustImageAccess2),
                FEATURE_ITEM (VkPhysicalDeviceRobustness2FeaturesEXT, nullDescriptor),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceCustomBorderColorFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestCustomBorderColorFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceCustomBorderColorFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceCustomBorderColorFeaturesEXT, customBorderColors),
                FEATURE_ITEM (VkPhysicalDeviceCustomBorderColorFeaturesEXT, customBorderColorWithoutFormat),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestYcbcr2Plane444FormatsFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, ycbcr2plane444Formats),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceImageRobustnessFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestImageRobustnessFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceImageRobustnessFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceImageRobustnessFeaturesEXT, robustImageAccess),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice4444FormatsFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTest4444FormatsFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDevice4444FormatsFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDevice4444FormatsFeaturesEXT, formatA4R4G4B4),
                FEATURE_ITEM (VkPhysicalDevice4444FormatsFeaturesEXT, formatA4B4G4R4),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 2, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestVertexInputDynamicStateFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT, vertexInputDynamicState),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestExtendedDynamicState2FeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2),
                FEATURE_ITEM (VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2LogicOp),
                FEATURE_ITEM (VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2PatchControlPoints),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 3, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
 }
 
-if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceColorWriteEnableFeaturesEXT>()))
+
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestColorWriteEnableFeaturesEXT (Context& context)
 {
-       static const Feature features[] =
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
+       tcu::ResultCollector                                    resultCollector                 (log);
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const float                                                             queuePriority                   = 1.0f;
+       const DeviceFeatures                                    deviceFeaturesAll               (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+       const VkPhysicalDeviceFeatures2                 deviceFeatures2                 = deviceFeaturesAll.getCoreFeatures2();
+       int                                                                             numErrors                               = 0;
+       bool                                                                    isSubProcess                    = context.getTestContext().getCommandLine().isSubProcess();
+       VkDeviceObjectReservationCreateInfo memReservationStatMax = context.getResourceInterface()->getStatMax();
+
+       VkPhysicalDeviceFeatures emptyDeviceFeatures;
+       deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+       // Only non-core extensions will be used when creating the device.
+       vector<const char*>     coreExtensions;
+       getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+       vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+       vector<const char*> extensionNames;
+       extensionNames.reserve(nonCoreExtensions.size());
+       for (const string& extension : nonCoreExtensions)
+               extensionNames.push_back(extension.c_str());
+
+       if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceColorWriteEnableFeaturesEXT>()))
        {
+               static const Feature features[] =
+               {
                FEATURE_ITEM (VkPhysicalDeviceColorWriteEnableFeaturesEXT, colorWriteEnable),
-       };
-       auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(featuresStruct);
-       checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+               };
+               auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(featuresStruct);
+               checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, memReservationStatMax, isSubProcess);
+       }
+
+       if (numErrors > 0)
+               return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+       else
+               return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
+}
+
+
+void addSeparateUnsupportedFeatureTests (tcu::TestCaseGroup* testGroup)
+{
+
+       addFunctionCase(testGroup, "16_bit_storage_features", "createDeviceWithUnsupportedFeaturesTest16BitStorageFeatures", createDeviceWithUnsupportedFeaturesTest16BitStorageFeatures);
+       addFunctionCase(testGroup, "multiview_features", "createDeviceWithUnsupportedFeaturesTestMultiviewFeatures", createDeviceWithUnsupportedFeaturesTestMultiviewFeatures);
+       addFunctionCase(testGroup, "variable_pointers_features", "createDeviceWithUnsupportedFeaturesTestVariablePointersFeatures", createDeviceWithUnsupportedFeaturesTestVariablePointersFeatures);
+       addFunctionCase(testGroup, "protected_memory_features", "createDeviceWithUnsupportedFeaturesTestProtectedMemoryFeatures", createDeviceWithUnsupportedFeaturesTestProtectedMemoryFeatures);
+       addFunctionCase(testGroup, "sampler_ycbcr_conversion_features", "createDeviceWithUnsupportedFeaturesTestSamplerYcbcrConversionFeatures", createDeviceWithUnsupportedFeaturesTestSamplerYcbcrConversionFeatures);
+       addFunctionCase(testGroup, "shader_draw_parameters_features", "createDeviceWithUnsupportedFeaturesTestShaderDrawParametersFeatures", createDeviceWithUnsupportedFeaturesTestShaderDrawParametersFeatures);
+       addFunctionCase(testGroup, "vulkan11_features", "createDeviceWithUnsupportedFeaturesTestVulkan11Features", createDeviceWithUnsupportedFeaturesTestVulkan11Features);
+       addFunctionCase(testGroup, "vulkan12_features", "createDeviceWithUnsupportedFeaturesTestVulkan12Features", createDeviceWithUnsupportedFeaturesTestVulkan12Features);
+       addFunctionCase(testGroup, "8_bit_storage_features", "createDeviceWithUnsupportedFeaturesTest8BitStorageFeatures", createDeviceWithUnsupportedFeaturesTest8BitStorageFeatures);
+       addFunctionCase(testGroup, "shader_atomic_int64_features", "createDeviceWithUnsupportedFeaturesTestShaderAtomicInt64Features", createDeviceWithUnsupportedFeaturesTestShaderAtomicInt64Features);
+       addFunctionCase(testGroup, "shader_float16_int8_features", "createDeviceWithUnsupportedFeaturesTestShaderFloat16Int8Features", createDeviceWithUnsupportedFeaturesTestShaderFloat16Int8Features);
+       addFunctionCase(testGroup, "descriptor_indexing_features", "createDeviceWithUnsupportedFeaturesTestDescriptorIndexingFeatures", createDeviceWithUnsupportedFeaturesTestDescriptorIndexingFeatures);
+       addFunctionCase(testGroup, "scalar_block_layout_features", "createDeviceWithUnsupportedFeaturesTestScalarBlockLayoutFeatures", createDeviceWithUnsupportedFeaturesTestScalarBlockLayoutFeatures);
+       addFunctionCase(testGroup, "vulkan_memory_model_features", "createDeviceWithUnsupportedFeaturesTestVulkanMemoryModelFeatures", createDeviceWithUnsupportedFeaturesTestVulkanMemoryModelFeatures);
+       addFunctionCase(testGroup, "imageless_framebuffer_features", "createDeviceWithUnsupportedFeaturesTestImagelessFramebufferFeatures", createDeviceWithUnsupportedFeaturesTestImagelessFramebufferFeatures);
+       addFunctionCase(testGroup, "uniform_buffer_standard_layout_features", "createDeviceWithUnsupportedFeaturesTestUniformBufferStandardLayoutFeatures", createDeviceWithUnsupportedFeaturesTestUniformBufferStandardLayoutFeatures);
+       addFunctionCase(testGroup, "shader_subgroup_extended_types_features", "createDeviceWithUnsupportedFeaturesTestShaderSubgroupExtendedTypesFeatures", createDeviceWithUnsupportedFeaturesTestShaderSubgroupExtendedTypesFeatures);
+       addFunctionCase(testGroup, "separate_depth_stencil_layouts_features", "createDeviceWithUnsupportedFeaturesTestSeparateDepthStencilLayoutsFeatures", createDeviceWithUnsupportedFeaturesTestSeparateDepthStencilLayoutsFeatures);
+       addFunctionCase(testGroup, "host_query_reset_features", "createDeviceWithUnsupportedFeaturesTestHostQueryResetFeatures", createDeviceWithUnsupportedFeaturesTestHostQueryResetFeatures);
+       addFunctionCase(testGroup, "timeline_semaphore_features", "createDeviceWithUnsupportedFeaturesTestTimelineSemaphoreFeatures", createDeviceWithUnsupportedFeaturesTestTimelineSemaphoreFeatures);
+       addFunctionCase(testGroup, "buffer_device_address_features", "createDeviceWithUnsupportedFeaturesTestBufferDeviceAddressFeatures", createDeviceWithUnsupportedFeaturesTestBufferDeviceAddressFeatures);
+       addFunctionCase(testGroup, "vulkan_sc10_features", "createDeviceWithUnsupportedFeaturesTestVulkanSC10Features", createDeviceWithUnsupportedFeaturesTestVulkanSC10Features);
+       addFunctionCase(testGroup, "performance_query_features_khr", "createDeviceWithUnsupportedFeaturesTestPerformanceQueryFeaturesKHR", createDeviceWithUnsupportedFeaturesTestPerformanceQueryFeaturesKHR);
+       addFunctionCase(testGroup, "shader_clock_features_khr", "createDeviceWithUnsupportedFeaturesTestShaderClockFeaturesKHR", createDeviceWithUnsupportedFeaturesTestShaderClockFeaturesKHR);
+       addFunctionCase(testGroup, "shader_terminate_invocation_features_khr", "createDeviceWithUnsupportedFeaturesTestShaderTerminateInvocationFeaturesKHR", createDeviceWithUnsupportedFeaturesTestShaderTerminateInvocationFeaturesKHR);
+       addFunctionCase(testGroup, "fragment_shading_rate_features_khr", "createDeviceWithUnsupportedFeaturesTestFragmentShadingRateFeaturesKHR", createDeviceWithUnsupportedFeaturesTestFragmentShadingRateFeaturesKHR);
+       addFunctionCase(testGroup, "synchronization2_features_khr", "createDeviceWithUnsupportedFeaturesTestSynchronization2FeaturesKHR", createDeviceWithUnsupportedFeaturesTestSynchronization2FeaturesKHR);
+       addFunctionCase(testGroup, "texture_compression_astchdr_features_ext", "createDeviceWithUnsupportedFeaturesTestTextureCompressionASTCHDRFeaturesEXT", createDeviceWithUnsupportedFeaturesTestTextureCompressionASTCHDRFeaturesEXT);
+       addFunctionCase(testGroup, "astc_decode_features_ext", "createDeviceWithUnsupportedFeaturesTestASTCDecodeFeaturesEXT", createDeviceWithUnsupportedFeaturesTestASTCDecodeFeaturesEXT);
+       addFunctionCase(testGroup, "depth_clip_enable_features_ext", "createDeviceWithUnsupportedFeaturesTestDepthClipEnableFeaturesEXT", createDeviceWithUnsupportedFeaturesTestDepthClipEnableFeaturesEXT);
+       addFunctionCase(testGroup, "blend_operation_advanced_features_ext", "createDeviceWithUnsupportedFeaturesTestBlendOperationAdvancedFeaturesEXT", createDeviceWithUnsupportedFeaturesTestBlendOperationAdvancedFeaturesEXT);
+       addFunctionCase(testGroup, "vertex_attribute_divisor_features_ext", "createDeviceWithUnsupportedFeaturesTestVertexAttributeDivisorFeaturesEXT", createDeviceWithUnsupportedFeaturesTestVertexAttributeDivisorFeaturesEXT);
+       addFunctionCase(testGroup, "subgroup_size_control_features_ext", "createDeviceWithUnsupportedFeaturesTestSubgroupSizeControlFeaturesEXT", createDeviceWithUnsupportedFeaturesTestSubgroupSizeControlFeaturesEXT);
+       addFunctionCase(testGroup, "shader_image_atomic_int64_features_ext", "createDeviceWithUnsupportedFeaturesTestShaderImageAtomicInt64FeaturesEXT", createDeviceWithUnsupportedFeaturesTestShaderImageAtomicInt64FeaturesEXT);
+       addFunctionCase(testGroup, "fragment_shader_interlock_features_ext", "createDeviceWithUnsupportedFeaturesTestFragmentShaderInterlockFeaturesEXT", createDeviceWithUnsupportedFeaturesTestFragmentShaderInterlockFeaturesEXT);
+       addFunctionCase(testGroup, "ycbcr_image_arrays_features_ext", "createDeviceWithUnsupportedFeaturesTestYcbcrImageArraysFeaturesEXT", createDeviceWithUnsupportedFeaturesTestYcbcrImageArraysFeaturesEXT);
+       addFunctionCase(testGroup, "line_rasterization_features_ext", "createDeviceWithUnsupportedFeaturesTestLineRasterizationFeaturesEXT", createDeviceWithUnsupportedFeaturesTestLineRasterizationFeaturesEXT);
+       addFunctionCase(testGroup, "shader_atomic_float_features_ext", "createDeviceWithUnsupportedFeaturesTestShaderAtomicFloatFeaturesEXT", createDeviceWithUnsupportedFeaturesTestShaderAtomicFloatFeaturesEXT);
+       addFunctionCase(testGroup, "index_type_uint8_features_ext", "createDeviceWithUnsupportedFeaturesTestIndexTypeUint8FeaturesEXT", createDeviceWithUnsupportedFeaturesTestIndexTypeUint8FeaturesEXT);
+       addFunctionCase(testGroup, "extended_dynamic_state_features_ext", "createDeviceWithUnsupportedFeaturesTestExtendedDynamicStateFeaturesEXT", createDeviceWithUnsupportedFeaturesTestExtendedDynamicStateFeaturesEXT);
+       addFunctionCase(testGroup, "shader_demote_to_helper_invocation_features_ext", "createDeviceWithUnsupportedFeaturesTestShaderDemoteToHelperInvocationFeaturesEXT", createDeviceWithUnsupportedFeaturesTestShaderDemoteToHelperInvocationFeaturesEXT);
+       addFunctionCase(testGroup, "texel_buffer_alignment_features_ext", "createDeviceWithUnsupportedFeaturesTestTexelBufferAlignmentFeaturesEXT", createDeviceWithUnsupportedFeaturesTestTexelBufferAlignmentFeaturesEXT);
+       addFunctionCase(testGroup, "robustness2_features_ext", "createDeviceWithUnsupportedFeaturesTestRobustness2FeaturesEXT", createDeviceWithUnsupportedFeaturesTestRobustness2FeaturesEXT);
+       addFunctionCase(testGroup, "custom_border_color_features_ext", "createDeviceWithUnsupportedFeaturesTestCustomBorderColorFeaturesEXT", createDeviceWithUnsupportedFeaturesTestCustomBorderColorFeaturesEXT);
+       addFunctionCase(testGroup, "ycbcr2_plane444_formats_features_ext", "createDeviceWithUnsupportedFeaturesTestYcbcr2Plane444FormatsFeaturesEXT", createDeviceWithUnsupportedFeaturesTestYcbcr2Plane444FormatsFeaturesEXT);
+       addFunctionCase(testGroup, "image_robustness_features_ext", "createDeviceWithUnsupportedFeaturesTestImageRobustnessFeaturesEXT", createDeviceWithUnsupportedFeaturesTestImageRobustnessFeaturesEXT);
+       addFunctionCase(testGroup, "4444_formats_features_ext", "createDeviceWithUnsupportedFeaturesTest4444FormatsFeaturesEXT", createDeviceWithUnsupportedFeaturesTest4444FormatsFeaturesEXT);
+       addFunctionCase(testGroup, "vertex_input_dynamic_state_features_ext", "createDeviceWithUnsupportedFeaturesTestVertexInputDynamicStateFeaturesEXT", createDeviceWithUnsupportedFeaturesTestVertexInputDynamicStateFeaturesEXT);
+       addFunctionCase(testGroup, "extended_dynamic_state2_features_ext", "createDeviceWithUnsupportedFeaturesTestExtendedDynamicState2FeaturesEXT", createDeviceWithUnsupportedFeaturesTestExtendedDynamicState2FeaturesEXT);
+       addFunctionCase(testGroup, "color_write_enable_features_ext", "createDeviceWithUnsupportedFeaturesTestColorWriteEnableFeaturesEXT", createDeviceWithUnsupportedFeaturesTestColorWriteEnableFeaturesEXT);
 }