Merge pull request #329 from cdavis5e/destroyed-resource-descset

Remove destroyed resources from descriptor sets.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
index 992d96c..f67db69 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
@@ -545,7 +545,7 @@
 		29B97313FDCFA39411CA2CEA /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				TargetAttributes = {
 					A977BCBD1B66BB010067E5BF = {
 						DevelopmentTeam = VU3TCKU48B;
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
index 8e53cef..1887f1d 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
index 38b5668..14c3d3c 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
index d3f84da..4c747e6 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
@@ -234,7 +234,7 @@
 		29B97313FDCFA39411CA2CEA /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				TargetAttributes = {
 					A9B53B0F1C3AC0BE00ABC6F6 = {
 						DevelopmentTeam = VU3TCKU48B;
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
index 8177308..ead24ce 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
index 8d847fa..e83df29 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
index e1db4ad..1b654fc 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
@@ -283,7 +283,7 @@
 		29B97313FDCFA39411CA2CEA /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				TargetAttributes = {
 					A977BCBD1B66BB010067E5BF = {
 						DevelopmentTeam = VU3TCKU48B;
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
index d5def97..d911a11 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
index 83e3055..62aa74b 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 02af572..f729bf0 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -12,6 +12,22 @@
 For best results, use a Markdown reader.*
 
 
+MoltenVK 1.0.26
+---------------
+
+Released 2018/11/06
+
+- Fix memoryTypes order to match Vulkan spec.
+- Allow linear images to use host-coherent memory.
+- Generate Bitcode in iOS libraries.
+- Allow all pipeline attachements to be unused.
+- Perform usage checks on 3D images.
+- Enhancements to dylib generation script.
+- Update to latest SPIRV-Cross version:
+	- MSL: Support 8 & 16 bit types.
+	- MSL: Updated spec constant support.
+
+
 MoltenVK 1.0.25
 ---------------
 
diff --git a/ExternalRevisions/README.md b/ExternalRevisions/README.md
index 50439fb..4fb82ce 100644
--- a/ExternalRevisions/README.md
+++ b/ExternalRevisions/README.md
@@ -126,12 +126,16 @@
 		spirv_cfg.cpp
 		spirv_cfg.hpp
 		spirv_common.hpp
+		spirv_cross_parsed_ir.cpp
+		spirv_cross_parsed_ir.hpp
 		spirv_cross.cpp
 		spirv_cross.hpp
 		spirv_glsl.cpp
 		spirv_glsl.hpp
 		spirv_msl.cpp
 		spirv_msl.hpp
+		spirv_parser.cpp
+		spirv_parser.hpp
 
    In the ***Choose options for adding these files*** dialog that opens, select the 
    ***Create groups*** option, add the files to *both* the `MoltenVKSPIRVToMSLConverter-iOS` 
diff --git a/ExternalRevisions/SPIRV-Cross_repo_revision b/ExternalRevisions/SPIRV-Cross_repo_revision
index 6ab048f..5d4511b 100644
--- a/ExternalRevisions/SPIRV-Cross_repo_revision
+++ b/ExternalRevisions/SPIRV-Cross_repo_revision
@@ -1 +1 @@
-cc5c0204d8bcdadbb4add03e53346df98bf27fa4
+daaffc4717cad9fbeb8848867f38a732120c6317
diff --git a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
index 474310a..d7ee478 100644
--- a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
+++ b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
@@ -752,7 +752,7 @@
 		A9F55D25198BE6A7004EC31B /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				ORGANIZATIONNAME = "The Brenwill Workshop Ltd.";
 				TargetAttributes = {
 					A9B8EE091A98D796009C5A02 = {
@@ -875,7 +875,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"macosx\"\nexport MVK_ARCH=\"x86_64\"\nexport MVK_UX_FWK=\"AppKit\"\nexport MVK_MIN_OS_VERSION=${MACOSX_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
+			shellScript = "export MVK_OS=\"macosx\"\nexport MVK_UX_FWK=\"AppKit\"\nexport MVK_MIN_OS_VERSION=${MACOSX_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
 		};
 		A9731FAD1EDDAE39006B7298 /* Create Dynamic Library */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -889,7 +889,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"ios\"\nexport MVK_ARCH=\"arm64\"\nexport MVK_UX_FWK=\"UIKit\"\nexport MVK_MIN_OS_VERSION=${IPHONEOS_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n# Do not link to IOSurface if deploying to iOS versions below 11.0, doing so will\n# link IOSurface as a private framework, which will trigger App Store rejection.\nif [ $(echo \"${MVK_MIN_OS_VERSION} < 11.0\" | bc) -eq 1 ]; then\n    MVK_IOSURFACE_FWK=\"\"\nfi\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
+			shellScript = "export MVK_OS=\"ios\"\nexport MVK_UX_FWK=\"UIKit\"\nexport MVK_MIN_OS_VERSION=${IPHONEOS_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n# Do not link to IOSurface if deploying to iOS versions below 11.0, doing so will\n# link IOSurface as a private framework, which will trigger App Store rejection.\nif [ $(echo \"${MVK_MIN_OS_VERSION} < 11.0\" | bc) -eq 1 ]; then\n    MVK_IOSURFACE_FWK=\"\"\nfi\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -1017,6 +1017,7 @@
 		A9B8EE1E1A98D796009C5A02 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -1027,6 +1028,7 @@
 		A9B8EE1F1A98D796009C5A02 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
index 678103b..4c6b225 100644
--- a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
+++ b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
index 9c9303c..64ec327 100644
--- a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
+++ b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVK/MoltenVK/API/mvk_datatypes.h b/MoltenVK/MoltenVK/API/mvk_datatypes.h
index 8925dbc..ce40015 100644
--- a/MoltenVK/MoltenVK/API/mvk_datatypes.h
+++ b/MoltenVK/MoltenVK/API/mvk_datatypes.h
@@ -413,6 +413,9 @@
 /** Macro indicating the Vulkan memory type bits corresponding to Metal shared memory (host visible and coherent). */
 #define MVK_VK_MEMORY_TYPE_METAL_SHARED		(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
 
+/** Macro indicating the Vulkan memory type bits corresponding to Metal memoryless memory (not host visible and lazily allocated). */
+#define MVK_VK_MEMORY_TYPE_METAL_MEMORYLESS	(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
+
 /** Returns the Metal storage mode corresponding to the specified Vulkan memory flags. */
 MTLStorageMode mvkMTLStorageModeFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags);
 
diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
index 3af0826..4c725bb 100644
--- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
+++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
@@ -48,7 +48,7 @@
  */
 #define MVK_VERSION_MAJOR   1
 #define MVK_VERSION_MINOR   0
-#define MVK_VERSION_PATCH   25
+#define MVK_VERSION_PATCH   26
 
 #define MVK_MAKE_VERSION(major, minor, patch)    (((major) * 10000) + ((minor) * 100) + (patch))
 #define MVK_VERSION     MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH)
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
index 3953637..35ebe11 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
@@ -233,7 +233,7 @@
 	setSubpass(contents, _renderSubpassIndex + 1);
 }
 
-/** Sets the current render subpass to the subpass with the specified index. */
+// Sets the current render subpass to the subpass with the specified index.
 void MVKCommandEncoder::setSubpass(VkSubpassContents subpassContents, uint32_t subpassIndex) {
 	_subpassContents = subpassContents;
 	_renderSubpassIndex = subpassIndex;
@@ -241,8 +241,7 @@
     beginMetalRenderPass();
 }
 
-// Called after the _mtlRenderEncoder is established.
-// Marks cached render state as dirty so it will be set into the _mtlRenderEncoder.
+// Creates _mtlRenderEncoder and marks cached render state as dirty so it will be set into the _mtlRenderEncoder.
 void MVKCommandEncoder::beginMetalRenderPass() {
 
     endCurrentMetalEncoding();
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
index 7a396d9..c346ba3 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
@@ -33,6 +33,10 @@
 	pMemoryRequirements->size = getByteCount();
 	pMemoryRequirements->alignment = _byteAlignment;
 	pMemoryRequirements->memoryTypeBits = _device->getPhysicalDevice()->getAllMemoryTypes();
+#if MVK_IOS
+	// Memoryless storage is not allowed for buffers
+	mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getLazilyAllocatedMemoryTypes());
+#endif
 	return VK_SUCCESS;
 }
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
index d91ede3..213c690 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
@@ -218,11 +218,23 @@
 	inline uint32_t getHostVisibleMemoryTypes() { return _hostVisibleMemoryTypes; }
 
 	/**
+	 * Returns a bit mask of all memory type indices that are coherent between host and device.
+	 * Each bit [0..31] in the returned bit mask indicates a distinct memory type.
+	 */
+	inline uint32_t getHostCoherentMemoryTypes() { return _hostCoherentMemoryTypes; }
+
+	/**
 	 * Returns a bit mask of all memory type indices that do NOT allow host visibility to the memory.
 	 * Each bit [0..31] in the returned bit mask indicates a distinct memory type.
 	 */
 	inline uint32_t getPrivateMemoryTypes() { return _privateMemoryTypes; }
 
+	/**
+	 * Returns a bit mask of all memory type indices that are lazily allocated.
+	 * Each bit [0..31] in the returned bit mask indicates a distinct memory type.
+	 */
+	inline uint32_t getLazilyAllocatedMemoryTypes() { return _lazilyAllocatedMemoryTypes; }
+
 	
 #pragma mark Metal
 
@@ -277,7 +289,9 @@
 	std::vector<MVKQueueFamily*> _queueFamilies;
 	uint32_t _allMemoryTypes;
 	uint32_t _hostVisibleMemoryTypes;
+	uint32_t _hostCoherentMemoryTypes;
 	uint32_t _privateMemoryTypes;
+	uint32_t _lazilyAllocatedMemoryTypes;
 };
 
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index d4ee513..4c22229 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -177,6 +177,10 @@
 			if (tiling == VK_IMAGE_TILING_LINEAR) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
+			// Metal does not allow compressed formats on 1D textures
+			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatNone) {
+				return VK_ERROR_FORMAT_NOT_SUPPORTED;
+			}
             maxExt.width = pLimits->maxImageDimension1D;
             maxExt.height = 1;
             maxExt.depth = 1;
@@ -207,6 +211,10 @@
 				// - They may not be multisampled.
 				sampleCounts = VK_SAMPLE_COUNT_1_BIT;
 			} else {
+				// Compressed multisampled textures aren't supported.
+				if (mvkFormatTypeFromVkFormat(format) == kMVKFormatNone) {
+					sampleCounts = VK_SAMPLE_COUNT_1_BIT;
+				}
 				maxLevels = mvkMipmapLevels3D(maxExt);
 				maxLayers = pLimits->maxImageArrayLayers;
 			}
@@ -216,6 +224,10 @@
             if (tiling == VK_IMAGE_TILING_LINEAR) {
                 return VK_ERROR_FORMAT_NOT_SUPPORTED;
             }
+            // Metal does not allow compressed formats on 3D textures
+            if (mvkFormatTypeFromVkFormat(format) == kMVKFormatNone) {
+                return VK_ERROR_FORMAT_NOT_SUPPORTED;
+            }
             maxExt.width = pLimits->maxImageDimension3D;
             maxExt.height = pLimits->maxImageDimension3D;
             maxExt.depth = pLimits->maxImageDimension3D;
@@ -227,6 +239,10 @@
 			if (tiling == VK_IMAGE_TILING_LINEAR) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
+			// Metal does not allow compressed formats on anything but 2D textures
+			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatNone) {
+				return VK_ERROR_FORMAT_NOT_SUPPORTED;
+			}
             maxExt = { 1, 1, 1};
             maxLayers = 1;
 			maxLevels = 1;
