diff --git a/src/vkcv/FeatureManager.cpp b/src/vkcv/FeatureManager.cpp
index 4a96d85a7080a8fcb714ba160a440d652aa28c17..bb331de113294ae6cfbabd19f5fd1be2d2966407 100644
--- a/src/vkcv/FeatureManager.cpp
+++ b/src/vkcv/FeatureManager.cpp
@@ -4,546 +4,222 @@
 #include <string.h>
 
 namespace vkcv {
+
+#define vkcv_check_init_features2(type)\
+type supported;                        \
+vk::PhysicalDeviceFeatures2 query;     \
+query.setPNext(&supported);            \
+m_physicalDevice.getFeatures2(&query)
+
+#define vkcv_check_feature(attribute) {                                                                  \
+  const char *f = reinterpret_cast<const char*>(&(features));                                            \
+  const char *s = reinterpret_cast<const char*>(&(supported));                                           \
+  const vk::Bool32* fb = reinterpret_cast<const vk::Bool32*>(f + offsetof(typeof(features), attribute)); \
+  const vk::Bool32* sb = reinterpret_cast<const vk::Bool32*>(s + offsetof(typeof(features), attribute)); \
+  if ((*fb) && (!*sb)) {                                                                                 \
+    vkcv_log(((required)? LogLevel::ERROR : LogLevel::WARNING),                                          \
+    "Feature '" #attribute "' is not supported");                                                        \
+    return false;                                                                                        \
+  }                                                                                                      \
+}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDevice16BitStorageFeatures &features, bool required) const {
-		vk::PhysicalDevice16BitStorageFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDevice16BitStorageFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.storageBuffer16BitAccess) && (!supported.storageBuffer16BitAccess)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'storageBuffer16BitAccess' is not supported");
-			return false;
-		}
-		
-		if ((features.storageInputOutput16) && (!supported.storageInputOutput16)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'storageInputOutput16' is not supported");
-			return false;
-		}
-		
-		if ((features.storagePushConstant16) && (!supported.storagePushConstant16)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'storagePushConstant16' is not supported");
-			return false;
-		}
-		
-		if ((features.uniformAndStorageBuffer16BitAccess) && (!supported.uniformAndStorageBuffer16BitAccess)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'uniformAndStorageBuffer16BitAccess' is not supported");
-			return false;
-		}
+		vkcv_check_feature(storageBuffer16BitAccess);
+		vkcv_check_feature(storageInputOutput16);
+		vkcv_check_feature(storagePushConstant16);
+		vkcv_check_feature(uniformAndStorageBuffer16BitAccess);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDevice8BitStorageFeatures &features, bool required) const {
-		vk::PhysicalDevice8BitStorageFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.storageBuffer8BitAccess) && (!supported.storageBuffer8BitAccess)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'storageBuffer8BitAccess' is not supported");
-			return false;
-		}
-		
-		if ((features.storagePushConstant8) && (!supported.storagePushConstant8)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'storagePushConstant8' is not supported");
-			return false;
-		}
+		vkcv_check_init_features2(vk::PhysicalDevice8BitStorageFeatures);
 		
