+bool isPhysicalDeviceFeatures2Supported (const vector<string>& instanceExtensions)
+{
+ return de::contains(instanceExtensions.begin(), instanceExtensions.end(), "VK_KHR_get_physical_device_properties2");
+}
+
+struct DeviceFeatures
+{
+ VkPhysicalDeviceFeatures2KHR coreFeatures;
+ VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR samplerYCbCrConversionFeatures;
+
+ DeviceFeatures (const InstanceInterface& vki,
+ VkPhysicalDevice physicalDevice,
+ const vector<string>& instanceExtensions,
+ const vector<string>& deviceExtensions)
+ {
+ void** curExtPoint = &coreFeatures.pNext;
+
+ deMemset(&coreFeatures, 0, sizeof(coreFeatures));
+ deMemset(&samplerYCbCrConversionFeatures, 0, sizeof(samplerYCbCrConversionFeatures));
+
+ coreFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
+ samplerYCbCrConversionFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;
+
+ if (isPhysicalDeviceFeatures2Supported(instanceExtensions))
+ {
+ if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion"))
+ {
+ *curExtPoint = &samplerYCbCrConversionFeatures;
+ curExtPoint = &samplerYCbCrConversionFeatures.pNext;
+ }
+
+ vki.getPhysicalDeviceFeatures2KHR(physicalDevice, &coreFeatures);
+ }
+ else
+ coreFeatures.features = getPhysicalDeviceFeatures(vki, physicalDevice);
+
+ // Disable robustness by default, as it has an impact on performance on some HW.
+ coreFeatures.features.robustBufferAccess = false;
+ }
+};
+
+} // anonymous
+