@@ -1061,6 +1077,13 @@
 	//		- encoder synchronizeResource: followed by
 	//		- cmdbuff waitUntilCompleted (or completion handler)
 	//		- buffer/texture getBytes:
+	// Metal Memoryless:
+	//	- applies only to textures used as transient render targets
+	//	- only available with TBDR devices (i.e. on iOS)
+	//	- no device memory is reserved at all
+	//	- storage comes from tile memory
+	//	- contents are undefined after rendering
+	//	- use for temporary renderable textures
 
     _memoryProperties = (VkPhysicalDeviceMemoryProperties){
         .memoryHeapCount = 1,
@@ -1086,20 +1109,36 @@
                 .heapIndex = 0,
                 .propertyFlags = MVK_VK_MEMORY_TYPE_METAL_SHARED,    // Shared storage
             },
+#if MVK_IOS
+            {
+                .heapIndex = 0,
+                .propertyFlags = MVK_VK_MEMORY_TYPE_METAL_MEMORYLESS,    // Memoryless storage
+            },
+#endif
         },
     };
 
 #if MVK_MACOS
 	_memoryProperties.memoryTypeCount = 3;
-	_privateMemoryTypes		= 0x1;				// Private only
-	_hostVisibleMemoryTypes	= 0x6;				// Shared & managed
-	_allMemoryTypes			= 0x7;				// Private, shared, & managed
+	_privateMemoryTypes			= 0x1;			// Private only
+	_lazilyAllocatedMemoryTypes	= 0x0;			// Not supported on macOS
+	_hostCoherentMemoryTypes 	= 0x4;			// Shared only
+	_hostVisibleMemoryTypes		= 0x6;			// Shared & managed
+	_allMemoryTypes				= 0x7;			// Private, shared, & managed
 #endif
 #if MVK_IOS
 	_memoryProperties.memoryTypeCount = 2;		// Managed storage not available on iOS