-		if ((features.uniformAndStorageBuffer8BitAccess) && (!supported.uniformAndStorageBuffer8BitAccess)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'uniformAndStorageBuffer8BitAccess' is not supported");
-			return false;
-		}
+		vkcv_check_feature(storageBuffer8BitAccess);
+		vkcv_check_feature(storagePushConstant8);
+		vkcv_check_feature(uniformAndStorageBuffer8BitAccess);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceBufferDeviceAddressFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceBufferDeviceAddressFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceBufferDeviceAddressFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.bufferDeviceAddress) && (!supported.bufferDeviceAddress)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'bufferDeviceAddress' is not supported");
-			return false;
-		}
-		
-		if ((features.bufferDeviceAddressCaptureReplay) && (!supported.bufferDeviceAddressCaptureReplay)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'bufferDeviceAddressCaptureReplay' is not supported");
-			return false;
-		}
-		
-		if ((features.bufferDeviceAddressMultiDevice) && (!supported.bufferDeviceAddressMultiDevice)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'bufferDeviceAddressMultiDevice' is not supported");
-			return false;
-		}
+		vkcv_check_feature(bufferDeviceAddress);
+		vkcv_check_feature(bufferDeviceAddressCaptureReplay);
+		vkcv_check_feature(bufferDeviceAddressMultiDevice);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceDescriptorIndexingFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceDescriptorIndexingFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.shaderInputAttachmentArrayDynamicIndexing) &&
-			(!supported.shaderInputAttachmentArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderInputAttachmentArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderInputAttachmentArrayNonUniformIndexing) &&
-			(!supported.shaderInputAttachmentArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderInputAttachmentArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderSampledImageArrayNonUniformIndexing) &&
-			(!supported.shaderSampledImageArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderSampledImageArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderStorageBufferArrayNonUniformIndexing) &&
-			(!supported.shaderStorageBufferArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageBufferArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderStorageImageArrayNonUniformIndexing) &&
-			(!supported.shaderStorageImageArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderStorageTexelBufferArrayDynamicIndexing) &&
-			(!supported.shaderStorageTexelBufferArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageTexelBufferArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderStorageTexelBufferArrayNonUniformIndexing) &&
-			(!supported.shaderStorageTexelBufferArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageTexelBufferArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderUniformBufferArrayNonUniformIndexing) &&
-			(!supported.shaderUniformBufferArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderUniformBufferArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderUniformTexelBufferArrayDynamicIndexing) &&
-			(!supported.shaderUniformTexelBufferArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderUniformTexelBufferArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderUniformTexelBufferArrayNonUniformIndexing) &&
-			(!supported.shaderUniformTexelBufferArrayNonUniformIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderUniformTexelBufferArrayNonUniformIndexing' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingPartiallyBound) && (!supported.descriptorBindingPartiallyBound)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingPartiallyBound' is not supported");
-			return false;
-		}
-		
-		
-		if ((features.descriptorBindingSampledImageUpdateAfterBind) &&
-			(!supported.descriptorBindingSampledImageUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingSampledImageUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingStorageBufferUpdateAfterBind) &&
-			(!supported.descriptorBindingStorageBufferUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingStorageBufferUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingStorageImageUpdateAfterBind) &&
-			(!supported.descriptorBindingStorageImageUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingStorageImageUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingStorageTexelBufferUpdateAfterBind) &&
-			(!supported.descriptorBindingStorageTexelBufferUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingStorageTexelBufferUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingUniformBufferUpdateAfterBind) &&
-			(!supported.descriptorBindingUniformBufferUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingUniformBufferUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingUniformTexelBufferUpdateAfterBind) &&
-			(!supported.descriptorBindingUniformTexelBufferUpdateAfterBind)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingUniformTexelBufferUpdateAfterBind' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingUpdateUnusedWhilePending) &&
-			(!supported.descriptorBindingUpdateUnusedWhilePending)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingUpdateUnusedWhilePending' is not supported");
-			return false;
-		}
-		
-		if ((features.descriptorBindingVariableDescriptorCount) &&
-			(!supported.descriptorBindingVariableDescriptorCount)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'descriptorBindingVariableDescriptorCount' is not supported");
-			return false;
-		}
-		
-		if ((features.runtimeDescriptorArray) && (!supported.runtimeDescriptorArray)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'runtimeDescriptorArray' is not supported");
-			return false;
-		}
+		vkcv_check_init_features2(vk::PhysicalDeviceDescriptorIndexingFeatures);
+		
+		vkcv_check_feature(shaderInputAttachmentArrayDynamicIndexing);
+		vkcv_check_feature(shaderInputAttachmentArrayNonUniformIndexing);
+		vkcv_check_feature(shaderSampledImageArrayNonUniformIndexing);
+		vkcv_check_feature(shaderStorageBufferArrayNonUniformIndexing);
+		vkcv_check_feature(shaderStorageImageArrayNonUniformIndexing);
+		vkcv_check_feature(shaderStorageTexelBufferArrayDynamicIndexing);
+		vkcv_check_feature(shaderStorageTexelBufferArrayNonUniformIndexing);
+		vkcv_check_feature(shaderUniformBufferArrayNonUniformIndexing);
+		vkcv_check_feature(shaderUniformTexelBufferArrayDynamicIndexing);
+		vkcv_check_feature(shaderUniformTexelBufferArrayNonUniformIndexing);
+		vkcv_check_feature(descriptorBindingPartiallyBound);
+		vkcv_check_feature(descriptorBindingSampledImageUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingStorageBufferUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingStorageImageUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingStorageTexelBufferUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingUniformBufferUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingUniformTexelBufferUpdateAfterBind);
+		vkcv_check_feature(descriptorBindingUpdateUnusedWhilePending);
+		vkcv_check_feature(descriptorBindingVariableDescriptorCount);
+		vkcv_check_feature(runtimeDescriptorArray);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceHostQueryResetFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceHostQueryResetFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceHostQueryResetFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.hostQueryReset) && (!supported.hostQueryReset)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'hostQueryReset' is not supported");
-			return false;
-		}
+		vkcv_check_feature(hostQueryReset);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceImagelessFramebufferFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceImagelessFramebufferFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceImagelessFramebufferFeatures);
 		
