Merge pull request #1151 from cdavis5e/ios-family-7

Enable some family 7 features on iOS.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index 0d51bc0..19c16cb 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -607,7 +607,7 @@
 			if (mvkFmt == kMVKFormatDepthStencil ||
 				isChromaSubsampled
 #if MVK_IOS_OR_TVOS
-				|| mvkFmt == kMVKFormatCompressed
+				|| (mvkFmt == kMVKFormatCompressed && !_metalFeatures.native3DCompressedTextures)
 #endif
 				) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
@@ -618,6 +618,24 @@
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
 #endif
+#if MVK_IOS_OR_TVOS || MVK_MACOS_APPLE_SILICON
+			// ETC2 and EAC formats aren't supported for 3D textures.
+			switch (format) {
+				case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
+				case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
+				case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
+				case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
+				case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
+				case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
+				case VK_FORMAT_EAC_R11_UNORM_BLOCK:
+				case VK_FORMAT_EAC_R11_SNORM_BLOCK:
+				case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
+				case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
+					return VK_ERROR_FORMAT_NOT_SUPPORTED;
+				default:
+					break;
+			}
+#endif
 			maxExt.width = pLimits->maxImageDimension3D;
 			maxExt.height = pLimits->maxImageDimension3D;
 			maxExt.depth = pLimits->maxImageDimension3D;
@@ -1179,6 +1197,9 @@
 	if ( mvkOSVersionIsAtLeast(13.0) ) {
 		_metalFeatures.mslVersionEnum = MTLLanguageVersion2_2;
 		_metalFeatures.placementHeaps = useMTLHeaps;
+		if (supportsMTLGPUFamily(Apple3)) {
+			_metalFeatures.native3DCompressedTextures = true;
+		}
 		if (supportsMTLGPUFamily(Apple4)) {
 			_metalFeatures.nativeTextureSwizzle = true;
 		}
@@ -1265,6 +1286,9 @@
 	if ( mvkOSVersionIsAtLeast(13.0) ) {
 		_metalFeatures.mslVersionEnum = MTLLanguageVersion2_2;
 		_metalFeatures.placementHeaps = useMTLHeaps;
+		if (supportsMTLGPUFamily(Apple3)) {
+			_metalFeatures.native3DCompressedTextures = true;
+		}
 		if (supportsMTLGPUFamily(Apple4)) {
 			_metalFeatures.nativeTextureSwizzle = true;
 		}
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
index 5f36214..c2b6dbb 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
@@ -1017,21 +1017,6 @@
 	bool isCompressed = pixFmts->getFormatType(pCreateInfo->format) == kMVKFormatCompressed;
 	bool isChromaSubsampled = pixFmts->getChromaSubsamplingPlaneCount(pCreateInfo->format) > 0;
 
-#if MVK_IOS_OR_TVOS
-	if (isCompressed && !is2D) {
-		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, compressed formats may only be used with 2D images."));
-	}
-#endif
-#if MVK_MACOS
-	if (isCompressed && !is2D) {
-		if (getImageType() != VK_IMAGE_TYPE_3D) {
-			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, compressed formats may only be used with 2D or 3D images."));
-		} else if (!_device->_pMetalFeatures->native3DCompressedTextures && !mvkCanDecodeFormat(pCreateInfo->format)) {
-			setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, the %s compressed format may only be used with 2D images.", getPixelFormats()->getName(pCreateInfo->format)));
-		}
-	}
-#endif
-
 	if (isChromaSubsampled && !is2D) {
 		setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, chroma subsampled formats may only be used with 2D images."));
 	}