-	_privateMemoryTypes		= 0x1;				// Private only
-	_hostVisibleMemoryTypes	= 0x2;				// Shared only
-	_allMemoryTypes			= 0x3;				// Private & shared
+	_privateMemoryTypes			= 0x1;			// Private only
+	_lazilyAllocatedMemoryTypes	= 0x0;			// Not supported on this version
+	_hostCoherentMemoryTypes 	= 0x2;			// Shared only
+	_hostVisibleMemoryTypes		= 0x2;			// Shared only
+	_allMemoryTypes				= 0x3;			// Private & shared
+	if ([getMTLDevice() supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v3]) {
+		_memoryProperties.memoryTypeCount = 3;	// Memoryless storage available
+		_privateMemoryTypes			= 0x5;		// Private & memoryless
+		_lazilyAllocatedMemoryTypes	= 0x4;		// Memoryless only
+		_allMemoryTypes				= 0x7;		// Private, shared & memoryless
+	}
 #endif
 }
 
@@ -1229,6 +1268,11 @@
             vkMemFlags = MVK_VK_MEMORY_TYPE_METAL_MANAGED;
             break;
 #endif
+#if MVK_IOS
+        case MTLStorageModeMemoryless:
+            vkMemFlags = MVK_VK_MEMORY_TYPE_METAL_MEMORYLESS;
+            break;
+#endif
         default:
             vkMemFlags = MVK_VK_MEMORY_TYPE_METAL_SHARED;
             break;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