-		if ((features.imagelessFramebuffer) && (!supported.imagelessFramebuffer)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'imagelessFramebuffer' is not supported");
-			return false;
-		}
+		vkcv_check_feature(imagelessFramebuffer);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceMultiviewFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceMultiviewFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceMultiviewFeatures);
 		
-		if ((features.multiview) && (!supported.multiview)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'multiview' is not supported");
-			return false;
-		}
-		
-		if ((features.multiviewGeometryShader) && (!supported.multiviewGeometryShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'multiviewGeometryShader' is not supported");
-			return false;
-		}
-		
-		if ((features.multiviewTessellationShader) && (!supported.multiviewTessellationShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'multiviewTessellationShader' is not supported");
-			return false;
-		}
+		vkcv_check_feature(multiview);
+		vkcv_check_feature(multiviewGeometryShader);
+		vkcv_check_feature(multiviewTessellationShader);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceProtectedMemoryFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceProtectedMemoryFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceProtectedMemoryFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.protectedMemory) && (!supported.protectedMemory)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'protectedMemory' is not supported");
-			return false;
-		}
+		vkcv_check_feature(protectedMemory);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceSamplerYcbcrConversionFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceSamplerYcbcrConversionFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.samplerYcbcrConversion) && (!supported.samplerYcbcrConversion)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'samplerYcbcrConversion' is not supported");
-			return false;
-		}
+		vkcv_check_init_features2(vk::PhysicalDeviceSamplerYcbcrConversionFeatures);
+
+		vkcv_check_feature(samplerYcbcrConversion);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceScalarBlockLayoutFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceScalarBlockLayoutFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceScalarBlockLayoutFeatures);
 		
-		if ((features.scalarBlockLayout) && (!supported.scalarBlockLayout)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'scalarBlockLayout' is not supported");
-			return false;
-		}
+		vkcv_check_feature(scalarBlockLayout);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceSeparateDepthStencilLayoutsFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceSeparateDepthStencilLayoutsFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceSeparateDepthStencilLayoutsFeatures);
 		
-		if ((features.separateDepthStencilLayouts) && (!supported.separateDepthStencilLayouts)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'separateDepthStencilLayouts' is not supported");
-			return false;
-		}
+		vkcv_check_feature(separateDepthStencilLayouts);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceShaderAtomicInt64Features &features,
 									  bool required) const {
-		vk::PhysicalDeviceShaderAtomicInt64Features supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceShaderAtomicInt64Features);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.shaderBufferInt64Atomics) && (!supported.shaderBufferInt64Atomics)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderBufferInt64Atomics' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderSharedInt64Atomics) && (!supported.shaderSharedInt64Atomics)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderSharedInt64Atomics' is not supported");
-			return false;
-		}
+		vkcv_check_feature(shaderBufferInt64Atomics);
+		vkcv_check_feature(shaderSharedInt64Atomics);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceShaderFloat16Int8Features &features, bool required) const {
-		vk::PhysicalDeviceShaderFloat16Int8Features supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceShaderFloat16Int8Features);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.shaderFloat16) && (!supported.shaderFloat16)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderFloat16' is not supported");
-			return false;
-		}
-		
-		if ((features.shaderInt8) && (!supported.shaderInt8)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderInt8' is not supported");
-			return false;
-		}
+		vkcv_check_feature(shaderFloat16);
+		vkcv_check_feature(shaderInt8);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceShaderSubgroupExtendedTypesFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceShaderSubgroupExtendedTypesFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceShaderSubgroupExtendedTypesFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.shaderSubgroupExtendedTypes) && (!supported.shaderSubgroupExtendedTypes)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderSubgroupExtendedTypes' is not supported");
-			return false;
-		}
+		vkcv_check_feature(shaderSubgroupExtendedTypes);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceTimelineSemaphoreFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceTimelineSemaphoreFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceTimelineSemaphoreFeatures);
 		
-		if ((features.timelineSemaphore) && (!supported.timelineSemaphore)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'timelineSemaphore' is not supported");
-			return false;
-		}
+		vkcv_check_feature(timelineSemaphore);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceUniformBufferStandardLayoutFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceUniformBufferStandardLayoutFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
+		vkcv_check_init_features2(vk::PhysicalDeviceUniformBufferStandardLayoutFeatures);
 		
-		if ((features.uniformBufferStandardLayout) && (!supported.uniformBufferStandardLayout)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'uniformBufferStandardLayout' is not supported");
-			return false;
-		}
+		vkcv_check_feature(uniformBufferStandardLayout);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceVariablePointersFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceVariablePointersFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceVariablePointersFeatures);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.variablePointers) && (!supported.variablePointers)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'variablePointers' is not supported");
-			return false;
-		}
-		
-		if ((features.variablePointersStorageBuffer) && (!supported.variablePointersStorageBuffer)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'variablePointersStorageBuffer' is not supported");
-			return false;
-		}
+		vkcv_check_feature(variablePointers);
+		vkcv_check_feature(variablePointersStorageBuffer);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceVulkanMemoryModelFeatures &features,
 									  bool required) const {
-		vk::PhysicalDeviceVulkanMemoryModelFeatures supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
-		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.vulkanMemoryModel) && (!supported.vulkanMemoryModel)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'vulkanMemoryModel' is not supported");
-			return false;
-		}
+		vkcv_check_init_features2(vk::PhysicalDeviceVulkanMemoryModelFeatures);
 		