index aaff4be..baeda6b 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
@@ -35,7 +35,13 @@
 public:
 
 	/** Returns whether the memory is accessible from the host. */
-    inline bool isMemoryHostAccessible() { return (_mtlStorageMode != MTLStorageModePrivate); }
+    inline bool isMemoryHostAccessible() {
+#if MVK_IOS
+        if (_mtlStorageMode == MTLStorageModeMemoryless)
+            return false;
+#endif
+        return (_mtlStorageMode != MTLStorageModePrivate);
+    }
 
 	/** Returns whether the memory is automatically coherent between device and host. */
     inline bool isMemoryHostCoherent() { return (_mtlStorageMode == MTLStorageModeShared); }
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
index e6af638..e6edb3d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
@@ -149,6 +149,17 @@
 	pMemoryRequirements->memoryTypeBits = (_isDepthStencilAttachment
 										   ? _device->getPhysicalDevice()->getPrivateMemoryTypes()
 										   : _device->getPhysicalDevice()->getAllMemoryTypes());
+#if MVK_MACOS
+	if (!_isLinear) {  // XXX Linear images must support host-coherent memory
+		mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getHostCoherentMemoryTypes());
+	}
+#endif
+#if MVK_IOS
+	// Only transient attachments may use memoryless storage
+	if (!mvkAreFlagsEnabled(_usage, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) ) {
+		mvkDisableFlag(pMemoryRequirements->memoryTypeBits, _device->getPhysicalDevice()->getLazilyAllocatedMemoryTypes());
+	}
+#endif
 	return VK_SUCCESS;
 }
 
@@ -475,6 +486,10 @@
         mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Metal may not allow uncompressed views of compressed images.");
     }
 
+    if ( (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatNone) ) {
+        setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, compressed formats may only be used with 2D images."));
+    }
+
     // Adjust the info components to be compatible with Metal, then use the modified versions
     // to set other config info. Vulkan allows unused extent dimensions to be zero, but Metal
     // requires minimum of one. Adjust samples and miplevels for the right texture type.
@@ -502,6 +517,10 @@
         setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, multisampling can only be used with a 2D image type with an array length of 1. Setting sample count to 1."));
         _samples = VK_SAMPLE_COUNT_1_BIT;
     }
+    if ( (_samples > 1) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatNone) ) {
+        setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, multisampling cannot be used with compressed images. Setting sample count to 1."));
+        _samples = VK_SAMPLE_COUNT_1_BIT;
+    }
 
     _isDepthStencilAttachment = (mvkAreFlagsEnabled(pCreateInfo->usage, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ||
                                  mvkAreFlagsEnabled(mvkVkFormatProperties(pCreateInfo->format).optimalTilingFeatures, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT));
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index fb8f2d4..ef1f8ba 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -399,8 +399,7 @@
                 if (vbDesc.stepFunction == MTLVertexStepFunctionPerInstance) {
                     if (pVKVB->divisor == 0)
                         vbDesc.stepFunction = MTLVertexStepFunctionConstant;
-                    else
-                        vbDesc.stepRate = pVKVB->divisor;
+                    vbDesc.stepRate = pVKVB->divisor;
                 }
             }
         }
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
index 93bebd6..71862c1 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
@@ -1129,6 +1129,12 @@
 
 	// If not visible to the host: Private
 	if ( !mvkAreFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
+#if MVK_IOS
+		// iOS: If lazily allocated, Memoryless
+		if (mvkAreFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) {
+			return MTLStorageModeMemoryless;
+		}
+#endif
 		return MTLStorageModePrivate;
 	}
 