-		if ((features.vulkanMemoryModelDeviceScope) && (!supported.vulkanMemoryModelDeviceScope)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'vulkanMemoryModelDeviceScope' is not supported");
-			return false;
-		}
-		
-		if ((features.vulkanMemoryModelAvailabilityVisibilityChains) &&
-			(!supported.vulkanMemoryModelAvailabilityVisibilityChains)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'vulkanMemoryModelAvailabilityVisibilityChains' is not supported");
-			return false;
-		}
+		vkcv_check_feature(vulkanMemoryModel);
+		vkcv_check_feature(vulkanMemoryModelDeviceScope);
+		vkcv_check_feature(vulkanMemoryModelAvailabilityVisibilityChains);
 		
 		return true;
 	}
 	
 	bool FeatureManager::checkSupport(const vk::PhysicalDeviceMeshShaderFeaturesNV &features, bool required) const {
-		vk::PhysicalDeviceMeshShaderFeaturesNV supported;
-		vk::PhysicalDeviceFeatures2 query;
-		query.setPNext(&supported);
+		vkcv_check_init_features2(vk::PhysicalDeviceMeshShaderFeaturesNV);
 		
-		m_physicalDevice.getFeatures2(&query);
-		
-		if ((features.taskShader) && (!supported.taskShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'taskShader' is not supported");
-			return false;
-		}
-		
-		if ((features.meshShader) && (!supported.meshShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'meshShader' is not supported");
-			return false;
-		}
+		vkcv_check_feature(taskShader);
+		vkcv_check_feature(meshShader);
 		
 		return true;
 	}
@@ -665,346 +341,64 @@ namespace vkcv {
 									 bool required) {
 		featureFunction(m_featuresBase.features);
 		
+		const auto& features = m_featuresBase.features;
 		const auto& supported = m_physicalDevice.getFeatures();
 		
-		if ((m_featuresBase.features.alphaToOne) && (!supported.alphaToOne)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'alphaToOne' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.depthBiasClamp) && (!supported.depthBiasClamp)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'depthBiasClamp' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.depthBounds) && (!supported.depthBounds)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'depthBounds' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.depthClamp) && (!supported.depthClamp)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'depthClamp' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.drawIndirectFirstInstance) && (!supported.drawIndirectFirstInstance)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'drawIndirectFirstInstance' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.dualSrcBlend) && (!supported.dualSrcBlend)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'dualSrcBlend' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.fillModeNonSolid) && (!supported.fillModeNonSolid)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'fillModeNonSolid' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.fragmentStoresAndAtomics) && (!supported.fragmentStoresAndAtomics)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'fragmentStoresAndAtomics' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.fullDrawIndexUint32) && (!supported.fullDrawIndexUint32)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'fullDrawIndexUint32' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.geometryShader) && (!supported.geometryShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'geometryShader' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.imageCubeArray) && (!supported.imageCubeArray)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'imageCubeArray' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.independentBlend) && (!supported.independentBlend)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'independentBlend' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.inheritedQueries) && (!supported.inheritedQueries)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'inheritedQueries' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.largePoints) && (!supported.largePoints)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'largePoints' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.logicOp) && (!supported.logicOp)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'logicOp' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.multiDrawIndirect) && (!supported.multiDrawIndirect)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'multiDrawIndirect' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.multiViewport) && (!supported.multiViewport)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'multiViewport' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.occlusionQueryPrecise) && (!supported.occlusionQueryPrecise)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'occlusionQueryPrecise' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.pipelineStatisticsQuery) && (!supported.pipelineStatisticsQuery)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'pipelineStatisticsQuery' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.robustBufferAccess) && (!supported.robustBufferAccess)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'robustBufferAccess' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sampleRateShading) && (!supported.sampleRateShading)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sampleRateShading' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.samplerAnisotropy) && (!supported.samplerAnisotropy)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'samplerAnisotropy' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderClipDistance) && (!supported.shaderClipDistance)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderClipDistance' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderCullDistance) && (!supported.shaderCullDistance)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderCullDistance' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderFloat64) && (!supported.shaderFloat64)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderFloat64' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderImageGatherExtended) && (!supported.shaderImageGatherExtended)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderImageGatherExtended' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderInt16) && (!supported.shaderInt16)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderInt16' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderInt64) && (!supported.shaderInt64)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderInt64' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderResourceMinLod) && (!supported.shaderResourceMinLod)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderResourceMinLod' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderResourceResidency) && (!supported.shaderResourceResidency)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderResourceResidency' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderSampledImageArrayDynamicIndexing) &&
-			(!supported.shaderSampledImageArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderSampledImageArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageBufferArrayDynamicIndexing) &&
-			(!supported.shaderStorageBufferArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageBufferArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageImageArrayDynamicIndexing) &&
-			(!supported.shaderStorageImageArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageImageExtendedFormats) &&
-			(!supported.shaderStorageImageExtendedFormats)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageExtendedFormats' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageImageMultisample) &&
-			(!supported.shaderStorageImageMultisample)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageMultisample' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageImageReadWithoutFormat) &&
-			(!supported.shaderStorageImageReadWithoutFormat)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageReadWithoutFormat' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderStorageImageWriteWithoutFormat) &&
-			(!supported.shaderStorageImageWriteWithoutFormat)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderStorageImageWriteWithoutFormat' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderTessellationAndGeometryPointSize) &&
-			(!supported.shaderTessellationAndGeometryPointSize)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderTessellationAndGeometryPointSize' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.shaderUniformBufferArrayDynamicIndexing) &&
-			(!supported.shaderUniformBufferArrayDynamicIndexing)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'shaderUniformBufferArrayDynamicIndexing' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseBinding) && (!supported.sparseBinding)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseBinding' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidency2Samples) && (!supported.sparseResidency2Samples)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidency2Samples' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidency4Samples) && (!supported.sparseResidency4Samples)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidency4Samples' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidency8Samples) && (!supported.sparseResidency8Samples)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidency8Samples' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidency16Samples) && (!supported.sparseResidency16Samples)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidency16Samples' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidencyAliased) && (!supported.sparseResidencyAliased)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidencyAliased' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidencyBuffer) && (!supported.sparseResidencyBuffer)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidencyBuffer' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidencyImage2D) && (!supported.sparseResidencyImage2D)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidencyImage2D' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.sparseResidencyImage3D) && (!supported.sparseResidencyImage3D)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'sparseResidencyImage2D' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.tessellationShader) && (!supported.tessellationShader)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'tessellationShader' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.textureCompressionASTC_LDR) && (!supported.textureCompressionASTC_LDR)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'textureCompressionASTC_LDR' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.textureCompressionBC) && (!supported.textureCompressionBC)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'textureCompressionBC' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.textureCompressionETC2) && (!supported.textureCompressionETC2)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'textureCompressionETC2' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.variableMultisampleRate) && (!supported.variableMultisampleRate)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'variableMultisampleRate' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.vertexPipelineStoresAndAtomics) && (!supported.vertexPipelineStoresAndAtomics)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'vertexPipelineStoresAndAtomics' is not supported");
-			return false;
-		}
-		
-		if ((m_featuresBase.features.wideLines) && (!supported.wideLines)) {
-			vkcv_log((required? LogLevel::ERROR : LogLevel::WARNING),
-					 "Feature 'wideLines' is not supported");
-			return false;
-		}
+		vkcv_check_feature(alphaToOne);
+		vkcv_check_feature(depthBiasClamp);
+		vkcv_check_feature(depthBounds);
+		vkcv_check_feature(depthClamp);
+		vkcv_check_feature(drawIndirectFirstInstance);
+		vkcv_check_feature(dualSrcBlend);
+		vkcv_check_feature(fillModeNonSolid);
+		vkcv_check_feature(fragmentStoresAndAtomics);
+		vkcv_check_feature(fullDrawIndexUint32);
+		vkcv_check_feature(geometryShader);
+		vkcv_check_feature(imageCubeArray);
+		vkcv_check_feature(independentBlend);
+		vkcv_check_feature(inheritedQueries);
+		vkcv_check_feature(largePoints);
+		vkcv_check_feature(logicOp);
+		vkcv_check_feature(multiDrawIndirect);
+		vkcv_check_feature(multiViewport);
+		vkcv_check_feature(occlusionQueryPrecise);
+		vkcv_check_feature(pipelineStatisticsQuery);
+		vkcv_check_feature(robustBufferAccess);
+		vkcv_check_feature(sampleRateShading);
+		vkcv_check_feature(samplerAnisotropy);
+		vkcv_check_feature(shaderClipDistance);
+		vkcv_check_feature(shaderCullDistance);
+		vkcv_check_feature(shaderFloat64);
+		vkcv_check_feature(shaderImageGatherExtended);
+		vkcv_check_feature(shaderInt16);
+		vkcv_check_feature(shaderInt64);
+		vkcv_check_feature(shaderResourceMinLod);
+		vkcv_check_feature(shaderResourceResidency);
+		vkcv_check_feature(shaderSampledImageArrayDynamicIndexing);
+		vkcv_check_feature(shaderStorageBufferArrayDynamicIndexing);
+		vkcv_check_feature(shaderStorageImageArrayDynamicIndexing);
+		vkcv_check_feature(shaderStorageImageExtendedFormats);
+		vkcv_check_feature(shaderStorageImageMultisample);
+		vkcv_check_feature(shaderStorageImageReadWithoutFormat);
+		vkcv_check_feature(shaderStorageImageWriteWithoutFormat);
+		vkcv_check_feature(shaderTessellationAndGeometryPointSize);
+		vkcv_check_feature(shaderUniformBufferArrayDynamicIndexing);
+		vkcv_check_feature(sparseBinding);
+		vkcv_check_feature(sparseResidency2Samples);
+		vkcv_check_feature(sparseResidency4Samples);
+		vkcv_check_feature(sparseResidency8Samples);
+		vkcv_check_feature(sparseResidency16Samples);
+		vkcv_check_feature(sparseResidencyAliased);
+		vkcv_check_feature(sparseResidencyBuffer);
+		vkcv_check_feature(sparseResidencyImage2D);
+		vkcv_check_feature(sparseResidencyImage3D);
+		vkcv_check_feature(tessellationShader);
+		vkcv_check_feature(textureCompressionASTC_LDR);
+		vkcv_check_feature(textureCompressionBC);
+		vkcv_check_feature(textureCompressionETC2);
+		vkcv_check_feature(variableMultisampleRate);
+		vkcv_check_feature(vertexPipelineStoresAndAtomics);
+		vkcv_check_feature(wideLines);
 		
 		return true;
 	}