@@ -1177,6 +1183,11 @@
 			mvkEnableFlag(mtlFlags, MTLResourceStorageModeManaged);
 			break;
 #endif
+#if MVK_IOS
+		case MTLStorageModeMemoryless:
+			mvkEnableFlag(mtlFlags, MTLResourceStorageModeMemoryless);
+			break;
+#endif
 		default:		// Silence erroneous -Wswitch-enum warning on MTLResourceStorageModeManaged under iOS
 			break;
 	}
diff --git a/MoltenVK/scripts/create_dylib.sh b/MoltenVK/scripts/create_dylib.sh
index 8dc0129..b96e5db 100755
--- a/MoltenVK/scripts/create_dylib.sh
+++ b/MoltenVK/scripts/create_dylib.sh
@@ -6,21 +6,27 @@
 export MVK_SYS_FWK_DIR="${SDK_DIR}/System/Library/Frameworks"
 export MVK_USR_LIB_DIR="${SDK_DIR}/usr/lib"
 
+if test x"${ENABLE_BITCODE}" = xYES; then
+	MVK_EMBED_BITCODE="-fembed-bitcode"
+fi
+
 if test x"${ENABLE_THREAD_SANITIZER}" = xYES; then
 	MVK_TSAN="-fsanitize=thread"
 fi
 
-clang \
--dynamiclib ${MVK_TSAN} \
--arch ${MVK_ARCH} \
+clang++ \
+-stdlib=${CLANG_CXX_LIBRARY} \
+-dynamiclib \
+$(printf -- "-arch %s " ${ARCHS}) \
 -m${MVK_OS}-version-min=${MVK_MIN_OS_VERSION} \
 -compatibility_version 1.0.0 -current_version 1.0.0  \
 -install_name "@rpath/${MVK_DYLIB_NAME}"  \
 -Wno-incompatible-sysroot \
+${MVK_EMBED_BITCODE} \
+${MVK_TSAN} \
 -isysroot ${SDK_DIR} \
 -iframework ${MVK_SYS_FWK_DIR}  \
 -framework Metal ${MVK_IOSURFACE_FWK} -framework ${MVK_UX_FWK} -framework QuartzCore -framework IOKit -framework Foundation \
 --library-directory ${MVK_USR_LIB_DIR} \
--lSystem  -lc++ \
 -o "${BUILT_PRODUCTS_DIR}/${MVK_DYLIB_NAME}" \
 -force_load "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a"
diff --git a/MoltenVKPackaging.xcodeproj/project.pbxproj b/MoltenVKPackaging.xcodeproj/project.pbxproj
index 65e8fd6..bf7d955 100644
--- a/MoltenVKPackaging.xcodeproj/project.pbxproj
+++ b/MoltenVKPackaging.xcodeproj/project.pbxproj
@@ -287,7 +287,7 @@
 		A90B2B1D1A9B6170008EE819 /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				TargetAttributes = {
 					A9FEADBC1F3517480010240E = {
 						DevelopmentTeam = VU3TCKU48B;
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
index 5a51a8c..4c59e5a 100644
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
+++ "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme"
index 01bdede..3c4764f 100644
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme"
+++ "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme"
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme"
index d290881..15adf45 100644
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme"
+++ "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme"
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme
index 2e8c2d4..9fd98c0 100644
--- a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme
+++ b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
index ad2c0f8..9460b2a 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
@@ -206,7 +206,6 @@
 		mslOpts.aux_buffer_index = context.options.auxBufferIndex;
 		mslOpts.enable_point_size_builtin = context.options.isRenderingPoints;
 		mslOpts.disable_rasterization = context.options.isRasterizationDisabled;
-		mslOpts.resolve_specialized_array_lengths = true;
 		mslOpts.swizzle_texture_samples = true;
 		pMSLCompiler->set_msl_options(mslOpts);
 
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
index 2ae73fc..0c7abb6 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
@@ -199,6 +199,14 @@
 		A93E831F211F76F6001FEBD4 /* InitializeDll.h in Headers */ = {isa = PBXBuildFile; fileRef = A93E826C211F76F6001FEBD4 /* InitializeDll.h */; };
 		A93E8320211F76F6001FEBD4 /* InitializeDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E826D211F76F6001FEBD4 /* InitializeDll.cpp */; };
 		A93E8321211F76F6001FEBD4 /* InitializeDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E826D211F76F6001FEBD4 /* InitializeDll.cpp */; };
+		A94E30CF219209C700394673 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94E30CD219209C700394673 /* spirv_parser.cpp */; };
+		A94E30D0219209C700394673 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94E30CD219209C700394673 /* spirv_parser.cpp */; };
+		A94E30D1219209C700394673 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A94E30CE219209C700394673 /* spirv_parser.hpp */; };
+		A94E30D2219209C700394673 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A94E30CE219209C700394673 /* spirv_parser.hpp */; };
+		A94E30D521920A8C00394673 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A94E30D321920A8C00394673 /* spirv_cross_parsed_ir.hpp */; };
+		A94E30D621920A8C00394673 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A94E30D321920A8C00394673 /* spirv_cross_parsed_ir.hpp */; };
+		A94E30D721920A8C00394673 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94E30D421920A8C00394673 /* spirv_cross_parsed_ir.cpp */; };
+		A94E30D821920A8C00394673 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A94E30D421920A8C00394673 /* spirv_cross_parsed_ir.cpp */; };
 		A95096BB2003D00300F10950 /* FileSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A925B70A1C7754B2006E7ECD /* FileSupport.mm */; };
 		A95096BC2003D00300F10950 /* FileSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A925B70A1C7754B2006E7ECD /* FileSupport.mm */; };
 		A95096BF2003D32400F10950 /* DirectorySupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A95096BD2003D32400F10950 /* DirectorySupport.mm */; };
@@ -953,6 +961,10 @@
 		A93E826B211F76F6001FEBD4 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
 		A93E826C211F76F6001FEBD4 /* InitializeDll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitializeDll.h; sourceTree = "<group>"; };
 		A93E826D211F76F6001FEBD4 /* InitializeDll.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InitializeDll.cpp; sourceTree = "<group>"; };
+		A94E30CD219209C700394673 /* spirv_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_parser.cpp; sourceTree = "<group>"; };
+		A94E30CE219209C700394673 /* spirv_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_parser.hpp; sourceTree = "<group>"; };
+		A94E30D321920A8C00394673 /* spirv_cross_parsed_ir.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_parsed_ir.hpp; sourceTree = "<group>"; };
+		A94E30D421920A8C00394673 /* spirv_cross_parsed_ir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross_parsed_ir.cpp; sourceTree = "<group>"; };
 		A95096BD2003D32400F10950 /* DirectorySupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DirectorySupport.mm; sourceTree = "<group>"; };
 		A95096BE2003D32400F10950 /* DirectorySupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectorySupport.h; sourceTree = "<group>"; };
 		A95C5F3D1DEA9070000D17B6 /* spirv_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cfg.cpp; sourceTree = "<group>"; };
@@ -1328,12 +1340,16 @@
 				A95C5F3D1DEA9070000D17B6 /* spirv_cfg.cpp */,
 				A95C5F3E1DEA9070000D17B6 /* spirv_cfg.hpp */,
 				A9AB19901CB5B5A80001E7F9 /* spirv_common.hpp */,
+				A94E30D421920A8C00394673 /* spirv_cross_parsed_ir.cpp */,
+				A94E30D321920A8C00394673 /* spirv_cross_parsed_ir.hpp */,
 				A9AB19911CB5B5A80001E7F9 /* spirv_cross.cpp */,
 				A9AB19921CB5B5A80001E7F9 /* spirv_cross.hpp */,
 				A9AB19931CB5B5A80001E7F9 /* spirv_glsl.cpp */,
 				A9AB19941CB5B5A80001E7F9 /* spirv_glsl.hpp */,
 				A9AB19951CB5B5A80001E7F9 /* spirv_msl.cpp */,
 				A9AB19961CB5B5A80001E7F9 /* spirv_msl.hpp */,
+				A94E30CD219209C700394673 /* spirv_parser.cpp */,
+				A94E30CE219209C700394673 /* spirv_parser.hpp */,
 			);
 			name = "SPIRV-Cross";
 			path = "../SPIRV-Cross";
@@ -2058,6 +2074,7 @@
 				A96FE8BE215473A00060D1A3 /* spirv_optimizer_options.h in Headers */,
 				A96FE76E215473A00060D1A3 /* compact_ids_pass.h in Headers */,
 				A96FE712215473A00060D1A3 /* spirv_definition.h in Headers */,
+				A94E30D1219209C700394673 /* spirv_parser.hpp in Headers */,
 				A96FE8A8215473A00060D1A3 /* dominator_tree.h in Headers */,
 				A96FE7E0215473A00060D1A3 /* struct_cfg_analysis.h in Headers */,
 				A96FE766215473A00060D1A3 /* loop_fusion.h in Headers */,
@@ -2134,6 +2151,7 @@
 				A96FE8DC215473A00060D1A3 /* basic_block.h in Headers */,
 				A96FE834215473A00060D1A3 /* dead_variable_elimination.h in Headers */,
 				A96FE740215473A00060D1A3 /* text_handler.h in Headers */,
+				A94E30D521920A8C00394673 /* spirv_cross_parsed_ir.hpp in Headers */,
 				A9AB199B1CB5B5A80001E7F9 /* spirv_cross.hpp in Headers */,
 				A96FE7F8215473A00060D1A3 /* dead_insert_elim_pass.h in Headers */,
 				A96FE872215473A00060D1A3 /* local_ssa_elim_pass.h in Headers */,
@@ -2219,6 +2237,7 @@
 				A96FE8BF215473A00060D1A3 /* spirv_optimizer_options.h in Headers */,
 				A96FE76F215473A00060D1A3 /* compact_ids_pass.h in Headers */,
 				A96FE713215473A00060D1A3 /* spirv_definition.h in Headers */,
+				A94E30D2219209C700394673 /* spirv_parser.hpp in Headers */,
 				A96FE8A9215473A00060D1A3 /* dominator_tree.h in Headers */,
 				A96FE7E1215473A00060D1A3 /* struct_cfg_analysis.h in Headers */,
 				A96FE767215473A00060D1A3 /* loop_fusion.h in Headers */,
@@ -2295,6 +2314,7 @@
 				A96FE8DD215473A00060D1A3 /* basic_block.h in Headers */,
 				A96FE835215473A00060D1A3 /* dead_variable_elimination.h in Headers */,
 				A96FE741215473A00060D1A3 /* text_handler.h in Headers */,
+				A94E30D621920A8C00394673 /* spirv_cross_parsed_ir.hpp in Headers */,
 				A9AB199C1CB5B5A80001E7F9 /* spirv_cross.hpp in Headers */,
 				A96FE7F9215473A00060D1A3 /* dead_insert_elim_pass.h in Headers */,
 				A96FE873215473A00060D1A3 /* local_ssa_elim_pass.h in Headers */,
@@ -2464,7 +2484,7 @@
 		A9F55D25198BE6A7004EC31B /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1000;
+				LastUpgradeCheck = 1010;
 				ORGANIZATIONNAME = "The Brenwill Workshop Ltd.";
 				TargetAttributes = {
 					A9092A8C1A81717B00051823 = {
@@ -2678,6 +2698,7 @@
 				A96FE73C215473A00060D1A3 /* markv_encoder.cpp in Sources */,
 				A96FE90C215473A00060D1A3 /* instruction.cpp in Sources */,
 				A96FE81A215473A00060D1A3 /* strength_reduction_pass.cpp in Sources */,
+				A94E30D721920A8C00394673 /* spirv_cross_parsed_ir.cpp in Sources */,
 				A96FE78A215473A00060D1A3 /* local_redundancy_elimination.cpp in Sources */,
 				A96FE826215473A00060D1A3 /* loop_fusion_pass.cpp in Sources */,
 				A96FE782215473A00060D1A3 /* local_single_block_elim_pass.cpp in Sources */,
@@ -2717,6 +2738,7 @@
 				A96FE7F2215473A00060D1A3 /* simplification_pass.cpp in Sources */,
 				A95096BB2003D00300F10950 /* FileSupport.mm in Sources */,
 				A96FE6F2215473A00060D1A3 /* string_utils.cpp in Sources */,
+				A94E30CF219209C700394673 /* spirv_parser.cpp in Sources */,
 				A909408A1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */,
 				A96FE7C0215473A00060D1A3 /* loop_unswitch_pass.cpp in Sources */,
 				A96FE82E215473A00060D1A3 /* dead_insert_elim_pass.cpp in Sources */,
@@ -2845,6 +2867,7 @@
 				A96FE73D215473A00060D1A3 /* markv_encoder.cpp in Sources */,
 				A96FE90D215473A00060D1A3 /* instruction.cpp in Sources */,
 				A96FE81B215473A00060D1A3 /* strength_reduction_pass.cpp in Sources */,
+				A94E30D821920A8C00394673 /* spirv_cross_parsed_ir.cpp in Sources */,
 				A96FE78B215473A00060D1A3 /* local_redundancy_elimination.cpp in Sources */,
 				A96FE827215473A00060D1A3 /* loop_fusion_pass.cpp in Sources */,
 				A96FE783215473A00060D1A3 /* local_single_block_elim_pass.cpp in Sources */,
@@ -2884,6 +2907,7 @@
 				A96FE7F3215473A00060D1A3 /* simplification_pass.cpp in Sources */,
 				A95096BC2003D00300F10950 /* FileSupport.mm in Sources */,
 				A96FE6F3215473A00060D1A3 /* string_utils.cpp in Sources */,
+				A94E30D0219209C700394673 /* spirv_parser.cpp in Sources */,
 				A909408B1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */,
 				A96FE7C1215473A00060D1A3 /* loop_unswitch_pass.cpp in Sources */,
 				A96FE82F215473A00060D1A3 /* dead_insert_elim_pass.cpp in Sources */,
@@ -2988,6 +3012,7 @@
 		A93747401A9A8B2900F29B34 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
 				CLANG_WARN_UNREACHABLE_CODE = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
@@ -3007,6 +3032,7 @@
 		A93747411A9A8B2900F29B34 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
 				CLANG_WARN_UNREACHABLE_CODE = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
@@ -3056,6 +3082,7 @@
 		A93903BD1C57E9D700FE90DC /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
@@ -3078,6 +3105,7 @@
 		A93903BE1C57E9D700FE90DC /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				BITCODE_GENERATION_MODE = bitcode;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
index 7ad6164..7e9b364 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme
index 4642b19..715ca93 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
index 6eeffb4..c76cb84 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme
index 130fdc7..8d5c51b 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
index fd1fc60..f2c12eb 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1000"
+   LastUpgradeVersion = "1010"
    version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/fetchDependencies b/fetchDependencies
index 86dda2e..eadd1d3 100755
--- a/fetchDependencies
+++ b/fetchDependencies
@@ -101,8 +101,7 @@
 EXT_REV_DIR=ExternalRevisions
 
 echo
-echo Retrieving MoltenVK dependencies into ${EXT_DIR}.
-echo
+echo ========== Retrieving MoltenVK dependencies into ${EXT_DIR} ==========
 
 mkdir -p ${EXT_DIR}
 cd ${EXT_DIR}
@@ -110,6 +109,10 @@
 
 # ----------------- Cereal -------------------
 
+echo
+echo ========== Cereal ==========
+echo
+
 REPO_NAME=cereal
 REPO_URL="https://github.com/USCiLab/${REPO_NAME}.git"
 REPO_REV=$(cat "../${EXT_REV_DIR}/${REPO_NAME}_repo_revision")
@@ -119,6 +122,10 @@
 
 # ----------------- Vulkan-Headers -------------------
 
+echo
+echo ========== Vulkan-Headers ==========
+echo
+
 # When MoltenVK is built by something that already has
 # a copy of this repo, use it by creating a symlink.
 if [ ! "$V_HEADERS_ROOT" = "" ]; then
@@ -136,6 +143,10 @@
 
 # ----------------- SPIRV-Cross -------------------
 
+echo
+echo ========== SPIRV-Cross ==========
+echo
+
 # When MoltenVK is built by something that already has
 # a copy of this repo, use it by creating a symlink.
 if [ ! "$SPIRV_CROSS_ROOT" = "" ]; then
@@ -153,6 +164,10 @@
 
 # ----------------- glslang -------------------
 
+echo
+echo ========== glslang and SPIRV-Tools ==========
+echo
+
 # When MoltenVK is built by something that already has
 # a copy of this repo, use it by creating a symlink.
 if [ ! "$GLSLANG_ROOT" = "" ]; then
@@ -176,6 +191,10 @@
 
 # ----------------- Vulkan-Tools -------------------
 
+echo
+echo ========== Vulkan-Tools ==========
+echo
+
 REPO_NAME=Vulkan-Tools
 REPO_URL="https://github.com/KhronosGroup/${REPO_NAME}.git"
 REPO_REV=$(cat "../${EXT_REV_DIR}/${REPO_NAME}_repo_revision")
@@ -185,6 +204,10 @@
 
 # ----------------- VulkanSamples -------------------
 
+echo
+echo ========== VulkanSamples ==========
+echo
+
 REPO_NAME=VulkanSamples
 REPO_URL="https://github.com/LunarG/${REPO_NAME}.git"
 REPO_REV=$(cat "../${EXT_REV_DIR}/${REPO_NAME}_repo_revision")