implemented recommended MVKVector changes
diff --git a/Common/MVKCommonEnvironment.h b/Common/MVKCommonEnvironment.h
index 27a6050..716b47e 100644
--- a/Common/MVKCommonEnvironment.h
+++ b/Common/MVKCommonEnvironment.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommonEnvironment.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Common/MVKLogging.h b/Common/MVKLogging.h
index 5ab2c70..c7af750 100644
--- a/Common/MVKLogging.h
+++ b/Common/MVKLogging.h
@@ -1,7 +1,7 @@
 /*
  * MVKLogging.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Common/MVKStrings.h b/Common/MVKStrings.h
index 0e1f9d5..636f0b4 100644
--- a/Common/MVKStrings.h
+++ b/Common/MVKStrings.h
@@ -1,7 +1,7 @@
 /*
  * MVKStrings.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/Samples.h b/Demos/LunarG-VulkanSamples/API-Samples/Samples.h
index 9dcacf5..b6eef80 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/Samples.h
+++ b/Demos/LunarG-VulkanSamples/API-Samples/Samples.h
@@ -1,7 +1,7 @@
 /*
  * Samples.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/iOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/API-Samples/iOS/AppDelegate.h
index 8ce0efd..aebc080 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/iOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/API-Samples/iOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.h
index 535578c..0ec7d12 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
index e14f9ac..e922cf4 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/API-Samples/iOS/DemoViewController.mm
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/macOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/API-Samples/macOS/AppDelegate.h
index b883ab3..8d14956 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/macOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/API-Samples/macOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.h
index cba88c3..b6ce575 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
index 8a7059f..7b1bb64 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/API-Samples/macOS/DemoViewController.mm
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Cube/iOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/Cube/iOS/AppDelegate.h
index 8ce0efd..aebc080 100644
--- a/Demos/LunarG-VulkanSamples/Cube/iOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/Cube/iOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.h
index 535578c..0ec7d12 100644
--- a/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/Cube/iOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Cube/macOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/Cube/macOS/AppDelegate.h
index b883ab3..8d14956 100644
--- a/Demos/LunarG-VulkanSamples/Cube/macOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/Cube/macOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.h
index cba88c3..b6ce575 100644
--- a/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/Cube/macOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/iOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/Hologram/iOS/AppDelegate.h
index 8ce0efd..aebc080 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/iOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/Hologram/iOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.h
index 535578c..0ec7d12 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
index 9c71e7a..7d0945a 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/Hologram/iOS/DemoViewController.mm
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/macOS/AppDelegate.h b/Demos/LunarG-VulkanSamples/Hologram/macOS/AppDelegate.h
index b883ab3..8d14956 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/macOS/AppDelegate.h
+++ b/Demos/LunarG-VulkanSamples/Hologram/macOS/AppDelegate.h
@@ -1,7 +1,7 @@
 /*
  * AppDelegate.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.h b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.h
index cba88c3..b6ce575 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.h
+++ b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.h
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
index 3b51fa6..e30ee21 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
+++ b/Demos/LunarG-VulkanSamples/Hologram/macOS/DemoViewController.mm
@@ -1,7 +1,7 @@
 /*
  * DemoViewController.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/ExternalDependencies.xcodeproj/project.pbxproj b/ExternalDependencies.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..f7054a1
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/project.pbxproj
@@ -0,0 +1,3599 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 48;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		A972A7E421CEC72F0013AB25 /* ExternalDependencies-macOS */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = A972A7E721CEC72F0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-macOS" */;
+			buildPhases = (
+				A9679AB021D26C7000856BF7 /* Package External Libraries */,
+			);
+			dependencies = (
+				A972A7E921CEC76A0013AB25 /* PBXTargetDependency */,
+				A972A82821CECD780013AB25 /* PBXTargetDependency */,
+				A972ABF421CED8C20013AB25 /* PBXTargetDependency */,
+			);
+			name = "ExternalDependencies-macOS";
+			productName = "ExternalLibraries-macOS";
+		};
+		A972A7EA21CEC8030013AB25 /* ExternalDependencies-iOS */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = A972A7ED21CEC8030013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-iOS" */;
+			buildPhases = (
+				A9679AAF21D26C1400856BF7 /* Package External Libraries */,
+			);
+			dependencies = (
+				A972A7F121CEC8140013AB25 /* PBXTargetDependency */,
+				A972A82621CECD6B0013AB25 /* PBXTargetDependency */,
+				A972ABF221CED8BA0013AB25 /* PBXTargetDependency */,
+			);
+			name = "ExternalDependencies-iOS";
+			productName = "ExternalLibraries-macOS";
+		};
+		A972A7F221CEC81B0013AB25 /* ExternalDependencies */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = A972A7F521CEC81B0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies" */;
+			buildPhases = (
+			);
+			dependencies = (
+				A972A7FB21CEC8540013AB25 /* PBXTargetDependency */,
+				A972A7F921CEC8500013AB25 /* PBXTargetDependency */,
+			);
+			name = ExternalDependencies;
+			productName = "ExternalLibraries-macOS";
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		A972A96821CED2730013AB25 /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A82A21CED2720013AB25 /* spirv_target_env.cpp */; };
+		A972A96921CED2730013AB25 /* spirv_target_env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A82A21CED2720013AB25 /* spirv_target_env.cpp */; };
+		A972A96A21CED2730013AB25 /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A82C21CED2720013AB25 /* assembly_grammar.h */; };
+		A972A96B21CED2730013AB25 /* assembly_grammar.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A82C21CED2720013AB25 /* assembly_grammar.h */; };
+		A972A96C21CED2730013AB25 /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A82D21CED2720013AB25 /* enum_set.h */; };
+		A972A96D21CED2730013AB25 /* enum_set.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A82D21CED2720013AB25 /* enum_set.h */; };
+		A972A96E21CED2730013AB25 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83021CED2720013AB25 /* text.cpp */; };
+		A972A96F21CED2730013AB25 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83021CED2720013AB25 /* text.cpp */; };
+		A972A97021CED2730013AB25 /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83121CED2720013AB25 /* assembly_grammar.cpp */; };
+		A972A97121CED2730013AB25 /* assembly_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83121CED2720013AB25 /* assembly_grammar.cpp */; };
+		A972A97221CED2730013AB25 /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83221CED2720013AB25 /* text.h */; };
+		A972A97321CED2730013AB25 /* text.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83221CED2720013AB25 /* text.h */; };
+		A972A97421CED2730013AB25 /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83321CED2720013AB25 /* extensions.cpp */; };
+		A972A97521CED2730013AB25 /* extensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83321CED2720013AB25 /* extensions.cpp */; };
+		A972A97621CED2730013AB25 /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83421CED2720013AB25 /* pch_source.cpp */; };
+		A972A97721CED2730013AB25 /* pch_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83421CED2720013AB25 /* pch_source.cpp */; };
+		A972A97821CED2730013AB25 /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83621CED2720013AB25 /* parse_number.h */; };
+		A972A97921CED2730013AB25 /* parse_number.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83621CED2720013AB25 /* parse_number.h */; };
+		A972A97A21CED2730013AB25 /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83721CED2720013AB25 /* ilist_node.h */; };
+		A972A97B21CED2730013AB25 /* ilist_node.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83721CED2720013AB25 /* ilist_node.h */; };
+		A972A97C21CED2730013AB25 /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83821CED2720013AB25 /* make_unique.h */; };
+		A972A97D21CED2730013AB25 /* make_unique.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83821CED2720013AB25 /* make_unique.h */; };
+		A972A97E21CED2730013AB25 /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83921CED2720013AB25 /* string_utils.h */; };
+		A972A97F21CED2730013AB25 /* string_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83921CED2720013AB25 /* string_utils.h */; };
+		A972A98021CED2730013AB25 /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83A21CED2720013AB25 /* small_vector.h */; };
+		A972A98121CED2730013AB25 /* small_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83A21CED2720013AB25 /* small_vector.h */; };
+		A972A98221CED2730013AB25 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83B21CED2720013AB25 /* timer.cpp */; };
+		A972A98321CED2730013AB25 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83B21CED2720013AB25 /* timer.cpp */; };
+		A972A98421CED2730013AB25 /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83C21CED2720013AB25 /* timer.h */; };
+		A972A98521CED2730013AB25 /* timer.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83C21CED2720013AB25 /* timer.h */; };
+		A972A98621CED2730013AB25 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83D21CED2720013AB25 /* string_utils.cpp */; };
+		A972A98721CED2730013AB25 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A83D21CED2720013AB25 /* string_utils.cpp */; };
+		A972A98821CED2730013AB25 /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83E21CED2720013AB25 /* bit_vector.h */; };
+		A972A98921CED2730013AB25 /* bit_vector.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83E21CED2720013AB25 /* bit_vector.h */; };
+		A972A98A21CED2730013AB25 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83F21CED2720013AB25 /* bitutils.h */; };
+		A972A98B21CED2730013AB25 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A83F21CED2720013AB25 /* bitutils.h */; };
+		A972A98C21CED2730013AB25 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84021CED2720013AB25 /* hex_float.h */; };
+		A972A98D21CED2730013AB25 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84021CED2720013AB25 /* hex_float.h */; };
+		A972A98E21CED2730013AB25 /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84121CED2720013AB25 /* parse_number.cpp */; };
+		A972A98F21CED2730013AB25 /* parse_number.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84121CED2720013AB25 /* parse_number.cpp */; };
+		A972A99021CED2730013AB25 /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84221CED2720013AB25 /* bit_vector.cpp */; };
+		A972A99121CED2730013AB25 /* bit_vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84221CED2720013AB25 /* bit_vector.cpp */; };
+		A972A99221CED2730013AB25 /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84321CED2720013AB25 /* ilist.h */; };
+		A972A99321CED2730013AB25 /* ilist.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84321CED2720013AB25 /* ilist.h */; };
+		A972A99421CED2730013AB25 /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84421CED2720013AB25 /* spirv_target_env.h */; };
+		A972A99521CED2730013AB25 /* spirv_target_env.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84421CED2720013AB25 /* spirv_target_env.h */; };
+		A972A99621CED2730013AB25 /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84521CED2720013AB25 /* table.cpp */; };
+		A972A99721CED2730013AB25 /* table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84521CED2720013AB25 /* table.cpp */; };
+		A972A99821CED2730013AB25 /* id_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84621CED2720013AB25 /* id_descriptor.cpp */; };
+		A972A99921CED2730013AB25 /* id_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84621CED2720013AB25 /* id_descriptor.cpp */; };
+		A972A99A21CED2730013AB25 /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84721CED2720013AB25 /* latest_version_opencl_std_header.h */; };
+		A972A99B21CED2730013AB25 /* latest_version_opencl_std_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84721CED2720013AB25 /* latest_version_opencl_std_header.h */; };
+		A972A99C21CED2730013AB25 /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84821CED2720013AB25 /* spirv_optimizer_options.cpp */; };
+		A972A99D21CED2730013AB25 /* spirv_optimizer_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84821CED2720013AB25 /* spirv_optimizer_options.cpp */; };
+		A972A99E21CED2730013AB25 /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84921CED2720013AB25 /* cfa.h */; };
+		A972A99F21CED2730013AB25 /* cfa.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84921CED2720013AB25 /* cfa.h */; };
+		A972A9A021CED2730013AB25 /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84A21CED2720013AB25 /* pch_source.h */; };
+		A972A9A121CED2730013AB25 /* pch_source.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84A21CED2720013AB25 /* pch_source.h */; };
+		A972A9A221CED2730013AB25 /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84B21CED2720013AB25 /* enum_string_mapping.h */; };
+		A972A9A321CED2730013AB25 /* enum_string_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84B21CED2720013AB25 /* enum_string_mapping.h */; };
+		A972A9A421CED2730013AB25 /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84C21CED2720013AB25 /* spirv_validator_options.cpp */; };
+		A972A9A521CED2730013AB25 /* spirv_validator_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84C21CED2720013AB25 /* spirv_validator_options.cpp */; };
+		A972A9A621CED2730013AB25 /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84E21CED2720013AB25 /* print.cpp */; };
+		A972A9A721CED2730013AB25 /* print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A84E21CED2720013AB25 /* print.cpp */; };
+		A972A9A821CED2730013AB25 /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84F21CED2720013AB25 /* spirv_definition.h */; };
+		A972A9A921CED2730013AB25 /* spirv_definition.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A84F21CED2720013AB25 /* spirv_definition.h */; };
+		A972A9AA21CED2730013AB25 /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85021CED2720013AB25 /* operand.h */; };
+		A972A9AB21CED2730013AB25 /* operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85021CED2720013AB25 /* operand.h */; };
+		A972A9AC21CED2730013AB25 /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85121CED2720013AB25 /* spirv_endian.cpp */; };
+		A972A9AD21CED2730013AB25 /* spirv_endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85121CED2720013AB25 /* spirv_endian.cpp */; };
+		A972A9AE21CED2730013AB25 /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85221CED2720013AB25 /* macro.h */; };
+		A972A9AF21CED2730013AB25 /* macro.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85221CED2720013AB25 /* macro.h */; };
+		A972A9B021CED2730013AB25 /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85321CED2720013AB25 /* spirv_constant.h */; };
+		A972A9B121CED2730013AB25 /* spirv_constant.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85321CED2720013AB25 /* spirv_constant.h */; };
+		A972A9B221CED2730013AB25 /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85521CED2720013AB25 /* binary.cpp */; };
+		A972A9B321CED2730013AB25 /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85521CED2720013AB25 /* binary.cpp */; };
+		A972A9B421CED2730013AB25 /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85621CED2720013AB25 /* spirv_validator_options.h */; };
+		A972A9B521CED2730013AB25 /* spirv_validator_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85621CED2720013AB25 /* spirv_validator_options.h */; };
+		A972A9B621CED2730013AB25 /* markv_codec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85821CED2720013AB25 /* markv_codec.cpp */; };
+		A972A9B721CED2730013AB25 /* markv_codec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85821CED2720013AB25 /* markv_codec.cpp */; };
+		A972A9B821CED2730013AB25 /* markv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85921CED2720013AB25 /* markv.cpp */; };
+		A972A9B921CED2730013AB25 /* markv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85921CED2720013AB25 /* markv.cpp */; };
+		A972A9BA21CED2730013AB25 /* huffman_codec.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85A21CED2720013AB25 /* huffman_codec.h */; };
+		A972A9BB21CED2730013AB25 /* huffman_codec.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85A21CED2720013AB25 /* huffman_codec.h */; };
+		A972A9BC21CED2730013AB25 /* bit_stream.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85C21CED2720013AB25 /* bit_stream.h */; };
+		A972A9BD21CED2730013AB25 /* bit_stream.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85C21CED2720013AB25 /* bit_stream.h */; };
+		A972A9BE21CED2730013AB25 /* move_to_front.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85D21CED2720013AB25 /* move_to_front.cpp */; };
+		A972A9BF21CED2730013AB25 /* move_to_front.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A85D21CED2720013AB25 /* move_to_front.cpp */; };
+		A972A9C021CED2730013AB25 /* markv_encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85E21CED2720013AB25 /* markv_encoder.h */; };
+		A972A9C121CED2730013AB25 /* markv_encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85E21CED2720013AB25 /* markv_encoder.h */; };
+		A972A9C221CED2730013AB25 /* markv_decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85F21CED2720013AB25 /* markv_decoder.h */; };
+		A972A9C321CED2730013AB25 /* markv_decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A85F21CED2720013AB25 /* markv_decoder.h */; };
+		A972A9C421CED2730013AB25 /* markv.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86021CED2720013AB25 /* markv.h */; };
+		A972A9C521CED2730013AB25 /* markv.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86021CED2720013AB25 /* markv.h */; };
+		A972A9C621CED2730013AB25 /* markv_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86121CED2720013AB25 /* markv_model.h */; };
+		A972A9C721CED2730013AB25 /* markv_model.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86121CED2720013AB25 /* markv_model.h */; };
+		A972A9C821CED2730013AB25 /* markv_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86221CED2720013AB25 /* markv_decoder.cpp */; };
+		A972A9C921CED2730013AB25 /* markv_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86221CED2720013AB25 /* markv_decoder.cpp */; };
+		A972A9CA21CED2730013AB25 /* move_to_front.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86321CED2720013AB25 /* move_to_front.h */; };
+		A972A9CB21CED2730013AB25 /* move_to_front.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86321CED2720013AB25 /* move_to_front.h */; };
+		A972A9CC21CED2730013AB25 /* markv_codec.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86421CED2720013AB25 /* markv_codec.h */; };
+		A972A9CD21CED2730013AB25 /* markv_codec.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86421CED2720013AB25 /* markv_codec.h */; };
+		A972A9CE21CED2730013AB25 /* markv_logger.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86521CED2720013AB25 /* markv_logger.h */; };
+		A972A9CF21CED2730013AB25 /* markv_logger.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86521CED2720013AB25 /* markv_logger.h */; };
+		A972A9D021CED2730013AB25 /* bit_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86621CED2720013AB25 /* bit_stream.cpp */; };
+		A972A9D121CED2730013AB25 /* bit_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86621CED2720013AB25 /* bit_stream.cpp */; };
+		A972A9D221CED2730013AB25 /* markv_encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86721CED2720013AB25 /* markv_encoder.cpp */; };
+		A972A9D321CED2730013AB25 /* markv_encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86721CED2720013AB25 /* markv_encoder.cpp */; };
+		A972A9D421CED2730013AB25 /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86821CED2720013AB25 /* enum_string_mapping.cpp */; };
+		A972A9D521CED2730013AB25 /* enum_string_mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86821CED2720013AB25 /* enum_string_mapping.cpp */; };
+		A972A9D621CED2730013AB25 /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86921CED2720013AB25 /* text_handler.h */; };
+		A972A9D721CED2730013AB25 /* text_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86921CED2720013AB25 /* text_handler.h */; };
+		A972A9D821CED2730013AB25 /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86A21CED2720013AB25 /* parsed_operand.h */; };
+		A972A9D921CED2730013AB25 /* parsed_operand.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86A21CED2720013AB25 /* parsed_operand.h */; };
+		A972A9DA21CED2730013AB25 /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86B21CED2720013AB25 /* name_mapper.h */; };
+		A972A9DB21CED2730013AB25 /* name_mapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86B21CED2720013AB25 /* name_mapper.h */; };
+		A972A9DC21CED2730013AB25 /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86C21CED2720013AB25 /* parsed_operand.cpp */; };
+		A972A9DD21CED2730013AB25 /* parsed_operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86C21CED2720013AB25 /* parsed_operand.cpp */; };
+		A972A9DE21CED2730013AB25 /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86D21CED2720013AB25 /* diagnostic.h */; };
+		A972A9DF21CED2730013AB25 /* diagnostic.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86D21CED2720013AB25 /* diagnostic.h */; };
+		A972A9E021CED2730013AB25 /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86E21CED2720013AB25 /* spirv_endian.h */; };
+		A972A9E121CED2730013AB25 /* spirv_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A86E21CED2720013AB25 /* spirv_endian.h */; };
+		A972A9E221CED2730013AB25 /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86F21CED2720013AB25 /* name_mapper.cpp */; };
+		A972A9E321CED2730013AB25 /* name_mapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A86F21CED2720013AB25 /* name_mapper.cpp */; };
+		A972A9E421CED2730013AB25 /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87321CED2720013AB25 /* linker.cpp */; };
+		A972A9E521CED2730013AB25 /* linker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87321CED2720013AB25 /* linker.cpp */; };
+		A972A9E621CED2730013AB25 /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87421CED2720013AB25 /* software_version.cpp */; };
+		A972A9E721CED2730013AB25 /* software_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87421CED2720013AB25 /* software_version.cpp */; };
+		A972A9E821CED2730013AB25 /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87521CED2720013AB25 /* opcode.cpp */; };
+		A972A9E921CED2730013AB25 /* opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87521CED2720013AB25 /* opcode.cpp */; };
+		A972A9EA21CED2730013AB25 /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87621CED2720013AB25 /* print.h */; };
+		A972A9EB21CED2730013AB25 /* print.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87621CED2720013AB25 /* print.h */; };
+		A972A9EC21CED2730013AB25 /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87721CED2720013AB25 /* ext_inst.cpp */; };
+		A972A9ED21CED2730013AB25 /* ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87721CED2720013AB25 /* ext_inst.cpp */; };
+		A972A9EE21CED2730013AB25 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87821CED2720013AB25 /* disassemble.h */; };
+		A972A9EF21CED2730013AB25 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87821CED2720013AB25 /* disassemble.h */; };
+		A972A9F021CED2730013AB25 /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87A21CED2720013AB25 /* optimizer.cpp */; };
+		A972A9F121CED2730013AB25 /* optimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87A21CED2720013AB25 /* optimizer.cpp */; };
+		A972A9F221CED2730013AB25 /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87B21CED2720013AB25 /* if_conversion.h */; };
+		A972A9F321CED2730013AB25 /* if_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87B21CED2720013AB25 /* if_conversion.h */; };
+		A972A9F421CED2730013AB25 /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87C21CED2720013AB25 /* register_pressure.cpp */; };
+		A972A9F521CED2730013AB25 /* register_pressure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87C21CED2720013AB25 /* register_pressure.cpp */; };
+		A972A9F621CED2730013AB25 /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87D21CED2720013AB25 /* loop_utils.cpp */; };
+		A972A9F721CED2730013AB25 /* loop_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A87D21CED2720013AB25 /* loop_utils.cpp */; };
+		A972A9F821CED2730013AB25 /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87E21CED2720013AB25 /* merge_return_pass.h */; };
+		A972A9F921CED2730013AB25 /* merge_return_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87E21CED2720013AB25 /* merge_return_pass.h */; };
+		A972A9FA21CED2730013AB25 /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87F21CED2720013AB25 /* inline_opaque_pass.h */; };
+		A972A9FB21CED2730013AB25 /* inline_opaque_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A87F21CED2720013AB25 /* inline_opaque_pass.h */; };
+		A972A9FC21CED2730013AB25 /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88021CED2720013AB25 /* loop_fusion.h */; };
+		A972A9FD21CED2730013AB25 /* loop_fusion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88021CED2720013AB25 /* loop_fusion.h */; };
+		A972A9FE21CED2730013AB25 /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88121CED2720013AB25 /* combine_access_chains.cpp */; };
+		A972A9FF21CED2730013AB25 /* combine_access_chains.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88121CED2720013AB25 /* combine_access_chains.cpp */; };
+		A972AA0021CED2730013AB25 /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88221CED2720013AB25 /* build_module.cpp */; };
+		A972AA0121CED2730013AB25 /* build_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88221CED2720013AB25 /* build_module.cpp */; };
+		A972AA0221CED2730013AB25 /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88321CED2720013AB25 /* composite.h */; };
+		A972AA0321CED2730013AB25 /* composite.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88321CED2720013AB25 /* composite.h */; };
+		A972AA0421CED2730013AB25 /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88421CED2720013AB25 /* compact_ids_pass.h */; };
+		A972AA0521CED2730013AB25 /* compact_ids_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88421CED2720013AB25 /* compact_ids_pass.h */; };
+		A972AA0621CED2730013AB25 /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88521CED2720013AB25 /* register_pressure.h */; };
+		A972AA0721CED2730013AB25 /* register_pressure.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88521CED2720013AB25 /* register_pressure.h */; };
+		A972AA0821CED2730013AB25 /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88621CED2720013AB25 /* tree_iterator.h */; };
+		A972AA0921CED2730013AB25 /* tree_iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88621CED2720013AB25 /* tree_iterator.h */; };
+		A972AA0A21CED2730013AB25 /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88721CED2720013AB25 /* local_single_store_elim_pass.h */; };
+		A972AA0B21CED2730013AB25 /* local_single_store_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88721CED2720013AB25 /* local_single_store_elim_pass.h */; };
+		A972AA0C21CED2730013AB25 /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88821CED2720013AB25 /* reduce_load_size.h */; };
+		A972AA0D21CED2730013AB25 /* reduce_load_size.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88821CED2720013AB25 /* reduce_load_size.h */; };
+		A972AA0E21CED2730013AB25 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88921CED2720013AB25 /* types.cpp */; };
+		A972AA0F21CED2730013AB25 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88921CED2720013AB25 /* types.cpp */; };
+		A972AA1021CED2730013AB25 /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88A21CED2720013AB25 /* scalar_analysis.h */; };
+		A972AA1121CED2730013AB25 /* scalar_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88A21CED2720013AB25 /* scalar_analysis.h */; };
+		A972AA1221CED2730013AB25 /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88B21CED2720013AB25 /* strip_debug_info_pass.h */; };
+		A972AA1321CED2730013AB25 /* strip_debug_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A88B21CED2720013AB25 /* strip_debug_info_pass.h */; };
+		A972AA1421CED2730013AB25 /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88C21CED2720013AB25 /* cfg.cpp */; };
+		A972AA1521CED2730013AB25 /* cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88C21CED2720013AB25 /* cfg.cpp */; };
+		A972AA1621CED2730013AB25 /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88D21CED2720013AB25 /* decoration_manager.cpp */; };
+		A972AA1721CED2730013AB25 /* decoration_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88D21CED2720013AB25 /* decoration_manager.cpp */; };
+		A972AA1821CED2730013AB25 /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88E21CED2720013AB25 /* local_single_block_elim_pass.cpp */; };
+		A972AA1921CED2730013AB25 /* local_single_block_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88E21CED2720013AB25 /* local_single_block_elim_pass.cpp */; };
+		A972AA1A21CED2730013AB25 /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88F21CED2720013AB25 /* freeze_spec_constant_value_pass.cpp */; };
+		A972AA1B21CED2730013AB25 /* freeze_spec_constant_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A88F21CED2720013AB25 /* freeze_spec_constant_value_pass.cpp */; };
+		A972AA1C21CED2730013AB25 /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89021CED2720013AB25 /* replace_invalid_opc.h */; };
+		A972AA1D21CED2730013AB25 /* replace_invalid_opc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89021CED2720013AB25 /* replace_invalid_opc.h */; };
+		A972AA1E21CED2730013AB25 /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89121CED2720013AB25 /* local_access_chain_convert_pass.h */; };
+		A972AA1F21CED2730013AB25 /* local_access_chain_convert_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89121CED2720013AB25 /* local_access_chain_convert_pass.h */; };
+		A972AA2021CED2730013AB25 /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89221CED2720013AB25 /* inst_bindless_check_pass.cpp */; };
+		A972AA2121CED2730013AB25 /* inst_bindless_check_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89221CED2720013AB25 /* inst_bindless_check_pass.cpp */; };
+		A972AA2221CED2730013AB25 /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89321CED2720013AB25 /* local_redundancy_elimination.cpp */; };
+		A972AA2321CED2730013AB25 /* local_redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89321CED2720013AB25 /* local_redundancy_elimination.cpp */; };
+		A972AA2421CED2730013AB25 /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89521CED2720013AB25 /* instrument_pass.cpp */; };
+		A972AA2521CED2730013AB25 /* instrument_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89521CED2720013AB25 /* instrument_pass.cpp */; };
+		A972AA2621CED2730013AB25 /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89621CED2720013AB25 /* propagator.h */; };
+		A972AA2721CED2730013AB25 /* propagator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89621CED2720013AB25 /* propagator.h */; };
+		A972AA2821CED2730013AB25 /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89721CED2720013AB25 /* instruction_list.h */; };
+		A972AA2921CED2730013AB25 /* instruction_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89721CED2720013AB25 /* instruction_list.h */; };
+		A972AA2A21CED2730013AB25 /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89821CED2720013AB25 /* feature_manager.cpp */; };
+		A972AA2B21CED2730013AB25 /* feature_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89821CED2720013AB25 /* feature_manager.cpp */; };
+		A972AA2C21CED2730013AB25 /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89921CED2720013AB25 /* pass.cpp */; };
+		A972AA2D21CED2730013AB25 /* pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89921CED2720013AB25 /* pass.cpp */; };
+		A972AA2E21CED2730013AB25 /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89A21CED2720013AB25 /* loop_fission.cpp */; };
+		A972AA2F21CED2730013AB25 /* loop_fission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89A21CED2720013AB25 /* loop_fission.cpp */; };
+		A972AA3021CED2730013AB25 /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89B21CED2720013AB25 /* dominator_tree.cpp */; };
+		A972AA3121CED2730013AB25 /* dominator_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89B21CED2720013AB25 /* dominator_tree.cpp */; };
+		A972AA3221CED2730013AB25 /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89C21CED2720013AB25 /* merge_return_pass.cpp */; };
+		A972AA3321CED2730013AB25 /* merge_return_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89C21CED2720013AB25 /* merge_return_pass.cpp */; };
+		A972AA3421CED2730013AB25 /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89D21CED2720013AB25 /* ir_context.h */; };
+		A972AA3521CED2730013AB25 /* ir_context.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A89D21CED2720013AB25 /* ir_context.h */; };
+		A972AA3621CED2730013AB25 /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89E21CED2720013AB25 /* eliminate_dead_constant_pass.cpp */; };
+		A972AA3721CED2730013AB25 /* eliminate_dead_constant_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89E21CED2720013AB25 /* eliminate_dead_constant_pass.cpp */; };
+		A972AA3821CED2730013AB25 /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89F21CED2720013AB25 /* cfg_cleanup_pass.cpp */; };
+		A972AA3921CED2730013AB25 /* cfg_cleanup_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A89F21CED2720013AB25 /* cfg_cleanup_pass.cpp */; };
+		A972AA3A21CED2730013AB25 /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A021CED2720013AB25 /* const_folding_rules.cpp */; };
+		A972AA3B21CED2730013AB25 /* const_folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A021CED2720013AB25 /* const_folding_rules.cpp */; };
+		A972AA3C21CED2730013AB25 /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A121CED2720013AB25 /* loop_unroller.h */; };
+		A972AA3D21CED2730013AB25 /* loop_unroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A121CED2720013AB25 /* loop_unroller.h */; };
+		A972AA3E21CED2730013AB25 /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A221CED2720013AB25 /* strip_debug_info_pass.cpp */; };
+		A972AA3F21CED2730013AB25 /* strip_debug_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A221CED2720013AB25 /* strip_debug_info_pass.cpp */; };
+		A972AA4021CED2730013AB25 /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A321CED2720013AB25 /* ssa_rewrite_pass.cpp */; };
+		A972AA4121CED2730013AB25 /* ssa_rewrite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A321CED2720013AB25 /* ssa_rewrite_pass.cpp */; };
+		A972AA4221CED2730013AB25 /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A421CED2720013AB25 /* loop_dependence.cpp */; };
+		A972AA4321CED2730013AB25 /* loop_dependence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A421CED2720013AB25 /* loop_dependence.cpp */; };
+		A972AA4421CED2730013AB25 /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A521CED2720013AB25 /* unify_const_pass.h */; };
+		A972AA4521CED2730013AB25 /* unify_const_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A521CED2720013AB25 /* unify_const_pass.h */; };
+		A972AA4621CED2730013AB25 /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A621CED2720013AB25 /* ir_loader.h */; };
+		A972AA4721CED2730013AB25 /* ir_loader.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A621CED2720013AB25 /* ir_loader.h */; };
+		A972AA4821CED2730013AB25 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A721CED2720013AB25 /* types.h */; };
+		A972AA4921CED2730013AB25 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A721CED2720013AB25 /* types.h */; };
+		A972AA4A21CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A821CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.h */; };
+		A972AA4B21CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8A821CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.h */; };
+		A972AA4C21CED2730013AB25 /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A921CED2720013AB25 /* mem_pass.cpp */; };
+		A972AA4D21CED2730013AB25 /* mem_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8A921CED2720013AB25 /* mem_pass.cpp */; };
+		A972AA4E21CED2730013AB25 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8AA21CED2720013AB25 /* basic_block.h */; };
+		A972AA4F21CED2730013AB25 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8AA21CED2720013AB25 /* basic_block.h */; };
+		A972AA5021CED2730013AB25 /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AB21CED2720013AB25 /* remove_duplicates_pass.cpp */; };
+		A972AA5121CED2730013AB25 /* remove_duplicates_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AB21CED2720013AB25 /* remove_duplicates_pass.cpp */; };
+		A972AA5221CED2730013AB25 /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AC21CED2720013AB25 /* dead_variable_elimination.cpp */; };
+		A972AA5321CED2730013AB25 /* dead_variable_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AC21CED2720013AB25 /* dead_variable_elimination.cpp */; };
+		A972AA5421CED2730013AB25 /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8AD21CED2720013AB25 /* block_merge_pass.h */; };
+		A972AA5521CED2730013AB25 /* block_merge_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8AD21CED2720013AB25 /* block_merge_pass.h */; };
+		A972AA5621CED2730013AB25 /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AE21CED2720013AB25 /* module.cpp */; };
+		A972AA5721CED2730013AB25 /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AE21CED2720013AB25 /* module.cpp */; };
+		A972AA5821CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AF21CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.cpp */; };
+		A972AA5921CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8AF21CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.cpp */; };
+		A972AA5A21CED2730013AB25 /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B021CED2720013AB25 /* loop_unswitch_pass.cpp */; };
+		A972AA5B21CED2730013AB25 /* loop_unswitch_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B021CED2720013AB25 /* loop_unswitch_pass.cpp */; };
+		A972AA5C21CED2730013AB25 /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B121CED2720013AB25 /* unify_const_pass.cpp */; };
+		A972AA5D21CED2730013AB25 /* unify_const_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B121CED2720013AB25 /* unify_const_pass.cpp */; };
+		A972AA5E21CED2730013AB25 /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B221CED2720013AB25 /* type_manager.cpp */; };
+		A972AA5F21CED2730013AB25 /* type_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B221CED2720013AB25 /* type_manager.cpp */; };
+		A972AA6021CED2730013AB25 /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B321CED2720013AB25 /* private_to_local_pass.h */; };
+		A972AA6121CED2730013AB25 /* private_to_local_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B321CED2720013AB25 /* private_to_local_pass.h */; };
+		A972AA6221CED2730013AB25 /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B421CED2720013AB25 /* inline_pass.cpp */; };
+		A972AA6321CED2730013AB25 /* inline_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B421CED2720013AB25 /* inline_pass.cpp */; };
+		A972AA6421CED2730013AB25 /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B521CED2720013AB25 /* def_use_manager.h */; };
+		A972AA6521CED2730013AB25 /* def_use_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B521CED2720013AB25 /* def_use_manager.h */; };
+		A972AA6621CED2730013AB25 /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B621CED2720013AB25 /* ir_loader.cpp */; };
+		A972AA6721CED2730013AB25 /* ir_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B621CED2720013AB25 /* ir_loader.cpp */; };
+		A972AA6821CED2730013AB25 /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B721CED2720013AB25 /* cfg_cleanup_pass.h */; };
+		A972AA6921CED2730013AB25 /* cfg_cleanup_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8B721CED2720013AB25 /* cfg_cleanup_pass.h */; };
+		A972AA6A21CED2730013AB25 /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B821CED2720013AB25 /* licm_pass.cpp */; };
+		A972AA6B21CED2730013AB25 /* licm_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B821CED2720013AB25 /* licm_pass.cpp */; };
+		A972AA6C21CED2730013AB25 /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B921CED2720013AB25 /* eliminate_dead_functions_pass.cpp */; };
+		A972AA6D21CED2730013AB25 /* eliminate_dead_functions_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8B921CED2720013AB25 /* eliminate_dead_functions_pass.cpp */; };
+		A972AA6E21CED2730013AB25 /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BA21CED2720013AB25 /* local_redundancy_elimination.h */; };
+		A972AA6F21CED2730013AB25 /* local_redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BA21CED2720013AB25 /* local_redundancy_elimination.h */; };
+		A972AA7021CED2730013AB25 /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BB21CED2720013AB25 /* loop_peeling.h */; };
+		A972AA7121CED2730013AB25 /* loop_peeling.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BB21CED2720013AB25 /* loop_peeling.h */; };
+		A972AA7221CED2730013AB25 /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BC21CED2720013AB25 /* vector_dce.cpp */; };
+		A972AA7321CED2730013AB25 /* vector_dce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BC21CED2720013AB25 /* vector_dce.cpp */; };
+		A972AA7421CED2730013AB25 /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BD21CED2720013AB25 /* loop_unroller.cpp */; };
+		A972AA7521CED2730013AB25 /* loop_unroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BD21CED2720013AB25 /* loop_unroller.cpp */; };
+		A972AA7621CED2730013AB25 /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BE21CED2720013AB25 /* constants.cpp */; };
+		A972AA7721CED2730013AB25 /* constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8BE21CED2720013AB25 /* constants.cpp */; };
+		A972AA7821CED2730013AB25 /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BF21CED2720013AB25 /* loop_fusion_pass.h */; };
+		A972AA7921CED2730013AB25 /* loop_fusion_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8BF21CED2720013AB25 /* loop_fusion_pass.h */; };
+		A972AA7A21CED2730013AB25 /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C021CED2720013AB25 /* struct_cfg_analysis.h */; };
+		A972AA7B21CED2730013AB25 /* struct_cfg_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C021CED2720013AB25 /* struct_cfg_analysis.h */; };
+		A972AA7C21CED2730013AB25 /* common_uniform_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C121CED2720013AB25 /* common_uniform_elim_pass.cpp */; };
+		A972AA7D21CED2730013AB25 /* common_uniform_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C121CED2720013AB25 /* common_uniform_elim_pass.cpp */; };
+		A972AA7E21CED2730013AB25 /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C221CED2720013AB25 /* def_use_manager.cpp */; };
+		A972AA7F21CED2730013AB25 /* def_use_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C221CED2720013AB25 /* def_use_manager.cpp */; };
+		A972AA8021CED2730013AB25 /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C321CED2720013AB25 /* strip_reflect_info_pass.cpp */; };
+		A972AA8121CED2730013AB25 /* strip_reflect_info_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C321CED2720013AB25 /* strip_reflect_info_pass.cpp */; };
+		A972AA8221CED2730013AB25 /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C421CED2720013AB25 /* decoration_manager.h */; };
+		A972AA8321CED2730013AB25 /* decoration_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C421CED2720013AB25 /* decoration_manager.h */; };
+		A972AA8421CED2730013AB25 /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C521CED2720013AB25 /* ccp_pass.cpp */; };
+		A972AA8521CED2730013AB25 /* ccp_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C521CED2720013AB25 /* ccp_pass.cpp */; };
+		A972AA8621CED2730013AB25 /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C621CED2720013AB25 /* local_single_block_elim_pass.h */; };
+		A972AA8721CED2730013AB25 /* local_single_block_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C621CED2720013AB25 /* local_single_block_elim_pass.h */; };
+		A972AA8821CED2730013AB25 /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C721CED2720013AB25 /* pch_source_opt.cpp */; };
+		A972AA8921CED2730013AB25 /* pch_source_opt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C721CED2720013AB25 /* pch_source_opt.cpp */; };
+		A972AA8A21CED2730013AB25 /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C821CED2720013AB25 /* strength_reduction_pass.h */; };
+		A972AA8B21CED2730013AB25 /* strength_reduction_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8C821CED2720013AB25 /* strength_reduction_pass.h */; };
+		A972AA8C21CED2730013AB25 /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C921CED2720013AB25 /* aggressive_dead_code_elim_pass.cpp */; };
+		A972AA8D21CED2730013AB25 /* aggressive_dead_code_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8C921CED2720013AB25 /* aggressive_dead_code_elim_pass.cpp */; };
+		A972AA8E21CED2730013AB25 /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CA21CED2720013AB25 /* simplification_pass.cpp */; };
+		A972AA8F21CED2730013AB25 /* simplification_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CA21CED2720013AB25 /* simplification_pass.cpp */; };
+		A972AA9021CED2730013AB25 /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CB21CED2720013AB25 /* dead_branch_elim_pass.cpp */; };
+		A972AA9121CED2730013AB25 /* dead_branch_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CB21CED2720013AB25 /* dead_branch_elim_pass.cpp */; };
+		A972AA9221CED2730013AB25 /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CC21CED2720013AB25 /* flatten_decoration_pass.cpp */; };
+		A972AA9321CED2730013AB25 /* flatten_decoration_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CC21CED2720013AB25 /* flatten_decoration_pass.cpp */; };
+		A972AA9421CED2730013AB25 /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8CD21CED2720013AB25 /* dead_insert_elim_pass.h */; };
+		A972AA9521CED2730013AB25 /* dead_insert_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8CD21CED2720013AB25 /* dead_insert_elim_pass.h */; };
+		A972AA9621CED2730013AB25 /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CE21CED2720013AB25 /* folding_rules.cpp */; };
+		A972AA9721CED2730013AB25 /* folding_rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8CE21CED2720013AB25 /* folding_rules.cpp */; };
+		A972AA9821CED2730013AB25 /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8CF21CED2720013AB25 /* freeze_spec_constant_value_pass.h */; };
+		A972AA9921CED2730013AB25 /* freeze_spec_constant_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8CF21CED2720013AB25 /* freeze_spec_constant_value_pass.h */; };
+		A972AA9A21CED2730013AB25 /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D021CED2720013AB25 /* ir_context.cpp */; };
+		A972AA9B21CED2730013AB25 /* ir_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D021CED2720013AB25 /* ir_context.cpp */; };
+		A972AA9C21CED2730013AB25 /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D121CED2720013AB25 /* instrument_pass.h */; };
+		A972AA9D21CED2730013AB25 /* instrument_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D121CED2720013AB25 /* instrument_pass.h */; };
+		A972AA9E21CED2730013AB25 /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D221CED2720013AB25 /* mem_pass.h */; };
+		A972AA9F21CED2730013AB25 /* mem_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D221CED2720013AB25 /* mem_pass.h */; };
+		A972AAA021CED2730013AB25 /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D321CED2720013AB25 /* loop_descriptor.cpp */; };
+		A972AAA121CED2730013AB25 /* loop_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D321CED2720013AB25 /* loop_descriptor.cpp */; };
+		A972AAA221CED2730013AB25 /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D421CED2720013AB25 /* local_ssa_elim_pass.cpp */; };
+		A972AAA321CED2730013AB25 /* local_ssa_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D421CED2720013AB25 /* local_ssa_elim_pass.cpp */; };
+		A972AAA421CED2730013AB25 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D521CED2720013AB25 /* function.cpp */; };
+		A972AAA521CED2730013AB25 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D521CED2720013AB25 /* function.cpp */; };
+		A972AAA621CED2730013AB25 /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D621CED2720013AB25 /* instruction_list.cpp */; };
+		A972AAA721CED2730013AB25 /* instruction_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D621CED2720013AB25 /* instruction_list.cpp */; };
+		A972AAA821CED2730013AB25 /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D721CED2720013AB25 /* composite.cpp */; };
+		A972AAA921CED2730013AB25 /* composite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8D721CED2720013AB25 /* composite.cpp */; };
+		A972AAAA21CED2730013AB25 /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D821CED2720013AB25 /* inline_pass.h */; };
+		A972AAAB21CED2730013AB25 /* inline_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D821CED2720013AB25 /* inline_pass.h */; };
+		A972AAAC21CED2730013AB25 /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D921CED2720013AB25 /* loop_dependence.h */; };
+		A972AAAD21CED2730013AB25 /* loop_dependence.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8D921CED2720013AB25 /* loop_dependence.h */; };
+		A972AAAE21CED2730013AB25 /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DA21CED2720013AB25 /* value_number_table.h */; };
+		A972AAAF21CED2730013AB25 /* value_number_table.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DA21CED2720013AB25 /* value_number_table.h */; };
+		A972AAB021CED2730013AB25 /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DB21CED2720013AB25 /* flatten_decoration_pass.h */; };
+		A972AAB121CED2730013AB25 /* flatten_decoration_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DB21CED2720013AB25 /* flatten_decoration_pass.h */; };
+		A972AAB221CED2730013AB25 /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8DC21CED2720013AB25 /* if_conversion.cpp */; };
+		A972AAB321CED2730013AB25 /* if_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8DC21CED2720013AB25 /* if_conversion.cpp */; };
+		A972AAB421CED2730013AB25 /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DD21CED2720013AB25 /* inline_exhaustive_pass.h */; };
+		A972AAB521CED2730013AB25 /* inline_exhaustive_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DD21CED2720013AB25 /* inline_exhaustive_pass.h */; };
+		A972AAB621CED2730013AB25 /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DE21CED2720013AB25 /* constants.h */; };
+		A972AAB721CED2730013AB25 /* constants.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8DE21CED2720013AB25 /* constants.h */; };
+		A972AAB821CED2730013AB25 /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8DF21CED2720013AB25 /* strength_reduction_pass.cpp */; };
+		A972AAB921CED2730013AB25 /* strength_reduction_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8DF21CED2720013AB25 /* strength_reduction_pass.cpp */; };
+		A972AABA21CED2730013AB25 /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E021CED2720013AB25 /* copy_prop_arrays.cpp */; };
+		A972AABB21CED2730013AB25 /* copy_prop_arrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E021CED2720013AB25 /* copy_prop_arrays.cpp */; };
+		A972AABC21CED2730013AB25 /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E121CED2720013AB25 /* pass_manager.cpp */; };
+		A972AABD21CED2730013AB25 /* pass_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E121CED2720013AB25 /* pass_manager.cpp */; };
+		A972AABE21CED2730013AB25 /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E221CED2720013AB25 /* inline_exhaustive_pass.cpp */; };
+		A972AABF21CED2730013AB25 /* inline_exhaustive_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E221CED2720013AB25 /* inline_exhaustive_pass.cpp */; };
+		A972AAC021CED2730013AB25 /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E321CED2720013AB25 /* loop_fission.h */; };
+		A972AAC121CED2730013AB25 /* loop_fission.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E321CED2720013AB25 /* loop_fission.h */; };
+		A972AAC221CED2730013AB25 /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E421CED2720013AB25 /* workaround1209.h */; };
+		A972AAC321CED2730013AB25 /* workaround1209.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E421CED2720013AB25 /* workaround1209.h */; };
+		A972AAC421CED2730013AB25 /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E521CED2720013AB25 /* loop_fusion_pass.cpp */; };
+		A972AAC521CED2730013AB25 /* loop_fusion_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E521CED2720013AB25 /* loop_fusion_pass.cpp */; };
+		A972AAC621CED2730013AB25 /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E621CED2720013AB25 /* log.h */; };
+		A972AAC721CED2730013AB25 /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E621CED2720013AB25 /* log.h */; };
+		A972AAC821CED2730013AB25 /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E721CED2720013AB25 /* copy_prop_arrays.h */; };
+		A972AAC921CED2730013AB25 /* copy_prop_arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E721CED2720013AB25 /* copy_prop_arrays.h */; };
+		A972AACA21CED2730013AB25 /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E821CED2720013AB25 /* eliminate_dead_constant_pass.h */; };
+		A972AACB21CED2730013AB25 /* eliminate_dead_constant_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8E821CED2720013AB25 /* eliminate_dead_constant_pass.h */; };
+		A972AACC21CED2730013AB25 /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E921CED2720013AB25 /* dead_insert_elim_pass.cpp */; };
+		A972AACD21CED2730013AB25 /* dead_insert_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8E921CED2720013AB25 /* dead_insert_elim_pass.cpp */; };
+		A972AACE21CED2730013AB25 /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EA21CED2720013AB25 /* ssa_rewrite_pass.h */; };
+		A972AACF21CED2730013AB25 /* ssa_rewrite_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EA21CED2720013AB25 /* ssa_rewrite_pass.h */; };
+		A972AAD021CED2730013AB25 /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8EB21CED2720013AB25 /* scalar_analysis.cpp */; };
+		A972AAD121CED2730013AB25 /* scalar_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8EB21CED2720013AB25 /* scalar_analysis.cpp */; };
+		A972AAD221CED2730013AB25 /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EC21CED2720013AB25 /* dead_variable_elimination.h */; };
+		A972AAD321CED2730013AB25 /* dead_variable_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EC21CED2720013AB25 /* dead_variable_elimination.h */; };
+		A972AAD421CED2730013AB25 /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8ED21CED2720013AB25 /* block_merge_pass.cpp */; };
+		A972AAD521CED2730013AB25 /* block_merge_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8ED21CED2720013AB25 /* block_merge_pass.cpp */; };
+		A972AAD621CED2730013AB25 /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EE21CED2720013AB25 /* dominator_analysis.h */; };
+		A972AAD721CED2730013AB25 /* dominator_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EE21CED2720013AB25 /* dominator_analysis.h */; };
+		A972AAD821CED2730013AB25 /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EF21CED2720013AB25 /* pass.h */; };
+		A972AAD921CED2730013AB25 /* pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8EF21CED2720013AB25 /* pass.h */; };
+		A972AADA21CED2730013AB25 /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F021CED2720013AB25 /* folding_rules.h */; };
+		A972AADB21CED2730013AB25 /* folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F021CED2720013AB25 /* folding_rules.h */; };
+		A972AADC21CED2730013AB25 /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F121CED2720013AB25 /* eliminate_dead_functions_pass.h */; };
+		A972AADD21CED2730013AB25 /* eliminate_dead_functions_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F121CED2720013AB25 /* eliminate_dead_functions_pass.h */; };
+		A972AADE21CED2730013AB25 /* common_uniform_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F221CED2720013AB25 /* common_uniform_elim_pass.h */; };
+		A972AADF21CED2730013AB25 /* common_uniform_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F221CED2720013AB25 /* common_uniform_elim_pass.h */; };
+		A972AAE021CED2730013AB25 /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F321CED2720013AB25 /* fold.h */; };
+		A972AAE121CED2730013AB25 /* fold.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F321CED2720013AB25 /* fold.h */; };
+		A972AAE221CED2730013AB25 /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F421CED2720013AB25 /* local_single_store_elim_pass.cpp */; };
+		A972AAE321CED2730013AB25 /* local_single_store_elim_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F421CED2720013AB25 /* local_single_store_elim_pass.cpp */; };
+		A972AAE421CED2730013AB25 /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F521CED2720013AB25 /* dead_branch_elim_pass.h */; };
+		A972AAE521CED2730013AB25 /* dead_branch_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F521CED2720013AB25 /* dead_branch_elim_pass.h */; };
+		A972AAE621CED2730013AB25 /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F621CED2720013AB25 /* private_to_local_pass.cpp */; };
+		A972AAE721CED2730013AB25 /* private_to_local_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F621CED2720013AB25 /* private_to_local_pass.cpp */; };
+		A972AAE821CED2730013AB25 /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F721CED2720013AB25 /* scalar_analysis_nodes.h */; };
+		A972AAE921CED2730013AB25 /* scalar_analysis_nodes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8F721CED2720013AB25 /* scalar_analysis_nodes.h */; };
+		A972AAEA21CED2730013AB25 /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F821CED2720013AB25 /* propagator.cpp */; };
+		A972AAEB21CED2730013AB25 /* propagator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F821CED2720013AB25 /* propagator.cpp */; };
+		A972AAEC21CED2730013AB25 /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F921CED2720013AB25 /* loop_dependence_helpers.cpp */; };
+		A972AAED21CED2730013AB25 /* loop_dependence_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8F921CED2720013AB25 /* loop_dependence_helpers.cpp */; };
+		A972AAEE21CED2730013AB25 /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FA21CED2720013AB25 /* set_spec_constant_default_value_pass.cpp */; };
+		A972AAEF21CED2730013AB25 /* set_spec_constant_default_value_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FA21CED2720013AB25 /* set_spec_constant_default_value_pass.cpp */; };
+		A972AAF021CED2730013AB25 /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FB21CED2720013AB25 /* passes.h */; };
+		A972AAF121CED2730013AB25 /* passes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FB21CED2720013AB25 /* passes.h */; };
+		A972AAF221CED2730013AB25 /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FC21CED2720013AB25 /* fold.cpp */; };
+		A972AAF321CED2730013AB25 /* fold.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FC21CED2720013AB25 /* fold.cpp */; };
+		A972AAF421CED2730013AB25 /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FD21CED2720013AB25 /* strip_reflect_info_pass.h */; };
+		A972AAF521CED2730013AB25 /* strip_reflect_info_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FD21CED2720013AB25 /* strip_reflect_info_pass.h */; };
+		A972AAF621CED2730013AB25 /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FE21CED2720013AB25 /* scalar_replacement_pass.cpp */; };
+		A972AAF721CED2730013AB25 /* scalar_replacement_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A8FE21CED2720013AB25 /* scalar_replacement_pass.cpp */; };
+		A972AAF821CED2730013AB25 /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FF21CED2720013AB25 /* simplification_pass.h */; };
+		A972AAF921CED2730013AB25 /* simplification_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A8FF21CED2720013AB25 /* simplification_pass.h */; };
+		A972AAFA21CED2730013AB25 /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90021CED2720013AB25 /* remove_duplicates_pass.h */; };
+		A972AAFB21CED2730013AB25 /* remove_duplicates_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90021CED2720013AB25 /* remove_duplicates_pass.h */; };
+		A972AAFC21CED2730013AB25 /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90121CED2720013AB25 /* redundancy_elimination.cpp */; };
+		A972AAFD21CED2730013AB25 /* redundancy_elimination.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90121CED2720013AB25 /* redundancy_elimination.cpp */; };
+		A972AAFE21CED2730013AB25 /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90221CED2720013AB25 /* reflect.h */; };
+		A972AAFF21CED2730013AB25 /* reflect.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90221CED2720013AB25 /* reflect.h */; };
+		A972AB0021CED2730013AB25 /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90321CED2720013AB25 /* workaround1209.cpp */; };
+		A972AB0121CED2730013AB25 /* workaround1209.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90321CED2720013AB25 /* workaround1209.cpp */; };
+		A972AB0221CED2730013AB25 /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90421CED2720013AB25 /* null_pass.h */; };
+		A972AB0321CED2730013AB25 /* null_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90421CED2720013AB25 /* null_pass.h */; };
+		A972AB0421CED2730013AB25 /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90521CED2720013AB25 /* const_folding_rules.h */; };
+		A972AB0521CED2730013AB25 /* const_folding_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90521CED2720013AB25 /* const_folding_rules.h */; };
+		A972AB0621CED2730013AB25 /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90621CED2720013AB25 /* scalar_replacement_pass.h */; };
+		A972AB0721CED2730013AB25 /* scalar_replacement_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90621CED2720013AB25 /* scalar_replacement_pass.h */; };
+		A972AB0821CED2730013AB25 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90721CED2720013AB25 /* instruction.cpp */; };
+		A972AB0921CED2730013AB25 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90721CED2720013AB25 /* instruction.cpp */; };
+		A972AB0A21CED2730013AB25 /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90821CED2720013AB25 /* pch_source_opt.h */; };
+		A972AB0B21CED2730013AB25 /* pch_source_opt.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90821CED2720013AB25 /* pch_source_opt.h */; };
+		A972AB0C21CED2730013AB25 /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90921CED2720013AB25 /* reduce_load_size.cpp */; };
+		A972AB0D21CED2730013AB25 /* reduce_load_size.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90921CED2720013AB25 /* reduce_load_size.cpp */; };
+		A972AB0E21CED2730013AB25 /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90A21CED2720013AB25 /* redundancy_elimination.h */; };
+		A972AB0F21CED2730013AB25 /* redundancy_elimination.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90A21CED2720013AB25 /* redundancy_elimination.h */; };
+		A972AB1021CED2730013AB25 /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90B21CED2720013AB25 /* value_number_table.cpp */; };
+		A972AB1121CED2730013AB25 /* value_number_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90B21CED2720013AB25 /* value_number_table.cpp */; };
+		A972AB1221CED2730013AB25 /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90C21CED2720013AB25 /* local_ssa_elim_pass.h */; };
+		A972AB1321CED2730013AB25 /* local_ssa_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90C21CED2720013AB25 /* local_ssa_elim_pass.h */; };
+		A972AB1421CED2730013AB25 /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90D21CED2720013AB25 /* inline_opaque_pass.cpp */; };
+		A972AB1521CED2730013AB25 /* inline_opaque_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90D21CED2720013AB25 /* inline_opaque_pass.cpp */; };
+		A972AB1621CED2730013AB25 /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90E21CED2720013AB25 /* replace_invalid_opc.cpp */; };
+		A972AB1721CED2730013AB25 /* replace_invalid_opc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A90E21CED2720013AB25 /* replace_invalid_opc.cpp */; };
+		A972AB1821CED2730013AB25 /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90F21CED2720013AB25 /* loop_utils.h */; };
+		A972AB1921CED2730013AB25 /* loop_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A90F21CED2720013AB25 /* loop_utils.h */; };
+		A972AB1A21CED2730013AB25 /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91021CED2720013AB25 /* module.h */; };
+		A972AB1B21CED2730013AB25 /* module.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91021CED2720013AB25 /* module.h */; };
+		A972AB1C21CED2730013AB25 /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91121CED2720013AB25 /* dominator_analysis.cpp */; };
+		A972AB1D21CED2730013AB25 /* dominator_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91121CED2720013AB25 /* dominator_analysis.cpp */; };
+		A972AB1E21CED2730013AB25 /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91221CED2720013AB25 /* ir_builder.h */; };
+		A972AB1F21CED2730013AB25 /* ir_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91221CED2720013AB25 /* ir_builder.h */; };
+		A972AB2021CED2730013AB25 /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91321CED2720013AB25 /* loop_unswitch_pass.h */; };
+		A972AB2121CED2730013AB25 /* loop_unswitch_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91321CED2720013AB25 /* loop_unswitch_pass.h */; };
+		A972AB2221CED2730013AB25 /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91421CED2720013AB25 /* cfg.h */; };
+		A972AB2321CED2730013AB25 /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91421CED2720013AB25 /* cfg.h */; };
+		A972AB2421CED2730013AB25 /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91521CED2720013AB25 /* loop_descriptor.h */; };
+		A972AB2521CED2730013AB25 /* loop_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91521CED2720013AB25 /* loop_descriptor.h */; };
+		A972AB2621CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91621CED2730013AB25 /* instruction.h */; };
+		A972AB2721CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91621CED2730013AB25 /* instruction.h */; };
+		A972AB2821CED2730013AB25 /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91721CED2730013AB25 /* aggressive_dead_code_elim_pass.h */; };
+		A972AB2921CED2730013AB25 /* aggressive_dead_code_elim_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91721CED2730013AB25 /* aggressive_dead_code_elim_pass.h */; };
+		A972AB2A21CED2730013AB25 /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91821CED2730013AB25 /* struct_cfg_analysis.cpp */; };
+		A972AB2B21CED2730013AB25 /* struct_cfg_analysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91821CED2730013AB25 /* struct_cfg_analysis.cpp */; };
+		A972AB2C21CED2730013AB25 /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91921CED2730013AB25 /* vector_dce.h */; };
+		A972AB2D21CED2730013AB25 /* vector_dce.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91921CED2730013AB25 /* vector_dce.h */; };
+		A972AB2E21CED2730013AB25 /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91A21CED2730013AB25 /* combine_access_chains.h */; };
+		A972AB2F21CED2730013AB25 /* combine_access_chains.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91A21CED2730013AB25 /* combine_access_chains.h */; };
+		A972AB3021CED2730013AB25 /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91B21CED2730013AB25 /* pass_manager.h */; };
+		A972AB3121CED2730013AB25 /* pass_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91B21CED2730013AB25 /* pass_manager.h */; };
+		A972AB3221CED2730013AB25 /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91C21CED2730013AB25 /* local_access_chain_convert_pass.cpp */; };
+		A972AB3321CED2730013AB25 /* local_access_chain_convert_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91C21CED2730013AB25 /* local_access_chain_convert_pass.cpp */; };
+		A972AB3421CED2730013AB25 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91D21CED2730013AB25 /* basic_block.cpp */; };
+		A972AB3521CED2730013AB25 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A91D21CED2730013AB25 /* basic_block.cpp */; };
+		A972AB3621CED2730013AB25 /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91E21CED2730013AB25 /* iterator.h */; };
+		A972AB3721CED2730013AB25 /* iterator.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91E21CED2730013AB25 /* iterator.h */; };
+		A972AB3821CED2730013AB25 /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91F21CED2730013AB25 /* licm_pass.h */; };
+		A972AB3921CED2730013AB25 /* licm_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A91F21CED2730013AB25 /* licm_pass.h */; };
+		A972AB3A21CED2730013AB25 /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92021CED2730013AB25 /* build_module.h */; };
+		A972AB3B21CED2730013AB25 /* build_module.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92021CED2730013AB25 /* build_module.h */; };
+		A972AB3C21CED2730013AB25 /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92121CED2730013AB25 /* ccp_pass.h */; };
+		A972AB3D21CED2730013AB25 /* ccp_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92121CED2730013AB25 /* ccp_pass.h */; };
+		A972AB3E21CED2730013AB25 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92221CED2730013AB25 /* function.h */; };
+		A972AB3F21CED2730013AB25 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92221CED2730013AB25 /* function.h */; };
+		A972AB4021CED2730013AB25 /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92321CED2730013AB25 /* loop_fusion.cpp */; };
+		A972AB4121CED2730013AB25 /* loop_fusion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92321CED2730013AB25 /* loop_fusion.cpp */; };
+		A972AB4221CED2730013AB25 /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92421CED2730013AB25 /* feature_manager.h */; };
+		A972AB4321CED2730013AB25 /* feature_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92421CED2730013AB25 /* feature_manager.h */; };
+		A972AB4421CED2730013AB25 /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92521CED2730013AB25 /* inst_bindless_check_pass.h */; };
+		A972AB4521CED2730013AB25 /* inst_bindless_check_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92521CED2730013AB25 /* inst_bindless_check_pass.h */; };
+		A972AB4621CED2730013AB25 /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92621CED2730013AB25 /* scalar_analysis_simplification.cpp */; };
+		A972AB4721CED2730013AB25 /* scalar_analysis_simplification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92621CED2730013AB25 /* scalar_analysis_simplification.cpp */; };
+		A972AB4821CED2730013AB25 /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92721CED2730013AB25 /* set_spec_constant_default_value_pass.h */; };
+		A972AB4921CED2730013AB25 /* set_spec_constant_default_value_pass.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92721CED2730013AB25 /* set_spec_constant_default_value_pass.h */; };
+		A972AB4A21CED2730013AB25 /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92821CED2730013AB25 /* dominator_tree.h */; };
+		A972AB4B21CED2730013AB25 /* dominator_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92821CED2730013AB25 /* dominator_tree.h */; };
+		A972AB4C21CED2730013AB25 /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92921CED2730013AB25 /* type_manager.h */; };
+		A972AB4D21CED2730013AB25 /* type_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92921CED2730013AB25 /* type_manager.h */; };
+		A972AB4E21CED2730013AB25 /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92A21CED2730013AB25 /* compact_ids_pass.cpp */; };
+		A972AB4F21CED2730013AB25 /* compact_ids_pass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92A21CED2730013AB25 /* compact_ids_pass.cpp */; };
+		A972AB5021CED2730013AB25 /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92B21CED2730013AB25 /* loop_peeling.cpp */; };
+		A972AB5121CED2730013AB25 /* loop_peeling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92B21CED2730013AB25 /* loop_peeling.cpp */; };
+		A972AB5221CED2730013AB25 /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92C21CED2730013AB25 /* table.h */; };
+		A972AB5321CED2730013AB25 /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92C21CED2730013AB25 /* table.h */; };
+		A972AB5421CED2730013AB25 /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92D21CED2730013AB25 /* ext_inst.h */; };
+		A972AB5521CED2730013AB25 /* ext_inst.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92D21CED2730013AB25 /* ext_inst.h */; };
+		A972AB5621CED2730013AB25 /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92E21CED2730013AB25 /* diagnostic.cpp */; };
+		A972AB5721CED2730013AB25 /* diagnostic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A92E21CED2730013AB25 /* diagnostic.cpp */; };
+		A972AB5821CED2730013AB25 /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92F21CED2730013AB25 /* latest_version_spirv_header.h */; };
+		A972AB5921CED2730013AB25 /* latest_version_spirv_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A92F21CED2730013AB25 /* latest_version_spirv_header.h */; };
+		A972AB5A21CED2730013AB25 /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93021CED2730013AB25 /* libspirv.cpp */; };
+		A972AB5B21CED2730013AB25 /* libspirv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93021CED2730013AB25 /* libspirv.cpp */; };
+		A972AB5C21CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93121CED2730013AB25 /* instruction.h */; };
+		A972AB5D21CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93121CED2730013AB25 /* instruction.h */; };
+		A972AB5E21CED2730013AB25 /* id_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93221CED2730013AB25 /* id_descriptor.h */; };
+		A972AB5F21CED2730013AB25 /* id_descriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93221CED2730013AB25 /* id_descriptor.h */; };
+		A972AB6021CED2730013AB25 /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93321CED2730013AB25 /* spirv_optimizer_options.h */; };
+		A972AB6121CED2730013AB25 /* spirv_optimizer_options.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93321CED2730013AB25 /* spirv_optimizer_options.h */; };
+		A972AB6221CED2730013AB25 /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93421CED2730013AB25 /* opcode.h */; };
+		A972AB6321CED2730013AB25 /* opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93421CED2730013AB25 /* opcode.h */; };
+		A972AB6421CED2730013AB25 /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93521CED2730013AB25 /* operand.cpp */; };
+		A972AB6521CED2730013AB25 /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93521CED2730013AB25 /* operand.cpp */; };
+		A972AB6621CED2730013AB25 /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93621CED2730013AB25 /* latest_version_glsl_std_450_header.h */; };
+		A972AB6721CED2730013AB25 /* latest_version_glsl_std_450_header.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93621CED2730013AB25 /* latest_version_glsl_std_450_header.h */; };
+		A972AB6821CED2730013AB25 /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93721CED2730013AB25 /* extensions.h */; };
+		A972AB6921CED2730013AB25 /* extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93721CED2730013AB25 /* extensions.h */; };
+		A972AB6A21CED2730013AB25 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93821CED2730013AB25 /* disassemble.cpp */; };
+		A972AB6B21CED2730013AB25 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93821CED2730013AB25 /* disassemble.cpp */; };
+		A972AB6C21CED2730013AB25 /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93921CED2730013AB25 /* binary.h */; };
+		A972AB6D21CED2730013AB25 /* binary.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93921CED2730013AB25 /* binary.h */; };
+		A972AB6E21CED2730013AB25 /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93A21CED2730013AB25 /* text_handler.cpp */; };
+		A972AB6F21CED2730013AB25 /* text_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93A21CED2730013AB25 /* text_handler.cpp */; };
+		A972AB7021CED2730013AB25 /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93C21CED2730013AB25 /* validate_annotation.cpp */; };
+		A972AB7121CED2730013AB25 /* validate_annotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93C21CED2730013AB25 /* validate_annotation.cpp */; };
+		A972AB7221CED2730013AB25 /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93D21CED2730013AB25 /* validate_cfg.cpp */; };
+		A972AB7321CED2730013AB25 /* validate_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93D21CED2730013AB25 /* validate_cfg.cpp */; };
+		A972AB7421CED2730013AB25 /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93E21CED2730013AB25 /* validate_capability.cpp */; };
+		A972AB7521CED2730013AB25 /* validate_capability.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A93E21CED2730013AB25 /* validate_capability.cpp */; };
+		A972AB7621CED2730013AB25 /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93F21CED2730013AB25 /* construct.h */; };
+		A972AB7721CED2730013AB25 /* construct.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A93F21CED2730013AB25 /* construct.h */; };
+		A972AB7821CED2730013AB25 /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94021CED2730013AB25 /* validate_barriers.cpp */; };
+		A972AB7921CED2730013AB25 /* validate_barriers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94021CED2730013AB25 /* validate_barriers.cpp */; };
+		A972AB7A21CED2730013AB25 /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94121CED2730013AB25 /* validate_non_uniform.cpp */; };
+		A972AB7B21CED2730013AB25 /* validate_non_uniform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94121CED2730013AB25 /* validate_non_uniform.cpp */; };
+		A972AB7C21CED2730013AB25 /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94221CED2730013AB25 /* validate_atomics.cpp */; };
+		A972AB7D21CED2730013AB25 /* validate_atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94221CED2730013AB25 /* validate_atomics.cpp */; };
+		A972AB7E21CED2730013AB25 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94321CED2730013AB25 /* basic_block.h */; };
+		A972AB7F21CED2730013AB25 /* basic_block.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94321CED2730013AB25 /* basic_block.h */; };
+		A972AB8021CED2730013AB25 /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94421CED2730013AB25 /* validate_instruction.cpp */; };
+		A972AB8121CED2730013AB25 /* validate_instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94421CED2730013AB25 /* validate_instruction.cpp */; };
+		A972AB8221CED2730013AB25 /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94521CED2730013AB25 /* validate_decorations.cpp */; };
+		A972AB8321CED2730013AB25 /* validate_decorations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94521CED2730013AB25 /* validate_decorations.cpp */; };
+		A972AB8421CED2730013AB25 /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94621CED2730013AB25 /* validate_debug.cpp */; };
+		A972AB8521CED2730013AB25 /* validate_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94621CED2730013AB25 /* validate_debug.cpp */; };
+		A972AB8621CED2730013AB25 /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94721CED2730013AB25 /* validate_builtins.cpp */; };
+		A972AB8721CED2730013AB25 /* validate_builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94721CED2730013AB25 /* validate_builtins.cpp */; };
+		A972AB8821CED2730013AB25 /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94821CED2730013AB25 /* validate_interfaces.cpp */; };
+		A972AB8921CED2730013AB25 /* validate_interfaces.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94821CED2730013AB25 /* validate_interfaces.cpp */; };
+		A972AB8A21CED2730013AB25 /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94921CED2730013AB25 /* validate.cpp */; };
+		A972AB8B21CED2730013AB25 /* validate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94921CED2730013AB25 /* validate.cpp */; };
+		A972AB8C21CED2730013AB25 /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94A21CED2730013AB25 /* validation_state.h */; };
+		A972AB8D21CED2730013AB25 /* validation_state.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94A21CED2730013AB25 /* validation_state.h */; };
+		A972AB8E21CED2730013AB25 /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94B21CED2730013AB25 /* validate_constants.cpp */; };
+		A972AB8F21CED2730013AB25 /* validate_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94B21CED2730013AB25 /* validate_constants.cpp */; };
+		A972AB9021CED2730013AB25 /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94C21CED2730013AB25 /* validate_bitwise.cpp */; };
+		A972AB9121CED2730013AB25 /* validate_bitwise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94C21CED2730013AB25 /* validate_bitwise.cpp */; };
+		A972AB9221CED2730013AB25 /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94D21CED2730013AB25 /* construct.cpp */; };
+		A972AB9321CED2730013AB25 /* construct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94D21CED2730013AB25 /* construct.cpp */; };
+		A972AB9421CED2730013AB25 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94E21CED2730013AB25 /* function.cpp */; };
+		A972AB9521CED2730013AB25 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A94E21CED2730013AB25 /* function.cpp */; };
+		A972AB9621CED2730013AB25 /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94F21CED2730013AB25 /* validate.h */; };
+		A972AB9721CED2730013AB25 /* validate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A94F21CED2730013AB25 /* validate.h */; };
+		A972AB9821CED2730013AB25 /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95021CED2730013AB25 /* validate_adjacency.cpp */; };
+		A972AB9921CED2730013AB25 /* validate_adjacency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95021CED2730013AB25 /* validate_adjacency.cpp */; };
+		A972AB9A21CED2730013AB25 /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95121CED2730013AB25 /* validate_conversion.cpp */; };
+		A972AB9B21CED2730013AB25 /* validate_conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95121CED2730013AB25 /* validate_conversion.cpp */; };
+		A972AB9C21CED2730013AB25 /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95221CED2730013AB25 /* validate_datarules.cpp */; };
+		A972AB9D21CED2730013AB25 /* validate_datarules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95221CED2730013AB25 /* validate_datarules.cpp */; };
+		A972AB9E21CED2730013AB25 /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95321CED2730013AB25 /* validate_id.cpp */; };
+		A972AB9F21CED2730013AB25 /* validate_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95321CED2730013AB25 /* validate_id.cpp */; };
+		A972ABA021CED2730013AB25 /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95421CED2730013AB25 /* validate_arithmetics.cpp */; };
+		A972ABA121CED2730013AB25 /* validate_arithmetics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95421CED2730013AB25 /* validate_arithmetics.cpp */; };
+		A972ABA221CED2730013AB25 /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95521CED2730013AB25 /* validate_mode_setting.cpp */; };
+		A972ABA321CED2730013AB25 /* validate_mode_setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95521CED2730013AB25 /* validate_mode_setting.cpp */; };
+		A972ABA421CED2730013AB25 /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95621CED2730013AB25 /* validate_logicals.cpp */; };
+		A972ABA521CED2730013AB25 /* validate_logicals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95621CED2730013AB25 /* validate_logicals.cpp */; };
+		A972ABA621CED2730013AB25 /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95721CED2730013AB25 /* validate_derivatives.cpp */; };
+		A972ABA721CED2730013AB25 /* validate_derivatives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95721CED2730013AB25 /* validate_derivatives.cpp */; };
+		A972ABA821CED2730013AB25 /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95821CED2730013AB25 /* validate_memory.cpp */; };
+		A972ABA921CED2730013AB25 /* validate_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95821CED2730013AB25 /* validate_memory.cpp */; };
+		A972ABAA21CED2730013AB25 /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95921CED2730013AB25 /* validate_image.cpp */; };
+		A972ABAB21CED2730013AB25 /* validate_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95921CED2730013AB25 /* validate_image.cpp */; };
+		A972ABAC21CED2730013AB25 /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95A21CED2730013AB25 /* validate_literals.cpp */; };
+		A972ABAD21CED2730013AB25 /* validate_literals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95A21CED2730013AB25 /* validate_literals.cpp */; };
+		A972ABAE21CED2730013AB25 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95B21CED2730013AB25 /* instruction.cpp */; };
+		A972ABAF21CED2730013AB25 /* instruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95B21CED2730013AB25 /* instruction.cpp */; };
+		A972ABB021CED2730013AB25 /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95C21CED2730013AB25 /* validate_type.cpp */; };
+		A972ABB121CED2730013AB25 /* validate_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95C21CED2730013AB25 /* validate_type.cpp */; };
+		A972ABB221CED2730013AB25 /* validate_ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95D21CED2730013AB25 /* validate_ext_inst.cpp */; };
+		A972ABB321CED2730013AB25 /* validate_ext_inst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95D21CED2730013AB25 /* validate_ext_inst.cpp */; };
+		A972ABB421CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A95E21CED2730013AB25 /* instruction.h */; };
+		A972ABB521CED2730013AB25 /* instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A95E21CED2730013AB25 /* instruction.h */; };
+		A972ABB621CED2730013AB25 /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95F21CED2730013AB25 /* validate_execution_limitations.cpp */; };
+		A972ABB721CED2730013AB25 /* validate_execution_limitations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A95F21CED2730013AB25 /* validate_execution_limitations.cpp */; };
+		A972ABB821CED2730013AB25 /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96021CED2730013AB25 /* validate_layout.cpp */; };
+		A972ABB921CED2730013AB25 /* validate_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96021CED2730013AB25 /* validate_layout.cpp */; };
+		A972ABBA21CED2730013AB25 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96121CED2730013AB25 /* basic_block.cpp */; };
+		A972ABBB21CED2730013AB25 /* basic_block.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96121CED2730013AB25 /* basic_block.cpp */; };
+		A972ABBC21CED2730013AB25 /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96221CED2730013AB25 /* validate_function.cpp */; };
+		A972ABBD21CED2730013AB25 /* validate_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96221CED2730013AB25 /* validate_function.cpp */; };
+		A972ABBE21CED2730013AB25 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A96321CED2730013AB25 /* function.h */; };
+		A972ABBF21CED2730013AB25 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A96321CED2730013AB25 /* function.h */; };
+		A972ABC021CED2730013AB25 /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96421CED2730013AB25 /* validate_composites.cpp */; };
+		A972ABC121CED2730013AB25 /* validate_composites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96421CED2730013AB25 /* validate_composites.cpp */; };
+		A972ABC221CED2730013AB25 /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96521CED2730013AB25 /* validation_state.cpp */; };
+		A972ABC321CED2730013AB25 /* validation_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96521CED2730013AB25 /* validation_state.cpp */; };
+		A972ABC421CED2730013AB25 /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96621CED2730013AB25 /* validate_primitives.cpp */; };
+		A972ABC521CED2730013AB25 /* validate_primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972A96621CED2730013AB25 /* validate_primitives.cpp */; };
+		A972ABC621CED2730013AB25 /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A96721CED2730013AB25 /* decoration.h */; };
+		A972ABC721CED2730013AB25 /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A972A96721CED2730013AB25 /* decoration.h */; };
+		A972ABCB21CED7BC0013AB25 /* spirv_cfg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290921CC60BC00B52A68 /* spirv_cfg.hpp */; };
+		A972ABCC21CED7BC0013AB25 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */; };
+		A972ABCD21CED7BC0013AB25 /* spirv_common.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290721CC60BC00B52A68 /* spirv_common.hpp */; };
+		A972ABCE21CED7BC0013AB25 /* spirv_glsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */; };
+		A972ABCF21CED7BC0013AB25 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290C21CC60BC00B52A68 /* spirv_parser.hpp */; };
+		A972ABD021CED7BC0013AB25 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290321CC60BC00B52A68 /* spirv_cross.hpp */; };
+		A972ABD121CED7BC0013AB25 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; };
+		A972ABD321CED7BC0013AB25 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290D21CC60BC00B52A68 /* spirv_msl.cpp */; };
+		A972ABD421CED7BC0013AB25 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290421CC60BC00B52A68 /* spirv_parser.cpp */; };
+		A972ABD521CED7BC0013AB25 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */; };
+		A972ABD621CED7BC0013AB25 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290521CC60BC00B52A68 /* spirv_cross.cpp */; };
+		A972ABD721CED7BC0013AB25 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290621CC60BC00B52A68 /* spirv_glsl.cpp */; };
+		A972ABD821CED7BC0013AB25 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
+		A972ABDF21CED7CB0013AB25 /* spirv_cfg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290921CC60BC00B52A68 /* spirv_cfg.hpp */; };
+		A972ABE021CED7CB0013AB25 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */; };
+		A972ABE121CED7CB0013AB25 /* spirv_common.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290721CC60BC00B52A68 /* spirv_common.hpp */; };
+		A972ABE221CED7CB0013AB25 /* spirv_glsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */; };
+		A972ABE321CED7CB0013AB25 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290C21CC60BC00B52A68 /* spirv_parser.hpp */; };
+		A972ABE421CED7CB0013AB25 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290321CC60BC00B52A68 /* spirv_cross.hpp */; };
+		A972ABE521CED7CB0013AB25 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; };
+		A972ABE721CED7CB0013AB25 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290D21CC60BC00B52A68 /* spirv_msl.cpp */; };
+		A972ABE821CED7CB0013AB25 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290421CC60BC00B52A68 /* spirv_parser.cpp */; };
+		A972ABE921CED7CB0013AB25 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */; };
+		A972ABEA21CED7CB0013AB25 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290521CC60BC00B52A68 /* spirv_cross.cpp */; };
+		A972ABEB21CED7CB0013AB25 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290621CC60BC00B52A68 /* spirv_glsl.cpp */; };
+		A972ABEC21CED7CB0013AB25 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
+		A972AC6521CED9060013AB25 /* InitializeDll.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABF721CED9060013AB25 /* InitializeDll.h */; };
+		A972AC6621CED9060013AB25 /* InitializeDll.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABF721CED9060013AB25 /* InitializeDll.h */; };
+		A972AC6721CED9060013AB25 /* InitializeDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABF821CED9060013AB25 /* InitializeDll.cpp */; };
+		A972AC6821CED9060013AB25 /* InitializeDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABF821CED9060013AB25 /* InitializeDll.cpp */; };
+		A972AC6921CED9060013AB25 /* SPVRemapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFA21CED9060013AB25 /* SPVRemapper.h */; };
+		A972AC6A21CED9060013AB25 /* SPVRemapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFA21CED9060013AB25 /* SPVRemapper.h */; };
+		A972AC6B21CED9060013AB25 /* SpvBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFB21CED9060013AB25 /* SpvBuilder.h */; };
+		A972AC6C21CED9060013AB25 /* SpvBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFB21CED9060013AB25 /* SpvBuilder.h */; };
+		A972AC6D21CED9060013AB25 /* SpvPostProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABFD21CED9060013AB25 /* SpvPostProcess.cpp */; };
+		A972AC6E21CED9060013AB25 /* SpvPostProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABFD21CED9060013AB25 /* SpvPostProcess.cpp */; };
+		A972AC6F21CED9060013AB25 /* SpvTools.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFE21CED9060013AB25 /* SpvTools.h */; };
+		A972AC7021CED9060013AB25 /* SpvTools.h in Headers */ = {isa = PBXBuildFile; fileRef = A972ABFE21CED9060013AB25 /* SpvTools.h */; };
+		A972AC7121CED9060013AB25 /* SpvTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABFF21CED9060013AB25 /* SpvTools.cpp */; };
+		A972AC7221CED9060013AB25 /* SpvTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972ABFF21CED9060013AB25 /* SpvTools.cpp */; };
+		A972AC7321CED9060013AB25 /* InReadableOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0021CED9060013AB25 /* InReadableOrder.cpp */; };
+		A972AC7421CED9060013AB25 /* InReadableOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0021CED9060013AB25 /* InReadableOrder.cpp */; };
+		A972AC7521CED9060013AB25 /* GLSL.ext.AMD.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0121CED9060013AB25 /* GLSL.ext.AMD.h */; };
+		A972AC7621CED9060013AB25 /* GLSL.ext.AMD.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0121CED9060013AB25 /* GLSL.ext.AMD.h */; };
+		A972AC7721CED9060013AB25 /* doc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0221CED9060013AB25 /* doc.h */; };
+		A972AC7821CED9060013AB25 /* doc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0221CED9060013AB25 /* doc.h */; };
+		A972AC7921CED9060013AB25 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0321CED9060013AB25 /* spirv.hpp */; };
+		A972AC7A21CED9060013AB25 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0321CED9060013AB25 /* spirv.hpp */; };
+		A972AC7B21CED9060013AB25 /* SpvBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0421CED9060013AB25 /* SpvBuilder.cpp */; };
+		A972AC7C21CED9060013AB25 /* SpvBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0421CED9060013AB25 /* SpvBuilder.cpp */; };
+		A972AC7D21CED9060013AB25 /* GLSL.ext.EXT.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0521CED9060013AB25 /* GLSL.ext.EXT.h */; };
+		A972AC7E21CED9060013AB25 /* GLSL.ext.EXT.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0521CED9060013AB25 /* GLSL.ext.EXT.h */; };
+		A972AC7F21CED9060013AB25 /* GLSL.ext.KHR.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0621CED9060013AB25 /* GLSL.ext.KHR.h */; };
+		A972AC8021CED9060013AB25 /* GLSL.ext.KHR.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0621CED9060013AB25 /* GLSL.ext.KHR.h */; };
+		A972AC8121CED9060013AB25 /* GLSL.ext.NV.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0721CED9060013AB25 /* GLSL.ext.NV.h */; };
+		A972AC8221CED9060013AB25 /* GLSL.ext.NV.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0721CED9060013AB25 /* GLSL.ext.NV.h */; };
+		A972AC8321CED9060013AB25 /* GlslangToSpv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0821CED9060013AB25 /* GlslangToSpv.cpp */; };
+		A972AC8421CED9060013AB25 /* GlslangToSpv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0821CED9060013AB25 /* GlslangToSpv.cpp */; };
+		A972AC8521CED9060013AB25 /* spvIR.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0921CED9060013AB25 /* spvIR.h */; };
+		A972AC8621CED9060013AB25 /* spvIR.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0921CED9060013AB25 /* spvIR.h */; };
+		A972AC8721CED9060013AB25 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0A21CED9060013AB25 /* bitutils.h */; };
+		A972AC8821CED9060013AB25 /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0A21CED9060013AB25 /* bitutils.h */; };
+		A972AC8921CED9060013AB25 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0B21CED9060013AB25 /* disassemble.h */; };
+		A972AC8A21CED9060013AB25 /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0B21CED9060013AB25 /* disassemble.h */; };
+		A972AC8B21CED9060013AB25 /* GlslangToSpv.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0C21CED9060013AB25 /* GlslangToSpv.h */; };
+		A972AC8C21CED9060013AB25 /* GlslangToSpv.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0C21CED9060013AB25 /* GlslangToSpv.h */; };
+		A972AC8D21CED9060013AB25 /* GLSL.std.450.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0D21CED9060013AB25 /* GLSL.std.450.h */; };
+		A972AC8E21CED9060013AB25 /* GLSL.std.450.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC0D21CED9060013AB25 /* GLSL.std.450.h */; };
+		A972AC8F21CED9060013AB25 /* SPVRemapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0E21CED9060013AB25 /* SPVRemapper.cpp */; };
+		A972AC9021CED9060013AB25 /* SPVRemapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0E21CED9060013AB25 /* SPVRemapper.cpp */; };
+		A972AC9121CED9060013AB25 /* Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0F21CED9060013AB25 /* Logger.cpp */; };
+		A972AC9221CED9060013AB25 /* Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC0F21CED9060013AB25 /* Logger.cpp */; };
+		A972AC9321CED9060013AB25 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1021CED9060013AB25 /* hex_float.h */; };
+		A972AC9421CED9060013AB25 /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1021CED9060013AB25 /* hex_float.h */; };
+		A972AC9521CED9060013AB25 /* Logger.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1121CED9060013AB25 /* Logger.h */; };
+		A972AC9621CED9060013AB25 /* Logger.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1121CED9060013AB25 /* Logger.h */; };
+		A972AC9721CED9060013AB25 /* doc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1221CED9060013AB25 /* doc.cpp */; };
+		A972AC9821CED9060013AB25 /* doc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1221CED9060013AB25 /* doc.cpp */; };
+		A972AC9921CED9060013AB25 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1321CED9060013AB25 /* disassemble.cpp */; };
+		A972AC9A21CED9060013AB25 /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1321CED9060013AB25 /* disassemble.cpp */; };
+		A972AC9B21CED9060013AB25 /* ossource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1821CED9060013AB25 /* ossource.cpp */; };
+		A972AC9C21CED9060013AB25 /* ossource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC1821CED9060013AB25 /* ossource.cpp */; };
+		A972AC9D21CED9060013AB25 /* osinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1A21CED9060013AB25 /* osinclude.h */; };
+		A972AC9E21CED9060013AB25 /* osinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC1A21CED9060013AB25 /* osinclude.h */; };
+		A972ACA321CED9060013AB25 /* ResourceLimits.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2021CED9060013AB25 /* ResourceLimits.h */; };
+		A972ACA421CED9060013AB25 /* ResourceLimits.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2021CED9060013AB25 /* ResourceLimits.h */; };
+		A972ACA521CED9060013AB25 /* Types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2121CED9060013AB25 /* Types.h */; };
+		A972ACA621CED9060013AB25 /* Types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2121CED9060013AB25 /* Types.h */; };
+		A972ACA721CED9060013AB25 /* intermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2221CED9060013AB25 /* intermediate.h */; };
+		A972ACA821CED9060013AB25 /* intermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2221CED9060013AB25 /* intermediate.h */; };
+		A972ACA921CED9060013AB25 /* BaseTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2321CED9060013AB25 /* BaseTypes.h */; };
+		A972ACAA21CED9060013AB25 /* BaseTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2321CED9060013AB25 /* BaseTypes.h */; };
+		A972ACAB21CED9060013AB25 /* revision.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2421CED9060013AB25 /* revision.h */; };
+		A972ACAC21CED9060013AB25 /* revision.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2421CED9060013AB25 /* revision.h */; };
+		A972ACAD21CED9060013AB25 /* InitializeGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2521CED9060013AB25 /* InitializeGlobals.h */; };
+		A972ACAE21CED9060013AB25 /* InitializeGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2521CED9060013AB25 /* InitializeGlobals.h */; };
+		A972ACAF21CED9060013AB25 /* ShHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2621CED9060013AB25 /* ShHandle.h */; };
+		A972ACB021CED9060013AB25 /* ShHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2621CED9060013AB25 /* ShHandle.h */; };
+		A972ACB121CED9060013AB25 /* arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2721CED9060013AB25 /* arrays.h */; };
+		A972ACB221CED9060013AB25 /* arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2721CED9060013AB25 /* arrays.h */; };
+		A972ACB321CED9060013AB25 /* Common.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2821CED9060013AB25 /* Common.h */; };
+		A972ACB421CED9060013AB25 /* Common.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2821CED9060013AB25 /* Common.h */; };
+		A972ACB521CED9060013AB25 /* ConstantUnion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2A21CED9060013AB25 /* ConstantUnion.h */; };
+		A972ACB621CED9060013AB25 /* ConstantUnion.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2A21CED9060013AB25 /* ConstantUnion.h */; };
+		A972ACB721CED9060013AB25 /* InfoSink.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2B21CED9060013AB25 /* InfoSink.h */; };
+		A972ACB821CED9060013AB25 /* InfoSink.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2B21CED9060013AB25 /* InfoSink.h */; };
+		A972ACB921CED9060013AB25 /* PoolAlloc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2C21CED9060013AB25 /* PoolAlloc.h */; };
+		A972ACBA21CED9060013AB25 /* PoolAlloc.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC2C21CED9060013AB25 /* PoolAlloc.h */; };
+		A972ACBB21CED9060013AB25 /* ParseHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC2F21CED9060013AB25 /* ParseHelper.cpp */; };
+		A972ACBC21CED9060013AB25 /* ParseHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC2F21CED9060013AB25 /* ParseHelper.cpp */; };
+		A972ACBD21CED9060013AB25 /* parseVersions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3021CED9060013AB25 /* parseVersions.h */; };
+		A972ACBE21CED9060013AB25 /* parseVersions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3021CED9060013AB25 /* parseVersions.h */; };
+		A972ACBF21CED9060013AB25 /* gl_types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3121CED9060013AB25 /* gl_types.h */; };
+		A972ACC021CED9060013AB25 /* gl_types.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3121CED9060013AB25 /* gl_types.h */; };
+		A972ACC121CED9060013AB25 /* propagateNoContraction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3221CED9060013AB25 /* propagateNoContraction.cpp */; };
+		A972ACC221CED9060013AB25 /* propagateNoContraction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3221CED9060013AB25 /* propagateNoContraction.cpp */; };
+		A972ACC321CED9060013AB25 /* pch.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3321CED9060013AB25 /* pch.h */; };
+		A972ACC421CED9060013AB25 /* pch.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3321CED9060013AB25 /* pch.h */; };
+		A972ACC521CED9060013AB25 /* ScanContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3421CED9060013AB25 /* ScanContext.h */; };
+		A972ACC621CED9060013AB25 /* ScanContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3421CED9060013AB25 /* ScanContext.h */; };
+		A972ACC721CED9060013AB25 /* iomapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3521CED9060013AB25 /* iomapper.h */; };
+		A972ACC821CED9060013AB25 /* iomapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3521CED9060013AB25 /* iomapper.h */; };
+		A972ACC921CED9060013AB25 /* localintermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3621CED9060013AB25 /* localintermediate.h */; };
+		A972ACCA21CED9060013AB25 /* localintermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3621CED9060013AB25 /* localintermediate.h */; };
+		A972ACCB21CED9060013AB25 /* Scan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3721CED9060013AB25 /* Scan.cpp */; };
+		A972ACCC21CED9060013AB25 /* Scan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3721CED9060013AB25 /* Scan.cpp */; };
+		A972ACCF21CED9060013AB25 /* RemoveTree.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3921CED9060013AB25 /* RemoveTree.h */; };
+		A972ACD021CED9060013AB25 /* RemoveTree.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3921CED9060013AB25 /* RemoveTree.h */; };
+		A972ACD121CED9060013AB25 /* Initialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3A21CED9060013AB25 /* Initialize.cpp */; };
+		A972ACD221CED9060013AB25 /* Initialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3A21CED9060013AB25 /* Initialize.cpp */; };
+		A972ACD321CED9060013AB25 /* glslang_tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3B21CED9060013AB25 /* glslang_tab.cpp */; };
+		A972ACD421CED9060013AB25 /* glslang_tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3B21CED9060013AB25 /* glslang_tab.cpp */; };
+		A972ACD521CED9060013AB25 /* limits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3C21CED9060013AB25 /* limits.cpp */; };
+		A972ACD621CED9060013AB25 /* limits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3C21CED9060013AB25 /* limits.cpp */; };
+		A972ACD721CED9060013AB25 /* parseConst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3D21CED9060013AB25 /* parseConst.cpp */; };
+		A972ACD821CED9060013AB25 /* parseConst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC3D21CED9060013AB25 /* parseConst.cpp */; };
+		A972ACD921CED9060013AB25 /* propagateNoContraction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3E21CED9060013AB25 /* propagateNoContraction.h */; };
+		A972ACDA21CED9060013AB25 /* propagateNoContraction.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3E21CED9060013AB25 /* propagateNoContraction.h */; };
+		A972ACDB21CED9060013AB25 /* Versions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3F21CED9060013AB25 /* Versions.h */; };
+		A972ACDC21CED9060013AB25 /* Versions.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC3F21CED9060013AB25 /* Versions.h */; };
+		A972ACDD21CED9060013AB25 /* IntermTraverse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4021CED9060013AB25 /* IntermTraverse.cpp */; };
+		A972ACDE21CED9060013AB25 /* IntermTraverse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4021CED9060013AB25 /* IntermTraverse.cpp */; };
+		A972ACDF21CED9060013AB25 /* intermOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4121CED9060013AB25 /* intermOut.cpp */; };
+		A972ACE021CED9060013AB25 /* intermOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4121CED9060013AB25 /* intermOut.cpp */; };
+		A972ACE121CED9060013AB25 /* iomapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4221CED9060013AB25 /* iomapper.cpp */; };
+		A972ACE221CED9060013AB25 /* iomapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4221CED9060013AB25 /* iomapper.cpp */; };
+		A972ACE321CED9060013AB25 /* PoolAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4321CED9060013AB25 /* PoolAlloc.cpp */; };
+		A972ACE421CED9060013AB25 /* PoolAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4321CED9060013AB25 /* PoolAlloc.cpp */; };
+		A972ACE521CED9060013AB25 /* ShaderLang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4421CED9060013AB25 /* ShaderLang.cpp */; };
+		A972ACE621CED9060013AB25 /* ShaderLang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4421CED9060013AB25 /* ShaderLang.cpp */; };
+		A972ACE721CED9060013AB25 /* SymbolTable.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4521CED9060013AB25 /* SymbolTable.h */; };
+		A972ACE821CED9060013AB25 /* SymbolTable.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4521CED9060013AB25 /* SymbolTable.h */; };
+		A972ACE921CED9060013AB25 /* InfoSink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4621CED9060013AB25 /* InfoSink.cpp */; };
+		A972ACEA21CED9060013AB25 /* InfoSink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4621CED9060013AB25 /* InfoSink.cpp */; };
+		A972ACEB21CED9060013AB25 /* Intermediate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4721CED9060013AB25 /* Intermediate.cpp */; };
+		A972ACEC21CED9060013AB25 /* Intermediate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4721CED9060013AB25 /* Intermediate.cpp */; };
+		A972ACED21CED9060013AB25 /* pch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4821CED9060013AB25 /* pch.cpp */; };
+		A972ACEE21CED9060013AB25 /* pch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4821CED9060013AB25 /* pch.cpp */; };
+		A972ACEF21CED9060013AB25 /* SymbolTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4921CED9060013AB25 /* SymbolTable.cpp */; };
+		A972ACF021CED9060013AB25 /* SymbolTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4921CED9060013AB25 /* SymbolTable.cpp */; };
+		A972ACF121CED9060013AB25 /* glslang_tab.cpp.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4A21CED9060013AB25 /* glslang_tab.cpp.h */; };
+		A972ACF221CED9060013AB25 /* glslang_tab.cpp.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4A21CED9060013AB25 /* glslang_tab.cpp.h */; };
+		A972ACF321CED9060013AB25 /* LiveTraverser.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4B21CED9060013AB25 /* LiveTraverser.h */; };
+		A972ACF421CED9060013AB25 /* LiveTraverser.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4B21CED9060013AB25 /* LiveTraverser.h */; };
+		A972ACF521CED9060013AB25 /* Initialize.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4C21CED9060013AB25 /* Initialize.h */; };
+		A972ACF621CED9060013AB25 /* Initialize.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC4C21CED9060013AB25 /* Initialize.h */; };
+		A972ACF721CED9060013AB25 /* attribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4D21CED9060013AB25 /* attribute.cpp */; };
+		A972ACF821CED9060013AB25 /* attribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4D21CED9060013AB25 /* attribute.cpp */; };
+		A972ACF921CED9060013AB25 /* reflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4E21CED9060013AB25 /* reflection.cpp */; };
+		A972ACFA21CED9060013AB25 /* reflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4E21CED9060013AB25 /* reflection.cpp */; };
+		A972ACFB21CED9060013AB25 /* RemoveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4F21CED9060013AB25 /* RemoveTree.cpp */; };
+		A972ACFC21CED9060013AB25 /* RemoveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC4F21CED9060013AB25 /* RemoveTree.cpp */; };
+		A972ACFD21CED9060013AB25 /* attribute.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5021CED9060013AB25 /* attribute.h */; };
+		A972ACFE21CED9060013AB25 /* attribute.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5021CED9060013AB25 /* attribute.h */; };
+		A972ACFF21CED9060013AB25 /* Versions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5121CED9060013AB25 /* Versions.cpp */; };
+		A972AD0021CED9060013AB25 /* Versions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5121CED9060013AB25 /* Versions.cpp */; };
+		A972AD0121CED9060013AB25 /* Constant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5221CED9060013AB25 /* Constant.cpp */; };
+		A972AD0221CED9060013AB25 /* Constant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5221CED9060013AB25 /* Constant.cpp */; };
+		A972AD0321CED9060013AB25 /* linkValidate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5321CED9060013AB25 /* linkValidate.cpp */; };
+		A972AD0421CED9060013AB25 /* linkValidate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5321CED9060013AB25 /* linkValidate.cpp */; };
+		A972AD0521CED9060013AB25 /* ParseHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5421CED9060013AB25 /* ParseHelper.h */; };
+		A972AD0621CED9060013AB25 /* ParseHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5421CED9060013AB25 /* ParseHelper.h */; };
+		A972AD0721CED9060013AB25 /* PpAtom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5621CED9060013AB25 /* PpAtom.cpp */; };
+		A972AD0821CED9060013AB25 /* PpAtom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5621CED9060013AB25 /* PpAtom.cpp */; };
+		A972AD0921CED9060013AB25 /* PpTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5721CED9060013AB25 /* PpTokens.h */; };
+		A972AD0A21CED9060013AB25 /* PpTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5721CED9060013AB25 /* PpTokens.h */; };
+		A972AD0B21CED9060013AB25 /* Pp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5821CED9060013AB25 /* Pp.cpp */; };
+		A972AD0C21CED9060013AB25 /* Pp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5821CED9060013AB25 /* Pp.cpp */; };
+		A972AD0D21CED9060013AB25 /* PpContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5921CED9060013AB25 /* PpContext.h */; };
+		A972AD0E21CED9060013AB25 /* PpContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5921CED9060013AB25 /* PpContext.h */; };
+		A972AD0F21CED9060013AB25 /* PpTokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5A21CED9060013AB25 /* PpTokens.cpp */; };
+		A972AD1021CED9060013AB25 /* PpTokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5A21CED9060013AB25 /* PpTokens.cpp */; };
+		A972AD1121CED9060013AB25 /* PpContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5B21CED9060013AB25 /* PpContext.cpp */; };
+		A972AD1221CED9060013AB25 /* PpContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5B21CED9060013AB25 /* PpContext.cpp */; };
+		A972AD1321CED9060013AB25 /* PpScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5C21CED9060013AB25 /* PpScanner.cpp */; };
+		A972AD1421CED9060013AB25 /* PpScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5C21CED9060013AB25 /* PpScanner.cpp */; };
+		A972AD1521CED9060013AB25 /* ParseContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5D21CED9060013AB25 /* ParseContextBase.cpp */; };
+		A972AD1621CED9060013AB25 /* ParseContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC5D21CED9060013AB25 /* ParseContextBase.cpp */; };
+		A972AD1721CED9060013AB25 /* reflection.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5E21CED9060013AB25 /* reflection.h */; };
+		A972AD1821CED9060013AB25 /* reflection.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5E21CED9060013AB25 /* reflection.h */; };
+		A972AD1921CED9060013AB25 /* Scan.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5F21CED9060013AB25 /* Scan.h */; };
+		A972AD1A21CED9060013AB25 /* Scan.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC5F21CED9060013AB25 /* Scan.h */; };
+		A972AD1B21CED9060013AB25 /* ShaderLang.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC6121CED9060013AB25 /* ShaderLang.h */; };
+		A972AD1C21CED9060013AB25 /* ShaderLang.h in Headers */ = {isa = PBXBuildFile; fileRef = A972AC6121CED9060013AB25 /* ShaderLang.h */; };
+		A972AD1D21CED9060013AB25 /* CodeGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC6321CED9060013AB25 /* CodeGen.cpp */; };
+		A972AD1E21CED9060013AB25 /* CodeGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC6321CED9060013AB25 /* CodeGen.cpp */; };
+		A972AD1F21CED9060013AB25 /* Link.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC6421CED9060013AB25 /* Link.cpp */; };
+		A972AD2021CED9060013AB25 /* Link.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A972AC6421CED9060013AB25 /* Link.cpp */; };
+		A976290F21CC60BC00B52A68 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; };
+		A976291021CC60BC00B52A68 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; };
+		A976291121CC60BC00B52A68 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290321CC60BC00B52A68 /* spirv_cross.hpp */; };
+		A976291221CC60BC00B52A68 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290321CC60BC00B52A68 /* spirv_cross.hpp */; };
+		A976291321CC60BC00B52A68 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290421CC60BC00B52A68 /* spirv_parser.cpp */; };
+		A976291421CC60BC00B52A68 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290421CC60BC00B52A68 /* spirv_parser.cpp */; };
+		A976291521CC60BC00B52A68 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290521CC60BC00B52A68 /* spirv_cross.cpp */; };
+		A976291621CC60BC00B52A68 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290521CC60BC00B52A68 /* spirv_cross.cpp */; };
+		A976291721CC60BC00B52A68 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290621CC60BC00B52A68 /* spirv_glsl.cpp */; };
+		A976291821CC60BC00B52A68 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290621CC60BC00B52A68 /* spirv_glsl.cpp */; };
+		A976291921CC60BC00B52A68 /* spirv_common.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290721CC60BC00B52A68 /* spirv_common.hpp */; };
+		A976291A21CC60BC00B52A68 /* spirv_common.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290721CC60BC00B52A68 /* spirv_common.hpp */; };
+		A976291B21CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */; };
+		A976291C21CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */; };
+		A976291D21CC60BC00B52A68 /* spirv_cfg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290921CC60BC00B52A68 /* spirv_cfg.hpp */; };
+		A976291E21CC60BC00B52A68 /* spirv_cfg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290921CC60BC00B52A68 /* spirv_cfg.hpp */; };
+		A976291F21CC60BC00B52A68 /* spirv_glsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */; };
+		A976292021CC60BC00B52A68 /* spirv_glsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */; };
+		A976292121CC60BC00B52A68 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */; };
+		A976292221CC60BC00B52A68 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */; };
+		A976292321CC60BC00B52A68 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290C21CC60BC00B52A68 /* spirv_parser.hpp */; };
+		A976292421CC60BC00B52A68 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290C21CC60BC00B52A68 /* spirv_parser.hpp */; };
+		A976292521CC60BC00B52A68 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290D21CC60BC00B52A68 /* spirv_msl.cpp */; };
+		A976292621CC60BC00B52A68 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290D21CC60BC00B52A68 /* spirv_msl.cpp */; };
+		A976292721CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
+		A976292821CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		A972A7E821CEC76A0013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A90FD8A021CC4EB900B92BB2;
+			remoteInfo = "SPIRV-Cross-macOS";
+		};
+		A972A7F021CEC8140013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A90FD75B21CC4EAB00B92BB2;
+			remoteInfo = "SPIRV-Cross-iOS";
+		};
+		A972A7F821CEC8500013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972A7E421CEC72F0013AB25;
+			remoteInfo = "ExternalLibraries-macOS";
+		};
+		A972A7FA21CEC8540013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972A7EA21CEC8030013AB25;
+			remoteInfo = "ExternalLibraries-iOS";
+		};
+		A972A82521CECD6B0013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972A7FC21CECBBF0013AB25;
+			remoteInfo = "SPIRV-Tools-iOS";
+		};
+		A972A82721CECD780013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972A81021CECBE90013AB25;
+			remoteInfo = "SPIRV-Tools-macOS";
+		};
+		A972ABF121CED8BA0013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972ABC921CED7BC0013AB25;
+			remoteInfo = "glslang-iOS";
+		};
+		A972ABF321CED8C20013AB25 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = A972ABDD21CED7CB0013AB25;
+			remoteInfo = "glslang-macOS";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		A90FD89F21CC4EAB00B92BB2 /* libSPIRVCross.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVCross.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A90FD9E421CC4EB900B92BB2 /* libSPIRVCross.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVCross.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A9679AAC21D269D900856BF7 /* package_ext_libs_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs_macos.sh; sourceTree = "<group>"; };
+		A9679AAD21D269D900856BF7 /* package_ext_libs_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs_ios.sh; sourceTree = "<group>"; };
+		A9679AAE21D269D900856BF7 /* package_ext_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs.sh; sourceTree = "<group>"; };
+		A972A80F21CECBBF0013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A972A82321CECBE90013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A972A82A21CED2720013AB25 /* spirv_target_env.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_target_env.cpp; sourceTree = "<group>"; };
+		A972A82B21CED2720013AB25 /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json"; sourceTree = "<group>"; };
+		A972A82C21CED2720013AB25 /* assembly_grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembly_grammar.h; sourceTree = "<group>"; };
+		A972A82D21CED2720013AB25 /* enum_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_set.h; sourceTree = "<group>"; };
+		A972A82E21CED2720013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972A82F21CED2720013AB25 /* extinst.spv-amd-shader-ballot.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-ballot.grammar.json"; sourceTree = "<group>"; };
+		A972A83021CED2720013AB25 /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = "<group>"; };
+		A972A83121CED2720013AB25 /* assembly_grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembly_grammar.cpp; sourceTree = "<group>"; };
+		A972A83221CED2720013AB25 /* text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text.h; sourceTree = "<group>"; };
+		A972A83321CED2720013AB25 /* extensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = extensions.cpp; sourceTree = "<group>"; };
+		A972A83421CED2720013AB25 /* pch_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source.cpp; sourceTree = "<group>"; };
+		A972A83621CED2720013AB25 /* parse_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_number.h; sourceTree = "<group>"; };
+		A972A83721CED2720013AB25 /* ilist_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist_node.h; sourceTree = "<group>"; };
+		A972A83821CED2720013AB25 /* make_unique.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = make_unique.h; sourceTree = "<group>"; };
+		A972A83921CED2720013AB25 /* string_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utils.h; sourceTree = "<group>"; };
+		A972A83A21CED2720013AB25 /* small_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = small_vector.h; sourceTree = "<group>"; };
+		A972A83B21CED2720013AB25 /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = "<group>"; };
+		A972A83C21CED2720013AB25 /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = "<group>"; };
+		A972A83D21CED2720013AB25 /* string_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_utils.cpp; sourceTree = "<group>"; };
+		A972A83E21CED2720013AB25 /* bit_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_vector.h; sourceTree = "<group>"; };
+		A972A83F21CED2720013AB25 /* bitutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitutils.h; sourceTree = "<group>"; };
+		A972A84021CED2720013AB25 /* hex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hex_float.h; sourceTree = "<group>"; };
+		A972A84121CED2720013AB25 /* parse_number.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_number.cpp; sourceTree = "<group>"; };
+		A972A84221CED2720013AB25 /* bit_vector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bit_vector.cpp; sourceTree = "<group>"; };
+		A972A84321CED2720013AB25 /* ilist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ilist.h; sourceTree = "<group>"; };
+		A972A84421CED2720013AB25 /* spirv_target_env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_target_env.h; sourceTree = "<group>"; };
+		A972A84521CED2720013AB25 /* table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cpp; sourceTree = "<group>"; };
+		A972A84621CED2720013AB25 /* id_descriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = id_descriptor.cpp; sourceTree = "<group>"; };
+		A972A84721CED2720013AB25 /* latest_version_opencl_std_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_opencl_std_header.h; sourceTree = "<group>"; };
+		A972A84821CED2720013AB25 /* spirv_optimizer_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_optimizer_options.cpp; sourceTree = "<group>"; };
+		A972A84921CED2720013AB25 /* cfa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfa.h; sourceTree = "<group>"; };
+		A972A84A21CED2720013AB25 /* pch_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source.h; sourceTree = "<group>"; };
+		A972A84B21CED2720013AB25 /* enum_string_mapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum_string_mapping.h; sourceTree = "<group>"; };
+		A972A84C21CED2720013AB25 /* spirv_validator_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_validator_options.cpp; sourceTree = "<group>"; };
+		A972A84D21CED2720013AB25 /* extinst.spv-amd-shader-trinary-minmax.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-shader-trinary-minmax.grammar.json"; sourceTree = "<group>"; };
+		A972A84E21CED2720013AB25 /* print.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = print.cpp; sourceTree = "<group>"; };
+		A972A84F21CED2720013AB25 /* spirv_definition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_definition.h; sourceTree = "<group>"; };
+		A972A85021CED2720013AB25 /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = "<group>"; };
+		A972A85121CED2720013AB25 /* spirv_endian.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_endian.cpp; sourceTree = "<group>"; };
+		A972A85221CED2720013AB25 /* macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macro.h; sourceTree = "<group>"; };
+		A972A85321CED2720013AB25 /* spirv_constant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_constant.h; sourceTree = "<group>"; };
+		A972A85421CED2720013AB25 /* extinst.spv-amd-gcn-shader.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "extinst.spv-amd-gcn-shader.grammar.json"; sourceTree = "<group>"; };
+		A972A85521CED2720013AB25 /* binary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary.cpp; sourceTree = "<group>"; };
+		A972A85621CED2720013AB25 /* spirv_validator_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_validator_options.h; sourceTree = "<group>"; };
+		A972A85821CED2720013AB25 /* markv_codec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = markv_codec.cpp; sourceTree = "<group>"; };
+		A972A85921CED2720013AB25 /* markv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = markv.cpp; sourceTree = "<group>"; };
+		A972A85A21CED2720013AB25 /* huffman_codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffman_codec.h; sourceTree = "<group>"; };
+		A972A85B21CED2720013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972A85C21CED2720013AB25 /* bit_stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_stream.h; sourceTree = "<group>"; };
+		A972A85D21CED2720013AB25 /* move_to_front.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = move_to_front.cpp; sourceTree = "<group>"; };
+		A972A85E21CED2720013AB25 /* markv_encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv_encoder.h; sourceTree = "<group>"; };
+		A972A85F21CED2720013AB25 /* markv_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv_decoder.h; sourceTree = "<group>"; };
+		A972A86021CED2720013AB25 /* markv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv.h; sourceTree = "<group>"; };
+		A972A86121CED2720013AB25 /* markv_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv_model.h; sourceTree = "<group>"; };
+		A972A86221CED2720013AB25 /* markv_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = markv_decoder.cpp; sourceTree = "<group>"; };
+		A972A86321CED2720013AB25 /* move_to_front.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = move_to_front.h; sourceTree = "<group>"; };
+		A972A86421CED2720013AB25 /* markv_codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv_codec.h; sourceTree = "<group>"; };
+		A972A86521CED2720013AB25 /* markv_logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = markv_logger.h; sourceTree = "<group>"; };
+		A972A86621CED2720013AB25 /* bit_stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bit_stream.cpp; sourceTree = "<group>"; };
+		A972A86721CED2720013AB25 /* markv_encoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = markv_encoder.cpp; sourceTree = "<group>"; };
+		A972A86821CED2720013AB25 /* enum_string_mapping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enum_string_mapping.cpp; sourceTree = "<group>"; };
+		A972A86921CED2720013AB25 /* text_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_handler.h; sourceTree = "<group>"; };
+		A972A86A21CED2720013AB25 /* parsed_operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parsed_operand.h; sourceTree = "<group>"; };
+		A972A86B21CED2720013AB25 /* name_mapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = name_mapper.h; sourceTree = "<group>"; };
+		A972A86C21CED2720013AB25 /* parsed_operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parsed_operand.cpp; sourceTree = "<group>"; };
+		A972A86D21CED2720013AB25 /* diagnostic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diagnostic.h; sourceTree = "<group>"; };
+		A972A86E21CED2720013AB25 /* spirv_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_endian.h; sourceTree = "<group>"; };
+		A972A86F21CED2720013AB25 /* name_mapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = name_mapper.cpp; sourceTree = "<group>"; };
+		A972A87021CED2720013AB25 /* extinst.debuginfo.grammar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = extinst.debuginfo.grammar.json; sourceTree = "<group>"; };
+		A972A87221CED2720013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972A87321CED2720013AB25 /* linker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linker.cpp; sourceTree = "<group>"; };
+		A972A87421CED2720013AB25 /* software_version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = software_version.cpp; sourceTree = "<group>"; };
+		A972A87521CED2720013AB25 /* opcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode.cpp; sourceTree = "<group>"; };
+		A972A87621CED2720013AB25 /* print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print.h; sourceTree = "<group>"; };
+		A972A87721CED2720013AB25 /* ext_inst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ext_inst.cpp; sourceTree = "<group>"; };
+		A972A87821CED2720013AB25 /* disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassemble.h; sourceTree = "<group>"; };
+		A972A87A21CED2720013AB25 /* optimizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optimizer.cpp; sourceTree = "<group>"; };
+		A972A87B21CED2720013AB25 /* if_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = if_conversion.h; sourceTree = "<group>"; };
+		A972A87C21CED2720013AB25 /* register_pressure.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = register_pressure.cpp; sourceTree = "<group>"; };
+		A972A87D21CED2720013AB25 /* loop_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_utils.cpp; sourceTree = "<group>"; };
+		A972A87E21CED2720013AB25 /* merge_return_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_return_pass.h; sourceTree = "<group>"; };
+		A972A87F21CED2720013AB25 /* inline_opaque_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_opaque_pass.h; sourceTree = "<group>"; };
+		A972A88021CED2720013AB25 /* loop_fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion.h; sourceTree = "<group>"; };
+		A972A88121CED2720013AB25 /* combine_access_chains.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = combine_access_chains.cpp; sourceTree = "<group>"; };
+		A972A88221CED2720013AB25 /* build_module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = build_module.cpp; sourceTree = "<group>"; };
+		A972A88321CED2720013AB25 /* composite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = composite.h; sourceTree = "<group>"; };
+		A972A88421CED2720013AB25 /* compact_ids_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compact_ids_pass.h; sourceTree = "<group>"; };
+		A972A88521CED2720013AB25 /* register_pressure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = register_pressure.h; sourceTree = "<group>"; };
+		A972A88621CED2720013AB25 /* tree_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tree_iterator.h; sourceTree = "<group>"; };
+		A972A88721CED2720013AB25 /* local_single_store_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_store_elim_pass.h; sourceTree = "<group>"; };
+		A972A88821CED2720013AB25 /* reduce_load_size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_load_size.h; sourceTree = "<group>"; };
+		A972A88921CED2720013AB25 /* types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = types.cpp; sourceTree = "<group>"; };
+		A972A88A21CED2720013AB25 /* scalar_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis.h; sourceTree = "<group>"; };
+		A972A88B21CED2720013AB25 /* strip_debug_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_debug_info_pass.h; sourceTree = "<group>"; };
+		A972A88C21CED2720013AB25 /* cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg.cpp; sourceTree = "<group>"; };
+		A972A88D21CED2720013AB25 /* decoration_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decoration_manager.cpp; sourceTree = "<group>"; };
+		A972A88E21CED2720013AB25 /* local_single_block_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_block_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A88F21CED2720013AB25 /* freeze_spec_constant_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = freeze_spec_constant_value_pass.cpp; sourceTree = "<group>"; };
+		A972A89021CED2720013AB25 /* replace_invalid_opc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = replace_invalid_opc.h; sourceTree = "<group>"; };
+		A972A89121CED2720013AB25 /* local_access_chain_convert_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_access_chain_convert_pass.h; sourceTree = "<group>"; };
+		A972A89221CED2720013AB25 /* inst_bindless_check_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inst_bindless_check_pass.cpp; sourceTree = "<group>"; };
+		A972A89321CED2720013AB25 /* local_redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_redundancy_elimination.cpp; sourceTree = "<group>"; };
+		A972A89421CED2720013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972A89521CED2720013AB25 /* instrument_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instrument_pass.cpp; sourceTree = "<group>"; };
+		A972A89621CED2720013AB25 /* propagator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagator.h; sourceTree = "<group>"; };
+		A972A89721CED2720013AB25 /* instruction_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction_list.h; sourceTree = "<group>"; };
+		A972A89821CED2720013AB25 /* feature_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_manager.cpp; sourceTree = "<group>"; };
+		A972A89921CED2720013AB25 /* pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass.cpp; sourceTree = "<group>"; };
+		A972A89A21CED2720013AB25 /* loop_fission.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fission.cpp; sourceTree = "<group>"; };
+		A972A89B21CED2720013AB25 /* dominator_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_tree.cpp; sourceTree = "<group>"; };
+		A972A89C21CED2720013AB25 /* merge_return_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = merge_return_pass.cpp; sourceTree = "<group>"; };
+		A972A89D21CED2720013AB25 /* ir_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_context.h; sourceTree = "<group>"; };
+		A972A89E21CED2720013AB25 /* eliminate_dead_constant_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_constant_pass.cpp; sourceTree = "<group>"; };
+		A972A89F21CED2720013AB25 /* cfg_cleanup_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfg_cleanup_pass.cpp; sourceTree = "<group>"; };
+		A972A8A021CED2720013AB25 /* const_folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = const_folding_rules.cpp; sourceTree = "<group>"; };
+		A972A8A121CED2720013AB25 /* loop_unroller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unroller.h; sourceTree = "<group>"; };
+		A972A8A221CED2720013AB25 /* strip_debug_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_debug_info_pass.cpp; sourceTree = "<group>"; };
+		A972A8A321CED2720013AB25 /* ssa_rewrite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ssa_rewrite_pass.cpp; sourceTree = "<group>"; };
+		A972A8A421CED2720013AB25 /* loop_dependence.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence.cpp; sourceTree = "<group>"; };
+		A972A8A521CED2720013AB25 /* unify_const_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unify_const_pass.h; sourceTree = "<group>"; };
+		A972A8A621CED2720013AB25 /* ir_loader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_loader.h; sourceTree = "<group>"; };
+		A972A8A721CED2720013AB25 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = "<group>"; };
+		A972A8A821CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold_spec_constant_op_and_composite_pass.h; sourceTree = "<group>"; };
+		A972A8A921CED2720013AB25 /* mem_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mem_pass.cpp; sourceTree = "<group>"; };
+		A972A8AA21CED2720013AB25 /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
+		A972A8AB21CED2720013AB25 /* remove_duplicates_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remove_duplicates_pass.cpp; sourceTree = "<group>"; };
+		A972A8AC21CED2720013AB25 /* dead_variable_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_variable_elimination.cpp; sourceTree = "<group>"; };
+		A972A8AD21CED2720013AB25 /* block_merge_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_merge_pass.h; sourceTree = "<group>"; };
+		A972A8AE21CED2720013AB25 /* module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = module.cpp; sourceTree = "<group>"; };
+		A972A8AF21CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold_spec_constant_op_and_composite_pass.cpp; sourceTree = "<group>"; };
+		A972A8B021CED2720013AB25 /* loop_unswitch_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unswitch_pass.cpp; sourceTree = "<group>"; };
+		A972A8B121CED2720013AB25 /* unify_const_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unify_const_pass.cpp; sourceTree = "<group>"; };
+		A972A8B221CED2720013AB25 /* type_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = type_manager.cpp; sourceTree = "<group>"; };
+		A972A8B321CED2720013AB25 /* private_to_local_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = private_to_local_pass.h; sourceTree = "<group>"; };
+		A972A8B421CED2720013AB25 /* inline_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_pass.cpp; sourceTree = "<group>"; };
+		A972A8B521CED2720013AB25 /* def_use_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = def_use_manager.h; sourceTree = "<group>"; };
+		A972A8B621CED2720013AB25 /* ir_loader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_loader.cpp; sourceTree = "<group>"; };
+		A972A8B721CED2720013AB25 /* cfg_cleanup_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg_cleanup_pass.h; sourceTree = "<group>"; };
+		A972A8B821CED2720013AB25 /* licm_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = licm_pass.cpp; sourceTree = "<group>"; };
+		A972A8B921CED2720013AB25 /* eliminate_dead_functions_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eliminate_dead_functions_pass.cpp; sourceTree = "<group>"; };
+		A972A8BA21CED2720013AB25 /* local_redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_redundancy_elimination.h; sourceTree = "<group>"; };
+		A972A8BB21CED2720013AB25 /* loop_peeling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_peeling.h; sourceTree = "<group>"; };
+		A972A8BC21CED2720013AB25 /* vector_dce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vector_dce.cpp; sourceTree = "<group>"; };
+		A972A8BD21CED2720013AB25 /* loop_unroller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_unroller.cpp; sourceTree = "<group>"; };
+		A972A8BE21CED2720013AB25 /* constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = constants.cpp; sourceTree = "<group>"; };
+		A972A8BF21CED2720013AB25 /* loop_fusion_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fusion_pass.h; sourceTree = "<group>"; };
+		A972A8C021CED2720013AB25 /* struct_cfg_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = struct_cfg_analysis.h; sourceTree = "<group>"; };
+		A972A8C121CED2720013AB25 /* common_uniform_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = common_uniform_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8C221CED2720013AB25 /* def_use_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = def_use_manager.cpp; sourceTree = "<group>"; };
+		A972A8C321CED2720013AB25 /* strip_reflect_info_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strip_reflect_info_pass.cpp; sourceTree = "<group>"; };
+		A972A8C421CED2720013AB25 /* decoration_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration_manager.h; sourceTree = "<group>"; };
+		A972A8C521CED2720013AB25 /* ccp_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ccp_pass.cpp; sourceTree = "<group>"; };
+		A972A8C621CED2720013AB25 /* local_single_block_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_single_block_elim_pass.h; sourceTree = "<group>"; };
+		A972A8C721CED2720013AB25 /* pch_source_opt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch_source_opt.cpp; sourceTree = "<group>"; };
+		A972A8C821CED2720013AB25 /* strength_reduction_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strength_reduction_pass.h; sourceTree = "<group>"; };
+		A972A8C921CED2720013AB25 /* aggressive_dead_code_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aggressive_dead_code_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8CA21CED2720013AB25 /* simplification_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplification_pass.cpp; sourceTree = "<group>"; };
+		A972A8CB21CED2720013AB25 /* dead_branch_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_branch_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8CC21CED2720013AB25 /* flatten_decoration_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flatten_decoration_pass.cpp; sourceTree = "<group>"; };
+		A972A8CD21CED2720013AB25 /* dead_insert_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_insert_elim_pass.h; sourceTree = "<group>"; };
+		A972A8CE21CED2720013AB25 /* folding_rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = folding_rules.cpp; sourceTree = "<group>"; };
+		A972A8CF21CED2720013AB25 /* freeze_spec_constant_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freeze_spec_constant_value_pass.h; sourceTree = "<group>"; };
+		A972A8D021CED2720013AB25 /* ir_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ir_context.cpp; sourceTree = "<group>"; };
+		A972A8D121CED2720013AB25 /* instrument_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrument_pass.h; sourceTree = "<group>"; };
+		A972A8D221CED2720013AB25 /* mem_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_pass.h; sourceTree = "<group>"; };
+		A972A8D321CED2720013AB25 /* loop_descriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_descriptor.cpp; sourceTree = "<group>"; };
+		A972A8D421CED2720013AB25 /* local_ssa_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_ssa_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8D521CED2720013AB25 /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
+		A972A8D621CED2720013AB25 /* instruction_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction_list.cpp; sourceTree = "<group>"; };
+		A972A8D721CED2720013AB25 /* composite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = composite.cpp; sourceTree = "<group>"; };
+		A972A8D821CED2720013AB25 /* inline_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_pass.h; sourceTree = "<group>"; };
+		A972A8D921CED2720013AB25 /* loop_dependence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_dependence.h; sourceTree = "<group>"; };
+		A972A8DA21CED2720013AB25 /* value_number_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = value_number_table.h; sourceTree = "<group>"; };
+		A972A8DB21CED2720013AB25 /* flatten_decoration_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flatten_decoration_pass.h; sourceTree = "<group>"; };
+		A972A8DC21CED2720013AB25 /* if_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = if_conversion.cpp; sourceTree = "<group>"; };
+		A972A8DD21CED2720013AB25 /* inline_exhaustive_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_exhaustive_pass.h; sourceTree = "<group>"; };
+		A972A8DE21CED2720013AB25 /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = "<group>"; };
+		A972A8DF21CED2720013AB25 /* strength_reduction_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strength_reduction_pass.cpp; sourceTree = "<group>"; };
+		A972A8E021CED2720013AB25 /* copy_prop_arrays.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copy_prop_arrays.cpp; sourceTree = "<group>"; };
+		A972A8E121CED2720013AB25 /* pass_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pass_manager.cpp; sourceTree = "<group>"; };
+		A972A8E221CED2720013AB25 /* inline_exhaustive_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_exhaustive_pass.cpp; sourceTree = "<group>"; };
+		A972A8E321CED2720013AB25 /* loop_fission.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_fission.h; sourceTree = "<group>"; };
+		A972A8E421CED2720013AB25 /* workaround1209.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = workaround1209.h; sourceTree = "<group>"; };
+		A972A8E521CED2720013AB25 /* loop_fusion_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion_pass.cpp; sourceTree = "<group>"; };
+		A972A8E621CED2720013AB25 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
+		A972A8E721CED2720013AB25 /* copy_prop_arrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_prop_arrays.h; sourceTree = "<group>"; };
+		A972A8E821CED2720013AB25 /* eliminate_dead_constant_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_constant_pass.h; sourceTree = "<group>"; };
+		A972A8E921CED2720013AB25 /* dead_insert_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dead_insert_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8EA21CED2720013AB25 /* ssa_rewrite_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssa_rewrite_pass.h; sourceTree = "<group>"; };
+		A972A8EB21CED2720013AB25 /* scalar_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis.cpp; sourceTree = "<group>"; };
+		A972A8EC21CED2720013AB25 /* dead_variable_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_variable_elimination.h; sourceTree = "<group>"; };
+		A972A8ED21CED2720013AB25 /* block_merge_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_merge_pass.cpp; sourceTree = "<group>"; };
+		A972A8EE21CED2720013AB25 /* dominator_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_analysis.h; sourceTree = "<group>"; };
+		A972A8EF21CED2720013AB25 /* pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass.h; sourceTree = "<group>"; };
+		A972A8F021CED2720013AB25 /* folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = folding_rules.h; sourceTree = "<group>"; };
+		A972A8F121CED2720013AB25 /* eliminate_dead_functions_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_dead_functions_pass.h; sourceTree = "<group>"; };
+		A972A8F221CED2720013AB25 /* common_uniform_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_uniform_elim_pass.h; sourceTree = "<group>"; };
+		A972A8F321CED2720013AB25 /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = "<group>"; };
+		A972A8F421CED2720013AB25 /* local_single_store_elim_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_single_store_elim_pass.cpp; sourceTree = "<group>"; };
+		A972A8F521CED2720013AB25 /* dead_branch_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_branch_elim_pass.h; sourceTree = "<group>"; };
+		A972A8F621CED2720013AB25 /* private_to_local_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = private_to_local_pass.cpp; sourceTree = "<group>"; };
+		A972A8F721CED2720013AB25 /* scalar_analysis_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_analysis_nodes.h; sourceTree = "<group>"; };
+		A972A8F821CED2720013AB25 /* propagator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = propagator.cpp; sourceTree = "<group>"; };
+		A972A8F921CED2720013AB25 /* loop_dependence_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_dependence_helpers.cpp; sourceTree = "<group>"; };
+		A972A8FA21CED2720013AB25 /* set_spec_constant_default_value_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = set_spec_constant_default_value_pass.cpp; sourceTree = "<group>"; };
+		A972A8FB21CED2720013AB25 /* passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = passes.h; sourceTree = "<group>"; };
+		A972A8FC21CED2720013AB25 /* fold.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fold.cpp; sourceTree = "<group>"; };
+		A972A8FD21CED2720013AB25 /* strip_reflect_info_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_reflect_info_pass.h; sourceTree = "<group>"; };
+		A972A8FE21CED2720013AB25 /* scalar_replacement_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_replacement_pass.cpp; sourceTree = "<group>"; };
+		A972A8FF21CED2720013AB25 /* simplification_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplification_pass.h; sourceTree = "<group>"; };
+		A972A90021CED2720013AB25 /* remove_duplicates_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_duplicates_pass.h; sourceTree = "<group>"; };
+		A972A90121CED2720013AB25 /* redundancy_elimination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = redundancy_elimination.cpp; sourceTree = "<group>"; };
+		A972A90221CED2720013AB25 /* reflect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reflect.h; sourceTree = "<group>"; };
+		A972A90321CED2720013AB25 /* workaround1209.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = workaround1209.cpp; sourceTree = "<group>"; };
+		A972A90421CED2720013AB25 /* null_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = null_pass.h; sourceTree = "<group>"; };
+		A972A90521CED2720013AB25 /* const_folding_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = const_folding_rules.h; sourceTree = "<group>"; };
+		A972A90621CED2720013AB25 /* scalar_replacement_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_replacement_pass.h; sourceTree = "<group>"; };
+		A972A90721CED2720013AB25 /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
+		A972A90821CED2720013AB25 /* pch_source_opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch_source_opt.h; sourceTree = "<group>"; };
+		A972A90921CED2720013AB25 /* reduce_load_size.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reduce_load_size.cpp; sourceTree = "<group>"; };
+		A972A90A21CED2720013AB25 /* redundancy_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redundancy_elimination.h; sourceTree = "<group>"; };
+		A972A90B21CED2720013AB25 /* value_number_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = value_number_table.cpp; sourceTree = "<group>"; };
+		A972A90C21CED2720013AB25 /* local_ssa_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_ssa_elim_pass.h; sourceTree = "<group>"; };
+		A972A90D21CED2720013AB25 /* inline_opaque_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inline_opaque_pass.cpp; sourceTree = "<group>"; };
+		A972A90E21CED2720013AB25 /* replace_invalid_opc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = replace_invalid_opc.cpp; sourceTree = "<group>"; };
+		A972A90F21CED2720013AB25 /* loop_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_utils.h; sourceTree = "<group>"; };
+		A972A91021CED2720013AB25 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = "<group>"; };
+		A972A91121CED2720013AB25 /* dominator_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dominator_analysis.cpp; sourceTree = "<group>"; };
+		A972A91221CED2720013AB25 /* ir_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_builder.h; sourceTree = "<group>"; };
+		A972A91321CED2720013AB25 /* loop_unswitch_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unswitch_pass.h; sourceTree = "<group>"; };
+		A972A91421CED2720013AB25 /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfg.h; sourceTree = "<group>"; };
+		A972A91521CED2720013AB25 /* loop_descriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_descriptor.h; sourceTree = "<group>"; };
+		A972A91621CED2730013AB25 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A972A91721CED2730013AB25 /* aggressive_dead_code_elim_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aggressive_dead_code_elim_pass.h; sourceTree = "<group>"; };
+		A972A91821CED2730013AB25 /* struct_cfg_analysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = struct_cfg_analysis.cpp; sourceTree = "<group>"; };
+		A972A91921CED2730013AB25 /* vector_dce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_dce.h; sourceTree = "<group>"; };
+		A972A91A21CED2730013AB25 /* combine_access_chains.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = combine_access_chains.h; sourceTree = "<group>"; };
+		A972A91B21CED2730013AB25 /* pass_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass_manager.h; sourceTree = "<group>"; };
+		A972A91C21CED2730013AB25 /* local_access_chain_convert_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_access_chain_convert_pass.cpp; sourceTree = "<group>"; };
+		A972A91D21CED2730013AB25 /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
+		A972A91E21CED2730013AB25 /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = "<group>"; };
+		A972A91F21CED2730013AB25 /* licm_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = licm_pass.h; sourceTree = "<group>"; };
+		A972A92021CED2730013AB25 /* build_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build_module.h; sourceTree = "<group>"; };
+		A972A92121CED2730013AB25 /* ccp_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccp_pass.h; sourceTree = "<group>"; };
+		A972A92221CED2730013AB25 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
+		A972A92321CED2730013AB25 /* loop_fusion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_fusion.cpp; sourceTree = "<group>"; };
+		A972A92421CED2730013AB25 /* feature_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = feature_manager.h; sourceTree = "<group>"; };
+		A972A92521CED2730013AB25 /* inst_bindless_check_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inst_bindless_check_pass.h; sourceTree = "<group>"; };
+		A972A92621CED2730013AB25 /* scalar_analysis_simplification.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scalar_analysis_simplification.cpp; sourceTree = "<group>"; };
+		A972A92721CED2730013AB25 /* set_spec_constant_default_value_pass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = set_spec_constant_default_value_pass.h; sourceTree = "<group>"; };
+		A972A92821CED2730013AB25 /* dominator_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dominator_tree.h; sourceTree = "<group>"; };
+		A972A92921CED2730013AB25 /* type_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_manager.h; sourceTree = "<group>"; };
+		A972A92A21CED2730013AB25 /* compact_ids_pass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compact_ids_pass.cpp; sourceTree = "<group>"; };
+		A972A92B21CED2730013AB25 /* loop_peeling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop_peeling.cpp; sourceTree = "<group>"; };
+		A972A92C21CED2730013AB25 /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = "<group>"; };
+		A972A92D21CED2730013AB25 /* ext_inst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ext_inst.h; sourceTree = "<group>"; };
+		A972A92E21CED2730013AB25 /* diagnostic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = diagnostic.cpp; sourceTree = "<group>"; };
+		A972A92F21CED2730013AB25 /* latest_version_spirv_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_spirv_header.h; sourceTree = "<group>"; };
+		A972A93021CED2730013AB25 /* libspirv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libspirv.cpp; sourceTree = "<group>"; };
+		A972A93121CED2730013AB25 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A972A93221CED2730013AB25 /* id_descriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = id_descriptor.h; sourceTree = "<group>"; };
+		A972A93321CED2730013AB25 /* spirv_optimizer_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spirv_optimizer_options.h; sourceTree = "<group>"; };
+		A972A93421CED2730013AB25 /* opcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opcode.h; sourceTree = "<group>"; };
+		A972A93521CED2730013AB25 /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = "<group>"; };
+		A972A93621CED2730013AB25 /* latest_version_glsl_std_450_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latest_version_glsl_std_450_header.h; sourceTree = "<group>"; };
+		A972A93721CED2730013AB25 /* extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extensions.h; sourceTree = "<group>"; };
+		A972A93821CED2730013AB25 /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = "<group>"; };
+		A972A93921CED2730013AB25 /* binary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binary.h; sourceTree = "<group>"; };
+		A972A93A21CED2730013AB25 /* text_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_handler.cpp; sourceTree = "<group>"; };
+		A972A93C21CED2730013AB25 /* validate_annotation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_annotation.cpp; sourceTree = "<group>"; };
+		A972A93D21CED2730013AB25 /* validate_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_cfg.cpp; sourceTree = "<group>"; };
+		A972A93E21CED2730013AB25 /* validate_capability.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_capability.cpp; sourceTree = "<group>"; };
+		A972A93F21CED2730013AB25 /* construct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = construct.h; sourceTree = "<group>"; };
+		A972A94021CED2730013AB25 /* validate_barriers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_barriers.cpp; sourceTree = "<group>"; };
+		A972A94121CED2730013AB25 /* validate_non_uniform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_non_uniform.cpp; sourceTree = "<group>"; };
+		A972A94221CED2730013AB25 /* validate_atomics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_atomics.cpp; sourceTree = "<group>"; };
+		A972A94321CED2730013AB25 /* basic_block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_block.h; sourceTree = "<group>"; };
+		A972A94421CED2730013AB25 /* validate_instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_instruction.cpp; sourceTree = "<group>"; };
+		A972A94521CED2730013AB25 /* validate_decorations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_decorations.cpp; sourceTree = "<group>"; };
+		A972A94621CED2730013AB25 /* validate_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_debug.cpp; sourceTree = "<group>"; };
+		A972A94721CED2730013AB25 /* validate_builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_builtins.cpp; sourceTree = "<group>"; };
+		A972A94821CED2730013AB25 /* validate_interfaces.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_interfaces.cpp; sourceTree = "<group>"; };
+		A972A94921CED2730013AB25 /* validate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate.cpp; sourceTree = "<group>"; };
+		A972A94A21CED2730013AB25 /* validation_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validation_state.h; sourceTree = "<group>"; };
+		A972A94B21CED2730013AB25 /* validate_constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_constants.cpp; sourceTree = "<group>"; };
+		A972A94C21CED2730013AB25 /* validate_bitwise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_bitwise.cpp; sourceTree = "<group>"; };
+		A972A94D21CED2730013AB25 /* construct.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = construct.cpp; sourceTree = "<group>"; };
+		A972A94E21CED2730013AB25 /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = "<group>"; };
+		A972A94F21CED2730013AB25 /* validate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = validate.h; sourceTree = "<group>"; };
+		A972A95021CED2730013AB25 /* validate_adjacency.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_adjacency.cpp; sourceTree = "<group>"; };
+		A972A95121CED2730013AB25 /* validate_conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_conversion.cpp; sourceTree = "<group>"; };
+		A972A95221CED2730013AB25 /* validate_datarules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_datarules.cpp; sourceTree = "<group>"; };
+		A972A95321CED2730013AB25 /* validate_id.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_id.cpp; sourceTree = "<group>"; };
+		A972A95421CED2730013AB25 /* validate_arithmetics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_arithmetics.cpp; sourceTree = "<group>"; };
+		A972A95521CED2730013AB25 /* validate_mode_setting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_mode_setting.cpp; sourceTree = "<group>"; };
+		A972A95621CED2730013AB25 /* validate_logicals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_logicals.cpp; sourceTree = "<group>"; };
+		A972A95721CED2730013AB25 /* validate_derivatives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_derivatives.cpp; sourceTree = "<group>"; };
+		A972A95821CED2730013AB25 /* validate_memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_memory.cpp; sourceTree = "<group>"; };
+		A972A95921CED2730013AB25 /* validate_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_image.cpp; sourceTree = "<group>"; };
+		A972A95A21CED2730013AB25 /* validate_literals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_literals.cpp; sourceTree = "<group>"; };
+		A972A95B21CED2730013AB25 /* instruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = instruction.cpp; sourceTree = "<group>"; };
+		A972A95C21CED2730013AB25 /* validate_type.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_type.cpp; sourceTree = "<group>"; };
+		A972A95D21CED2730013AB25 /* validate_ext_inst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_ext_inst.cpp; sourceTree = "<group>"; };
+		A972A95E21CED2730013AB25 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = "<group>"; };
+		A972A95F21CED2730013AB25 /* validate_execution_limitations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_execution_limitations.cpp; sourceTree = "<group>"; };
+		A972A96021CED2730013AB25 /* validate_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_layout.cpp; sourceTree = "<group>"; };
+		A972A96121CED2730013AB25 /* basic_block.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic_block.cpp; sourceTree = "<group>"; };
+		A972A96221CED2730013AB25 /* validate_function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_function.cpp; sourceTree = "<group>"; };
+		A972A96321CED2730013AB25 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = "<group>"; };
+		A972A96421CED2730013AB25 /* validate_composites.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_composites.cpp; sourceTree = "<group>"; };
+		A972A96521CED2730013AB25 /* validation_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validation_state.cpp; sourceTree = "<group>"; };
+		A972A96621CED2730013AB25 /* validate_primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_primitives.cpp; sourceTree = "<group>"; };
+		A972A96721CED2730013AB25 /* decoration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration.h; sourceTree = "<group>"; };
+		A972ABDC21CED7BC0013AB25 /* libglslang.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libglslang.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A972ABF021CED7CB0013AB25 /* libglslang.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libglslang.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A972ABF621CED9060013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972ABF721CED9060013AB25 /* InitializeDll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitializeDll.h; sourceTree = "<group>"; };
+		A972ABF821CED9060013AB25 /* InitializeDll.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InitializeDll.cpp; sourceTree = "<group>"; };
+		A972ABFA21CED9060013AB25 /* SPVRemapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPVRemapper.h; sourceTree = "<group>"; };
+		A972ABFB21CED9060013AB25 /* SpvBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpvBuilder.h; sourceTree = "<group>"; };
+		A972ABFC21CED9060013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972ABFD21CED9060013AB25 /* SpvPostProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvPostProcess.cpp; sourceTree = "<group>"; };
+		A972ABFE21CED9060013AB25 /* SpvTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpvTools.h; sourceTree = "<group>"; };
+		A972ABFF21CED9060013AB25 /* SpvTools.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvTools.cpp; sourceTree = "<group>"; };
+		A972AC0021CED9060013AB25 /* InReadableOrder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InReadableOrder.cpp; sourceTree = "<group>"; };
+		A972AC0121CED9060013AB25 /* GLSL.ext.AMD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.AMD.h; sourceTree = "<group>"; };
+		A972AC0221CED9060013AB25 /* doc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = doc.h; sourceTree = "<group>"; };
+		A972AC0321CED9060013AB25 /* spirv.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv.hpp; sourceTree = "<group>"; };
+		A972AC0421CED9060013AB25 /* SpvBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvBuilder.cpp; sourceTree = "<group>"; };
+		A972AC0521CED9060013AB25 /* GLSL.ext.EXT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.EXT.h; sourceTree = "<group>"; };
+		A972AC0621CED9060013AB25 /* GLSL.ext.KHR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.KHR.h; sourceTree = "<group>"; };
+		A972AC0721CED9060013AB25 /* GLSL.ext.NV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.NV.h; sourceTree = "<group>"; };
+		A972AC0821CED9060013AB25 /* GlslangToSpv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlslangToSpv.cpp; sourceTree = "<group>"; };
+		A972AC0921CED9060013AB25 /* spvIR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spvIR.h; sourceTree = "<group>"; };
+		A972AC0A21CED9060013AB25 /* bitutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitutils.h; sourceTree = "<group>"; };
+		A972AC0B21CED9060013AB25 /* disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassemble.h; sourceTree = "<group>"; };
+		A972AC0C21CED9060013AB25 /* GlslangToSpv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlslangToSpv.h; sourceTree = "<group>"; };
+		A972AC0D21CED9060013AB25 /* GLSL.std.450.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.std.450.h; sourceTree = "<group>"; };
+		A972AC0E21CED9060013AB25 /* SPVRemapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SPVRemapper.cpp; sourceTree = "<group>"; };
+		A972AC0F21CED9060013AB25 /* Logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Logger.cpp; sourceTree = "<group>"; };
+		A972AC1021CED9060013AB25 /* hex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hex_float.h; sourceTree = "<group>"; };
+		A972AC1121CED9060013AB25 /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logger.h; sourceTree = "<group>"; };
+		A972AC1221CED9060013AB25 /* doc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = doc.cpp; sourceTree = "<group>"; };
+		A972AC1321CED9060013AB25 /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = "<group>"; };
+		A972AC1521CED9060013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972AC1821CED9060013AB25 /* ossource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ossource.cpp; sourceTree = "<group>"; };
+		A972AC1921CED9060013AB25 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		A972AC1A21CED9060013AB25 /* osinclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = osinclude.h; sourceTree = "<group>"; };
+		A972AC2021CED9060013AB25 /* ResourceLimits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLimits.h; sourceTree = "<group>"; };
+		A972AC2121CED9060013AB25 /* Types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Types.h; sourceTree = "<group>"; };
+		A972AC2221CED9060013AB25 /* intermediate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intermediate.h; sourceTree = "<group>"; };
+		A972AC2321CED9060013AB25 /* BaseTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTypes.h; sourceTree = "<group>"; };
+		A972AC2421CED9060013AB25 /* revision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = revision.h; sourceTree = "<group>"; };
+		A972AC2521CED9060013AB25 /* InitializeGlobals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitializeGlobals.h; sourceTree = "<group>"; };
+		A972AC2621CED9060013AB25 /* ShHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShHandle.h; sourceTree = "<group>"; };
+		A972AC2721CED9060013AB25 /* arrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arrays.h; sourceTree = "<group>"; };
+		A972AC2821CED9060013AB25 /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = "<group>"; };
+		A972AC2921CED9060013AB25 /* revision.template */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = revision.template; sourceTree = "<group>"; };
+		A972AC2A21CED9060013AB25 /* ConstantUnion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConstantUnion.h; sourceTree = "<group>"; };
+		A972AC2B21CED9060013AB25 /* InfoSink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfoSink.h; sourceTree = "<group>"; };
+		A972AC2C21CED9060013AB25 /* PoolAlloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PoolAlloc.h; sourceTree = "<group>"; };
+		A972AC2D21CED9060013AB25 /* updateGrammar */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = updateGrammar; sourceTree = "<group>"; };
+		A972AC2F21CED9060013AB25 /* ParseHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseHelper.cpp; sourceTree = "<group>"; };
+		A972AC3021CED9060013AB25 /* parseVersions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parseVersions.h; sourceTree = "<group>"; };
+		A972AC3121CED9060013AB25 /* gl_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gl_types.h; sourceTree = "<group>"; };
+		A972AC3221CED9060013AB25 /* propagateNoContraction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = propagateNoContraction.cpp; sourceTree = "<group>"; };
+		A972AC3321CED9060013AB25 /* pch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch.h; sourceTree = "<group>"; };
+		A972AC3421CED9060013AB25 /* ScanContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanContext.h; sourceTree = "<group>"; };
+		A972AC3521CED9060013AB25 /* iomapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iomapper.h; sourceTree = "<group>"; };
+		A972AC3621CED9060013AB25 /* localintermediate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = localintermediate.h; sourceTree = "<group>"; };
+		A972AC3721CED9060013AB25 /* Scan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Scan.cpp; sourceTree = "<group>"; };
+		A972AC3921CED9060013AB25 /* RemoveTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveTree.h; sourceTree = "<group>"; };
+		A972AC3A21CED9060013AB25 /* Initialize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Initialize.cpp; sourceTree = "<group>"; };
+		A972AC3B21CED9060013AB25 /* glslang_tab.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glslang_tab.cpp; sourceTree = "<group>"; };
+		A972AC3C21CED9060013AB25 /* limits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limits.cpp; sourceTree = "<group>"; };
+		A972AC3D21CED9060013AB25 /* parseConst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parseConst.cpp; sourceTree = "<group>"; };
+		A972AC3E21CED9060013AB25 /* propagateNoContraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagateNoContraction.h; sourceTree = "<group>"; };
+		A972AC3F21CED9060013AB25 /* Versions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Versions.h; sourceTree = "<group>"; };
+		A972AC4021CED9060013AB25 /* IntermTraverse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntermTraverse.cpp; sourceTree = "<group>"; };
+		A972AC4121CED9060013AB25 /* intermOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = intermOut.cpp; sourceTree = "<group>"; };
+		A972AC4221CED9060013AB25 /* iomapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iomapper.cpp; sourceTree = "<group>"; };
+		A972AC4321CED9060013AB25 /* PoolAlloc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PoolAlloc.cpp; sourceTree = "<group>"; };
+		A972AC4421CED9060013AB25 /* ShaderLang.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShaderLang.cpp; sourceTree = "<group>"; };
+		A972AC4521CED9060013AB25 /* SymbolTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolTable.h; sourceTree = "<group>"; };
+		A972AC4621CED9060013AB25 /* InfoSink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InfoSink.cpp; sourceTree = "<group>"; };
+		A972AC4721CED9060013AB25 /* Intermediate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Intermediate.cpp; sourceTree = "<group>"; };
+		A972AC4821CED9060013AB25 /* pch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pch.cpp; sourceTree = "<group>"; };
+		A972AC4921CED9060013AB25 /* SymbolTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SymbolTable.cpp; sourceTree = "<group>"; };
+		A972AC4A21CED9060013AB25 /* glslang_tab.cpp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glslang_tab.cpp.h; sourceTree = "<group>"; };
+		A972AC4B21CED9060013AB25 /* LiveTraverser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveTraverser.h; sourceTree = "<group>"; };
+		A972AC4C21CED9060013AB25 /* Initialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Initialize.h; sourceTree = "<group>"; };
+		A972AC4D21CED9060013AB25 /* attribute.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = attribute.cpp; sourceTree = "<group>"; };
+		A972AC4E21CED9060013AB25 /* reflection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reflection.cpp; sourceTree = "<group>"; };
+		A972AC4F21CED9060013AB25 /* RemoveTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoveTree.cpp; sourceTree = "<group>"; };
+		A972AC5021CED9060013AB25 /* attribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attribute.h; sourceTree = "<group>"; };
+		A972AC5121CED9060013AB25 /* Versions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Versions.cpp; sourceTree = "<group>"; };
+		A972AC5221CED9060013AB25 /* Constant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Constant.cpp; sourceTree = "<group>"; };
+		A972AC5321CED9060013AB25 /* linkValidate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linkValidate.cpp; sourceTree = "<group>"; };
+		A972AC5421CED9060013AB25 /* ParseHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseHelper.h; sourceTree = "<group>"; };
+		A972AC5621CED9060013AB25 /* PpAtom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpAtom.cpp; sourceTree = "<group>"; };
+		A972AC5721CED9060013AB25 /* PpTokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpTokens.h; sourceTree = "<group>"; };
+		A972AC5821CED9060013AB25 /* Pp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Pp.cpp; sourceTree = "<group>"; };
+		A972AC5921CED9060013AB25 /* PpContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpContext.h; sourceTree = "<group>"; };
+		A972AC5A21CED9060013AB25 /* PpTokens.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpTokens.cpp; sourceTree = "<group>"; };
+		A972AC5B21CED9060013AB25 /* PpContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpContext.cpp; sourceTree = "<group>"; };
+		A972AC5C21CED9060013AB25 /* PpScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpScanner.cpp; sourceTree = "<group>"; };
+		A972AC5D21CED9060013AB25 /* ParseContextBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseContextBase.cpp; sourceTree = "<group>"; };
+		A972AC5E21CED9060013AB25 /* reflection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reflection.h; sourceTree = "<group>"; };
+		A972AC5F21CED9060013AB25 /* Scan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scan.h; sourceTree = "<group>"; };
+		A972AC6121CED9060013AB25 /* ShaderLang.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShaderLang.h; sourceTree = "<group>"; };
+		A972AC6321CED9060013AB25 /* CodeGen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeGen.cpp; sourceTree = "<group>"; };
+		A972AC6421CED9060013AB25 /* Link.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Link.cpp; sourceTree = "<group>"; };
+		A976290221CC60BC00B52A68 /* spirv_msl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_msl.hpp; sourceTree = "<group>"; };
+		A976290321CC60BC00B52A68 /* spirv_cross.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross.hpp; sourceTree = "<group>"; };
+		A976290421CC60BC00B52A68 /* spirv_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_parser.cpp; sourceTree = "<group>"; };
+		A976290521CC60BC00B52A68 /* spirv_cross.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross.cpp; sourceTree = "<group>"; };
+		A976290621CC60BC00B52A68 /* spirv_glsl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_glsl.cpp; sourceTree = "<group>"; };
+		A976290721CC60BC00B52A68 /* spirv_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_common.hpp; sourceTree = "<group>"; };
+		A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_parsed_ir.hpp; sourceTree = "<group>"; };
+		A976290921CC60BC00B52A68 /* spirv_cfg.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cfg.hpp; sourceTree = "<group>"; };
+		A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_glsl.hpp; sourceTree = "<group>"; };
+		A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cfg.cpp; sourceTree = "<group>"; };
+		A976290C21CC60BC00B52A68 /* spirv_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_parser.hpp; sourceTree = "<group>"; };
+		A976290D21CC60BC00B52A68 /* spirv_msl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_msl.cpp; sourceTree = "<group>"; };
+		A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross_parsed_ir.cpp; sourceTree = "<group>"; };
+		A9C2104521D14FD7006BA2D3 /* fetchDependencies */ = {isa = PBXFileReference; lastKnownFileType = text; path = fetchDependencies; sourceTree = "<group>"; };
+		A9C2104721D15843006BA2D3 /* ExternalRevisions */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ExternalRevisions; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+		A90FD9E921CC519E00B92BB2 /* External */ = {
+			isa = PBXGroup;
+			children = (
+				A97628F021CC5DA700B52A68 /* SPIRV-Cross */,
+				A972A82421CECC410013AB25 /* SPIRV-Tools */,
+				A972ABC821CED6F90013AB25 /* glslang */,
+			);
+			path = External;
+			sourceTree = "<group>";
+		};
+		A9679AAB21D2699800856BF7 /* Scripts */ = {
+			isa = PBXGroup;
+			children = (
+				A9679AAD21D269D900856BF7 /* package_ext_libs_ios.sh */,
+				A9679AAC21D269D900856BF7 /* package_ext_libs_macos.sh */,
+				A9679AAE21D269D900856BF7 /* package_ext_libs.sh */,
+			);
+			path = Scripts;
+			sourceTree = "<group>";
+		};
+		A972A82421CECC410013AB25 /* SPIRV-Tools */ = {
+			isa = PBXGroup;
+			children = (
+				A972A82921CED2720013AB25 /* source */,
+			);
+			name = "SPIRV-Tools";
+			path = "glslang/External/spirv-tools";
+			sourceTree = "<group>";
+		};
+		A972A82921CED2720013AB25 /* source */ = {
+			isa = PBXGroup;
+			children = (
+				A972A82A21CED2720013AB25 /* spirv_target_env.cpp */,
+				A972A82B21CED2720013AB25 /* extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json */,
+				A972A82C21CED2720013AB25 /* assembly_grammar.h */,
+				A972A82D21CED2720013AB25 /* enum_set.h */,
+				A972A82E21CED2720013AB25 /* CMakeLists.txt */,
+				A972A82F21CED2720013AB25 /* extinst.spv-amd-shader-ballot.grammar.json */,
+				A972A83021CED2720013AB25 /* text.cpp */,
+				A972A83121CED2720013AB25 /* assembly_grammar.cpp */,
+				A972A83221CED2720013AB25 /* text.h */,
+				A972A83321CED2720013AB25 /* extensions.cpp */,
+				A972A83421CED2720013AB25 /* pch_source.cpp */,
+				A972A83521CED2720013AB25 /* util */,
+				A972A84421CED2720013AB25 /* spirv_target_env.h */,
+				A972A84521CED2720013AB25 /* table.cpp */,
+				A972A84621CED2720013AB25 /* id_descriptor.cpp */,
+				A972A84721CED2720013AB25 /* latest_version_opencl_std_header.h */,
+				A972A84821CED2720013AB25 /* spirv_optimizer_options.cpp */,
+				A972A84921CED2720013AB25 /* cfa.h */,
+				A972A84A21CED2720013AB25 /* pch_source.h */,
+				A972A84B21CED2720013AB25 /* enum_string_mapping.h */,
+				A972A84C21CED2720013AB25 /* spirv_validator_options.cpp */,
+				A972A84D21CED2720013AB25 /* extinst.spv-amd-shader-trinary-minmax.grammar.json */,
+				A972A84E21CED2720013AB25 /* print.cpp */,
+				A972A84F21CED2720013AB25 /* spirv_definition.h */,
+				A972A85021CED2720013AB25 /* operand.h */,
+				A972A85121CED2720013AB25 /* spirv_endian.cpp */,
+				A972A85221CED2720013AB25 /* macro.h */,
+				A972A85321CED2720013AB25 /* spirv_constant.h */,
+				A972A85421CED2720013AB25 /* extinst.spv-amd-gcn-shader.grammar.json */,
+				A972A85521CED2720013AB25 /* binary.cpp */,
+				A972A85621CED2720013AB25 /* spirv_validator_options.h */,
+				A972A85721CED2720013AB25 /* comp */,
+				A972A86821CED2720013AB25 /* enum_string_mapping.cpp */,
+				A972A86921CED2720013AB25 /* text_handler.h */,
+				A972A86A21CED2720013AB25 /* parsed_operand.h */,
+				A972A86B21CED2720013AB25 /* name_mapper.h */,
+				A972A86C21CED2720013AB25 /* parsed_operand.cpp */,
+				A972A86D21CED2720013AB25 /* diagnostic.h */,
+				A972A86E21CED2720013AB25 /* spirv_endian.h */,
+				A972A86F21CED2720013AB25 /* name_mapper.cpp */,
+				A972A87021CED2720013AB25 /* extinst.debuginfo.grammar.json */,
+				A972A87121CED2720013AB25 /* link */,
+				A972A87421CED2720013AB25 /* software_version.cpp */,
+				A972A87521CED2720013AB25 /* opcode.cpp */,
+				A972A87621CED2720013AB25 /* print.h */,
+				A972A87721CED2720013AB25 /* ext_inst.cpp */,
+				A972A87821CED2720013AB25 /* disassemble.h */,
+				A972A87921CED2720013AB25 /* opt */,
+				A972A92C21CED2730013AB25 /* table.h */,
+				A972A92D21CED2730013AB25 /* ext_inst.h */,
+				A972A92E21CED2730013AB25 /* diagnostic.cpp */,
+				A972A92F21CED2730013AB25 /* latest_version_spirv_header.h */,
+				A972A93021CED2730013AB25 /* libspirv.cpp */,
+				A972A93121CED2730013AB25 /* instruction.h */,
+				A972A93221CED2730013AB25 /* id_descriptor.h */,
+				A972A93321CED2730013AB25 /* spirv_optimizer_options.h */,
+				A972A93421CED2730013AB25 /* opcode.h */,
+				A972A93521CED2730013AB25 /* operand.cpp */,
+				A972A93621CED2730013AB25 /* latest_version_glsl_std_450_header.h */,
+				A972A93721CED2730013AB25 /* extensions.h */,
+				A972A93821CED2730013AB25 /* disassemble.cpp */,
+				A972A93921CED2730013AB25 /* binary.h */,
+				A972A93A21CED2730013AB25 /* text_handler.cpp */,
+				A972A93B21CED2730013AB25 /* val */,
+			);
+			path = source;
+			sourceTree = "<group>";
+		};
+		A972A83521CED2720013AB25 /* util */ = {
+			isa = PBXGroup;
+			children = (
+				A972A83621CED2720013AB25 /* parse_number.h */,
+				A972A83721CED2720013AB25 /* ilist_node.h */,
+				A972A83821CED2720013AB25 /* make_unique.h */,
+				A972A83921CED2720013AB25 /* string_utils.h */,
+				A972A83A21CED2720013AB25 /* small_vector.h */,
+				A972A83B21CED2720013AB25 /* timer.cpp */,
+				A972A83C21CED2720013AB25 /* timer.h */,
+				A972A83D21CED2720013AB25 /* string_utils.cpp */,
+				A972A83E21CED2720013AB25 /* bit_vector.h */,
+				A972A83F21CED2720013AB25 /* bitutils.h */,
+				A972A84021CED2720013AB25 /* hex_float.h */,
+				A972A84121CED2720013AB25 /* parse_number.cpp */,
+				A972A84221CED2720013AB25 /* bit_vector.cpp */,
+				A972A84321CED2720013AB25 /* ilist.h */,
+			);
+			path = util;
+			sourceTree = "<group>";
+		};
+		A972A85721CED2720013AB25 /* comp */ = {
+			isa = PBXGroup;
+			children = (
+				A972A85821CED2720013AB25 /* markv_codec.cpp */,
+				A972A85921CED2720013AB25 /* markv.cpp */,
+				A972A85A21CED2720013AB25 /* huffman_codec.h */,
+				A972A85B21CED2720013AB25 /* CMakeLists.txt */,
+				A972A85C21CED2720013AB25 /* bit_stream.h */,
+				A972A85D21CED2720013AB25 /* move_to_front.cpp */,
+				A972A85E21CED2720013AB25 /* markv_encoder.h */,
+				A972A85F21CED2720013AB25 /* markv_decoder.h */,
+				A972A86021CED2720013AB25 /* markv.h */,
+				A972A86121CED2720013AB25 /* markv_model.h */,
+				A972A86221CED2720013AB25 /* markv_decoder.cpp */,
+				A972A86321CED2720013AB25 /* move_to_front.h */,
+				A972A86421CED2720013AB25 /* markv_codec.h */,
+				A972A86521CED2720013AB25 /* markv_logger.h */,
+				A972A86621CED2720013AB25 /* bit_stream.cpp */,
+				A972A86721CED2720013AB25 /* markv_encoder.cpp */,
+			);
+			path = comp;
+			sourceTree = "<group>";
+		};
+		A972A87121CED2720013AB25 /* link */ = {
+			isa = PBXGroup;
+			children = (
+				A972A87221CED2720013AB25 /* CMakeLists.txt */,
+				A972A87321CED2720013AB25 /* linker.cpp */,
+			);
+			path = link;
+			sourceTree = "<group>";
+		};
+		A972A87921CED2720013AB25 /* opt */ = {
+			isa = PBXGroup;
+			children = (
+				A972A87A21CED2720013AB25 /* optimizer.cpp */,
+				A972A87B21CED2720013AB25 /* if_conversion.h */,
+				A972A87C21CED2720013AB25 /* register_pressure.cpp */,
+				A972A87D21CED2720013AB25 /* loop_utils.cpp */,
+				A972A87E21CED2720013AB25 /* merge_return_pass.h */,
+				A972A87F21CED2720013AB25 /* inline_opaque_pass.h */,
+				A972A88021CED2720013AB25 /* loop_fusion.h */,
+				A972A88121CED2720013AB25 /* combine_access_chains.cpp */,
+				A972A88221CED2720013AB25 /* build_module.cpp */,
+				A972A88321CED2720013AB25 /* composite.h */,
+				A972A88421CED2720013AB25 /* compact_ids_pass.h */,
+				A972A88521CED2720013AB25 /* register_pressure.h */,
+				A972A88621CED2720013AB25 /* tree_iterator.h */,
+				A972A88721CED2720013AB25 /* local_single_store_elim_pass.h */,
+				A972A88821CED2720013AB25 /* reduce_load_size.h */,
+				A972A88921CED2720013AB25 /* types.cpp */,
+				A972A88A21CED2720013AB25 /* scalar_analysis.h */,
+				A972A88B21CED2720013AB25 /* strip_debug_info_pass.h */,
+				A972A88C21CED2720013AB25 /* cfg.cpp */,
+				A972A88D21CED2720013AB25 /* decoration_manager.cpp */,
+				A972A88E21CED2720013AB25 /* local_single_block_elim_pass.cpp */,
+				A972A88F21CED2720013AB25 /* freeze_spec_constant_value_pass.cpp */,
+				A972A89021CED2720013AB25 /* replace_invalid_opc.h */,
+				A972A89121CED2720013AB25 /* local_access_chain_convert_pass.h */,
+				A972A89221CED2720013AB25 /* inst_bindless_check_pass.cpp */,
+				A972A89321CED2720013AB25 /* local_redundancy_elimination.cpp */,
+				A972A89421CED2720013AB25 /* CMakeLists.txt */,
+				A972A89521CED2720013AB25 /* instrument_pass.cpp */,
+				A972A89621CED2720013AB25 /* propagator.h */,
+				A972A89721CED2720013AB25 /* instruction_list.h */,
+				A972A89821CED2720013AB25 /* feature_manager.cpp */,
+				A972A89921CED2720013AB25 /* pass.cpp */,
+				A972A89A21CED2720013AB25 /* loop_fission.cpp */,
+				A972A89B21CED2720013AB25 /* dominator_tree.cpp */,
+				A972A89C21CED2720013AB25 /* merge_return_pass.cpp */,
+				A972A89D21CED2720013AB25 /* ir_context.h */,
+				A972A89E21CED2720013AB25 /* eliminate_dead_constant_pass.cpp */,
+				A972A89F21CED2720013AB25 /* cfg_cleanup_pass.cpp */,
+				A972A8A021CED2720013AB25 /* const_folding_rules.cpp */,
+				A972A8A121CED2720013AB25 /* loop_unroller.h */,
+				A972A8A221CED2720013AB25 /* strip_debug_info_pass.cpp */,
+				A972A8A321CED2720013AB25 /* ssa_rewrite_pass.cpp */,
+				A972A8A421CED2720013AB25 /* loop_dependence.cpp */,
+				A972A8A521CED2720013AB25 /* unify_const_pass.h */,
+				A972A8A621CED2720013AB25 /* ir_loader.h */,
+				A972A8A721CED2720013AB25 /* types.h */,
+				A972A8A821CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.h */,
+				A972A8A921CED2720013AB25 /* mem_pass.cpp */,
+				A972A8AA21CED2720013AB25 /* basic_block.h */,
+				A972A8AB21CED2720013AB25 /* remove_duplicates_pass.cpp */,
+				A972A8AC21CED2720013AB25 /* dead_variable_elimination.cpp */,
+				A972A8AD21CED2720013AB25 /* block_merge_pass.h */,
+				A972A8AE21CED2720013AB25 /* module.cpp */,
+				A972A8AF21CED2720013AB25 /* fold_spec_constant_op_and_composite_pass.cpp */,
+				A972A8B021CED2720013AB25 /* loop_unswitch_pass.cpp */,
+				A972A8B121CED2720013AB25 /* unify_const_pass.cpp */,
+				A972A8B221CED2720013AB25 /* type_manager.cpp */,
+				A972A8B321CED2720013AB25 /* private_to_local_pass.h */,
+				A972A8B421CED2720013AB25 /* inline_pass.cpp */,
+				A972A8B521CED2720013AB25 /* def_use_manager.h */,
+				A972A8B621CED2720013AB25 /* ir_loader.cpp */,
+				A972A8B721CED2720013AB25 /* cfg_cleanup_pass.h */,
+				A972A8B821CED2720013AB25 /* licm_pass.cpp */,
+				A972A8B921CED2720013AB25 /* eliminate_dead_functions_pass.cpp */,
+				A972A8BA21CED2720013AB25 /* local_redundancy_elimination.h */,
+				A972A8BB21CED2720013AB25 /* loop_peeling.h */,
+				A972A8BC21CED2720013AB25 /* vector_dce.cpp */,
+				A972A8BD21CED2720013AB25 /* loop_unroller.cpp */,
+				A972A8BE21CED2720013AB25 /* constants.cpp */,
+				A972A8BF21CED2720013AB25 /* loop_fusion_pass.h */,
+				A972A8C021CED2720013AB25 /* struct_cfg_analysis.h */,
+				A972A8C121CED2720013AB25 /* common_uniform_elim_pass.cpp */,
+				A972A8C221CED2720013AB25 /* def_use_manager.cpp */,
+				A972A8C321CED2720013AB25 /* strip_reflect_info_pass.cpp */,
+				A972A8C421CED2720013AB25 /* decoration_manager.h */,
+				A972A8C521CED2720013AB25 /* ccp_pass.cpp */,
+				A972A8C621CED2720013AB25 /* local_single_block_elim_pass.h */,
+				A972A8C721CED2720013AB25 /* pch_source_opt.cpp */,
+				A972A8C821CED2720013AB25 /* strength_reduction_pass.h */,
+				A972A8C921CED2720013AB25 /* aggressive_dead_code_elim_pass.cpp */,
+				A972A8CA21CED2720013AB25 /* simplification_pass.cpp */,
+				A972A8CB21CED2720013AB25 /* dead_branch_elim_pass.cpp */,
+				A972A8CC21CED2720013AB25 /* flatten_decoration_pass.cpp */,
+				A972A8CD21CED2720013AB25 /* dead_insert_elim_pass.h */,
+				A972A8CE21CED2720013AB25 /* folding_rules.cpp */,
+				A972A8CF21CED2720013AB25 /* freeze_spec_constant_value_pass.h */,
+				A972A8D021CED2720013AB25 /* ir_context.cpp */,
+				A972A8D121CED2720013AB25 /* instrument_pass.h */,
+				A972A8D221CED2720013AB25 /* mem_pass.h */,
+				A972A8D321CED2720013AB25 /* loop_descriptor.cpp */,
+				A972A8D421CED2720013AB25 /* local_ssa_elim_pass.cpp */,
+				A972A8D521CED2720013AB25 /* function.cpp */,
+				A972A8D621CED2720013AB25 /* instruction_list.cpp */,
+				A972A8D721CED2720013AB25 /* composite.cpp */,
+				A972A8D821CED2720013AB25 /* inline_pass.h */,
+				A972A8D921CED2720013AB25 /* loop_dependence.h */,
+				A972A8DA21CED2720013AB25 /* value_number_table.h */,
+				A972A8DB21CED2720013AB25 /* flatten_decoration_pass.h */,
+				A972A8DC21CED2720013AB25 /* if_conversion.cpp */,
+				A972A8DD21CED2720013AB25 /* inline_exhaustive_pass.h */,
+				A972A8DE21CED2720013AB25 /* constants.h */,
+				A972A8DF21CED2720013AB25 /* strength_reduction_pass.cpp */,
+				A972A8E021CED2720013AB25 /* copy_prop_arrays.cpp */,
+				A972A8E121CED2720013AB25 /* pass_manager.cpp */,
+				A972A8E221CED2720013AB25 /* inline_exhaustive_pass.cpp */,
+				A972A8E321CED2720013AB25 /* loop_fission.h */,
+				A972A8E421CED2720013AB25 /* workaround1209.h */,
+				A972A8E521CED2720013AB25 /* loop_fusion_pass.cpp */,
+				A972A8E621CED2720013AB25 /* log.h */,
+				A972A8E721CED2720013AB25 /* copy_prop_arrays.h */,
+				A972A8E821CED2720013AB25 /* eliminate_dead_constant_pass.h */,
+				A972A8E921CED2720013AB25 /* dead_insert_elim_pass.cpp */,
+				A972A8EA21CED2720013AB25 /* ssa_rewrite_pass.h */,
+				A972A8EB21CED2720013AB25 /* scalar_analysis.cpp */,
+				A972A8EC21CED2720013AB25 /* dead_variable_elimination.h */,
+				A972A8ED21CED2720013AB25 /* block_merge_pass.cpp */,
+				A972A8EE21CED2720013AB25 /* dominator_analysis.h */,
+				A972A8EF21CED2720013AB25 /* pass.h */,
+				A972A8F021CED2720013AB25 /* folding_rules.h */,
+				A972A8F121CED2720013AB25 /* eliminate_dead_functions_pass.h */,
+				A972A8F221CED2720013AB25 /* common_uniform_elim_pass.h */,
+				A972A8F321CED2720013AB25 /* fold.h */,
+				A972A8F421CED2720013AB25 /* local_single_store_elim_pass.cpp */,
+				A972A8F521CED2720013AB25 /* dead_branch_elim_pass.h */,
+				A972A8F621CED2720013AB25 /* private_to_local_pass.cpp */,
+				A972A8F721CED2720013AB25 /* scalar_analysis_nodes.h */,
+				A972A8F821CED2720013AB25 /* propagator.cpp */,
+				A972A8F921CED2720013AB25 /* loop_dependence_helpers.cpp */,
+				A972A8FA21CED2720013AB25 /* set_spec_constant_default_value_pass.cpp */,
+				A972A8FB21CED2720013AB25 /* passes.h */,
+				A972A8FC21CED2720013AB25 /* fold.cpp */,
+				A972A8FD21CED2720013AB25 /* strip_reflect_info_pass.h */,
+				A972A8FE21CED2720013AB25 /* scalar_replacement_pass.cpp */,
+				A972A8FF21CED2720013AB25 /* simplification_pass.h */,
+				A972A90021CED2720013AB25 /* remove_duplicates_pass.h */,
+				A972A90121CED2720013AB25 /* redundancy_elimination.cpp */,
+				A972A90221CED2720013AB25 /* reflect.h */,
+				A972A90321CED2720013AB25 /* workaround1209.cpp */,
+				A972A90421CED2720013AB25 /* null_pass.h */,
+				A972A90521CED2720013AB25 /* const_folding_rules.h */,
+				A972A90621CED2720013AB25 /* scalar_replacement_pass.h */,
+				A972A90721CED2720013AB25 /* instruction.cpp */,
+				A972A90821CED2720013AB25 /* pch_source_opt.h */,
+				A972A90921CED2720013AB25 /* reduce_load_size.cpp */,
+				A972A90A21CED2720013AB25 /* redundancy_elimination.h */,
+				A972A90B21CED2720013AB25 /* value_number_table.cpp */,
+				A972A90C21CED2720013AB25 /* local_ssa_elim_pass.h */,
+				A972A90D21CED2720013AB25 /* inline_opaque_pass.cpp */,
+				A972A90E21CED2720013AB25 /* replace_invalid_opc.cpp */,
+				A972A90F21CED2720013AB25 /* loop_utils.h */,
+				A972A91021CED2720013AB25 /* module.h */,
+				A972A91121CED2720013AB25 /* dominator_analysis.cpp */,
+				A972A91221CED2720013AB25 /* ir_builder.h */,
+				A972A91321CED2720013AB25 /* loop_unswitch_pass.h */,
+				A972A91421CED2720013AB25 /* cfg.h */,
+				A972A91521CED2720013AB25 /* loop_descriptor.h */,
+				A972A91621CED2730013AB25 /* instruction.h */,
+				A972A91721CED2730013AB25 /* aggressive_dead_code_elim_pass.h */,
+				A972A91821CED2730013AB25 /* struct_cfg_analysis.cpp */,
+				A972A91921CED2730013AB25 /* vector_dce.h */,
+				A972A91A21CED2730013AB25 /* combine_access_chains.h */,
+				A972A91B21CED2730013AB25 /* pass_manager.h */,
+				A972A91C21CED2730013AB25 /* local_access_chain_convert_pass.cpp */,
+				A972A91D21CED2730013AB25 /* basic_block.cpp */,
+				A972A91E21CED2730013AB25 /* iterator.h */,
+				A972A91F21CED2730013AB25 /* licm_pass.h */,
+				A972A92021CED2730013AB25 /* build_module.h */,
+				A972A92121CED2730013AB25 /* ccp_pass.h */,
+				A972A92221CED2730013AB25 /* function.h */,
+				A972A92321CED2730013AB25 /* loop_fusion.cpp */,
+				A972A92421CED2730013AB25 /* feature_manager.h */,
+				A972A92521CED2730013AB25 /* inst_bindless_check_pass.h */,
+				A972A92621CED2730013AB25 /* scalar_analysis_simplification.cpp */,
+				A972A92721CED2730013AB25 /* set_spec_constant_default_value_pass.h */,
+				A972A92821CED2730013AB25 /* dominator_tree.h */,
+				A972A92921CED2730013AB25 /* type_manager.h */,
+				A972A92A21CED2730013AB25 /* compact_ids_pass.cpp */,
+				A972A92B21CED2730013AB25 /* loop_peeling.cpp */,
+			);
+			path = opt;
+			sourceTree = "<group>";
+		};
+		A972A93B21CED2730013AB25 /* val */ = {
+			isa = PBXGroup;
+			children = (
+				A972A93C21CED2730013AB25 /* validate_annotation.cpp */,
+				A972A93D21CED2730013AB25 /* validate_cfg.cpp */,
+				A972A93E21CED2730013AB25 /* validate_capability.cpp */,
+				A972A93F21CED2730013AB25 /* construct.h */,
+				A972A94021CED2730013AB25 /* validate_barriers.cpp */,
+				A972A94121CED2730013AB25 /* validate_non_uniform.cpp */,
+				A972A94221CED2730013AB25 /* validate_atomics.cpp */,
+				A972A94321CED2730013AB25 /* basic_block.h */,
+				A972A94421CED2730013AB25 /* validate_instruction.cpp */,
+				A972A94521CED2730013AB25 /* validate_decorations.cpp */,
+				A972A94621CED2730013AB25 /* validate_debug.cpp */,
+				A972A94721CED2730013AB25 /* validate_builtins.cpp */,
+				A972A94821CED2730013AB25 /* validate_interfaces.cpp */,
+				A972A94921CED2730013AB25 /* validate.cpp */,
+				A972A94A21CED2730013AB25 /* validation_state.h */,
+				A972A94B21CED2730013AB25 /* validate_constants.cpp */,
+				A972A94C21CED2730013AB25 /* validate_bitwise.cpp */,
+				A972A94D21CED2730013AB25 /* construct.cpp */,
+				A972A94E21CED2730013AB25 /* function.cpp */,
+				A972A94F21CED2730013AB25 /* validate.h */,
+				A972A95021CED2730013AB25 /* validate_adjacency.cpp */,
+				A972A95121CED2730013AB25 /* validate_conversion.cpp */,
+				A972A95221CED2730013AB25 /* validate_datarules.cpp */,
+				A972A95321CED2730013AB25 /* validate_id.cpp */,
+				A972A95421CED2730013AB25 /* validate_arithmetics.cpp */,
+				A972A95521CED2730013AB25 /* validate_mode_setting.cpp */,
+				A972A95621CED2730013AB25 /* validate_logicals.cpp */,
+				A972A95721CED2730013AB25 /* validate_derivatives.cpp */,
+				A972A95821CED2730013AB25 /* validate_memory.cpp */,
+				A972A95921CED2730013AB25 /* validate_image.cpp */,
+				A972A95A21CED2730013AB25 /* validate_literals.cpp */,
+				A972A95B21CED2730013AB25 /* instruction.cpp */,
+				A972A95C21CED2730013AB25 /* validate_type.cpp */,
+				A972A95D21CED2730013AB25 /* validate_ext_inst.cpp */,
+				A972A95E21CED2730013AB25 /* instruction.h */,
+				A972A95F21CED2730013AB25 /* validate_execution_limitations.cpp */,
+				A972A96021CED2730013AB25 /* validate_layout.cpp */,
+				A972A96121CED2730013AB25 /* basic_block.cpp */,
+				A972A96221CED2730013AB25 /* validate_function.cpp */,
+				A972A96321CED2730013AB25 /* function.h */,
+				A972A96421CED2730013AB25 /* validate_composites.cpp */,
+				A972A96521CED2730013AB25 /* validation_state.cpp */,
+				A972A96621CED2730013AB25 /* validate_primitives.cpp */,
+				A972A96721CED2730013AB25 /* decoration.h */,
+			);
+			path = val;
+			sourceTree = "<group>";
+		};
+		A972ABC821CED6F90013AB25 /* glslang */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC1421CED9060013AB25 /* glslang */,
+				A972ABF521CED9060013AB25 /* OGLCompilersDLL */,
+				A972ABF921CED9060013AB25 /* SPIRV */,
+			);
+			path = glslang;
+			sourceTree = "<group>";
+		};
+		A972ABF521CED9060013AB25 /* OGLCompilersDLL */ = {
+			isa = PBXGroup;
+			children = (
+				A972ABF621CED9060013AB25 /* CMakeLists.txt */,
+				A972ABF721CED9060013AB25 /* InitializeDll.h */,
+				A972ABF821CED9060013AB25 /* InitializeDll.cpp */,
+			);
+			path = OGLCompilersDLL;
+			sourceTree = "<group>";
+		};
+		A972ABF921CED9060013AB25 /* SPIRV */ = {
+			isa = PBXGroup;
+			children = (
+				A972ABFA21CED9060013AB25 /* SPVRemapper.h */,
+				A972ABFB21CED9060013AB25 /* SpvBuilder.h */,
+				A972ABFC21CED9060013AB25 /* CMakeLists.txt */,
+				A972ABFD21CED9060013AB25 /* SpvPostProcess.cpp */,
+				A972ABFE21CED9060013AB25 /* SpvTools.h */,
+				A972ABFF21CED9060013AB25 /* SpvTools.cpp */,
+				A972AC0021CED9060013AB25 /* InReadableOrder.cpp */,
+				A972AC0121CED9060013AB25 /* GLSL.ext.AMD.h */,
+				A972AC0221CED9060013AB25 /* doc.h */,
+				A972AC0321CED9060013AB25 /* spirv.hpp */,
+				A972AC0421CED9060013AB25 /* SpvBuilder.cpp */,
+				A972AC0521CED9060013AB25 /* GLSL.ext.EXT.h */,
+				A972AC0621CED9060013AB25 /* GLSL.ext.KHR.h */,
+				A972AC0721CED9060013AB25 /* GLSL.ext.NV.h */,
+				A972AC0821CED9060013AB25 /* GlslangToSpv.cpp */,
+				A972AC0921CED9060013AB25 /* spvIR.h */,
+				A972AC0A21CED9060013AB25 /* bitutils.h */,
+				A972AC0B21CED9060013AB25 /* disassemble.h */,
+				A972AC0C21CED9060013AB25 /* GlslangToSpv.h */,
+				A972AC0D21CED9060013AB25 /* GLSL.std.450.h */,
+				A972AC0E21CED9060013AB25 /* SPVRemapper.cpp */,
+				A972AC0F21CED9060013AB25 /* Logger.cpp */,
+				A972AC1021CED9060013AB25 /* hex_float.h */,
+				A972AC1121CED9060013AB25 /* Logger.h */,
+				A972AC1221CED9060013AB25 /* doc.cpp */,
+				A972AC1321CED9060013AB25 /* disassemble.cpp */,
+			);
+			path = SPIRV;
+			sourceTree = "<group>";
+		};
+		A972AC1421CED9060013AB25 /* glslang */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC1521CED9060013AB25 /* CMakeLists.txt */,
+				A972AC1621CED9060013AB25 /* OSDependent */,
+				A972AC1F21CED9060013AB25 /* Include */,
+				A972AC2D21CED9060013AB25 /* updateGrammar */,
+				A972AC2E21CED9060013AB25 /* MachineIndependent */,
+				A972AC6021CED9060013AB25 /* Public */,
+				A972AC6221CED9060013AB25 /* GenericCodeGen */,
+			);
+			path = glslang;
+			sourceTree = "<group>";
+		};
+		A972AC1621CED9060013AB25 /* OSDependent */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC1721CED9060013AB25 /* Unix */,
+				A972AC1A21CED9060013AB25 /* osinclude.h */,
+			);
+			path = OSDependent;
+			sourceTree = "<group>";
+		};
+		A972AC1721CED9060013AB25 /* Unix */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC1821CED9060013AB25 /* ossource.cpp */,
+				A972AC1921CED9060013AB25 /* CMakeLists.txt */,
+			);
+			path = Unix;
+			sourceTree = "<group>";
+		};
+		A972AC1F21CED9060013AB25 /* Include */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC2021CED9060013AB25 /* ResourceLimits.h */,
+				A972AC2121CED9060013AB25 /* Types.h */,
+				A972AC2221CED9060013AB25 /* intermediate.h */,
+				A972AC2321CED9060013AB25 /* BaseTypes.h */,
+				A972AC2421CED9060013AB25 /* revision.h */,
+				A972AC2521CED9060013AB25 /* InitializeGlobals.h */,
+				A972AC2621CED9060013AB25 /* ShHandle.h */,
+				A972AC2721CED9060013AB25 /* arrays.h */,
+				A972AC2821CED9060013AB25 /* Common.h */,
+				A972AC2921CED9060013AB25 /* revision.template */,
+				A972AC2A21CED9060013AB25 /* ConstantUnion.h */,
+				A972AC2B21CED9060013AB25 /* InfoSink.h */,
+				A972AC2C21CED9060013AB25 /* PoolAlloc.h */,
+			);
+			path = Include;
+			sourceTree = "<group>";
+		};
+		A972AC2E21CED9060013AB25 /* MachineIndependent */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC2F21CED9060013AB25 /* ParseHelper.cpp */,
+				A972AC3021CED9060013AB25 /* parseVersions.h */,
+				A972AC3121CED9060013AB25 /* gl_types.h */,
+				A972AC3221CED9060013AB25 /* propagateNoContraction.cpp */,
+				A972AC3321CED9060013AB25 /* pch.h */,
+				A972AC3421CED9060013AB25 /* ScanContext.h */,
+				A972AC3521CED9060013AB25 /* iomapper.h */,
+				A972AC3621CED9060013AB25 /* localintermediate.h */,
+				A972AC3721CED9060013AB25 /* Scan.cpp */,
+				A972AC3921CED9060013AB25 /* RemoveTree.h */,
+				A972AC3A21CED9060013AB25 /* Initialize.cpp */,
+				A972AC3B21CED9060013AB25 /* glslang_tab.cpp */,
+				A972AC3C21CED9060013AB25 /* limits.cpp */,
+				A972AC3D21CED9060013AB25 /* parseConst.cpp */,
+				A972AC3E21CED9060013AB25 /* propagateNoContraction.h */,
+				A972AC3F21CED9060013AB25 /* Versions.h */,
+				A972AC4021CED9060013AB25 /* IntermTraverse.cpp */,
+				A972AC4121CED9060013AB25 /* intermOut.cpp */,
+				A972AC4221CED9060013AB25 /* iomapper.cpp */,
+				A972AC4321CED9060013AB25 /* PoolAlloc.cpp */,
+				A972AC4421CED9060013AB25 /* ShaderLang.cpp */,
+				A972AC4521CED9060013AB25 /* SymbolTable.h */,
+				A972AC4621CED9060013AB25 /* InfoSink.cpp */,
+				A972AC4721CED9060013AB25 /* Intermediate.cpp */,
+				A972AC4821CED9060013AB25 /* pch.cpp */,
+				A972AC4921CED9060013AB25 /* SymbolTable.cpp */,
+				A972AC4A21CED9060013AB25 /* glslang_tab.cpp.h */,
+				A972AC4B21CED9060013AB25 /* LiveTraverser.h */,
+				A972AC4C21CED9060013AB25 /* Initialize.h */,
+				A972AC4D21CED9060013AB25 /* attribute.cpp */,
+				A972AC4E21CED9060013AB25 /* reflection.cpp */,
+				A972AC4F21CED9060013AB25 /* RemoveTree.cpp */,
+				A972AC5021CED9060013AB25 /* attribute.h */,
+				A972AC5121CED9060013AB25 /* Versions.cpp */,
+				A972AC5221CED9060013AB25 /* Constant.cpp */,
+				A972AC5321CED9060013AB25 /* linkValidate.cpp */,
+				A972AC5421CED9060013AB25 /* ParseHelper.h */,
+				A972AC5521CED9060013AB25 /* preprocessor */,
+				A972AC5D21CED9060013AB25 /* ParseContextBase.cpp */,
+				A972AC5E21CED9060013AB25 /* reflection.h */,
+				A972AC5F21CED9060013AB25 /* Scan.h */,
+			);
+			path = MachineIndependent;
+			sourceTree = "<group>";
+		};
+		A972AC5521CED9060013AB25 /* preprocessor */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC5621CED9060013AB25 /* PpAtom.cpp */,
+				A972AC5721CED9060013AB25 /* PpTokens.h */,
+				A972AC5821CED9060013AB25 /* Pp.cpp */,
+				A972AC5921CED9060013AB25 /* PpContext.h */,
+				A972AC5A21CED9060013AB25 /* PpTokens.cpp */,
+				A972AC5B21CED9060013AB25 /* PpContext.cpp */,
+				A972AC5C21CED9060013AB25 /* PpScanner.cpp */,
+			);
+			path = preprocessor;
+			sourceTree = "<group>";
+		};
+		A972AC6021CED9060013AB25 /* Public */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC6121CED9060013AB25 /* ShaderLang.h */,
+			);
+			path = Public;
+			sourceTree = "<group>";
+		};
+		A972AC6221CED9060013AB25 /* GenericCodeGen */ = {
+			isa = PBXGroup;
+			children = (
+				A972AC6321CED9060013AB25 /* CodeGen.cpp */,
+				A972AC6421CED9060013AB25 /* Link.cpp */,
+			);
+			path = GenericCodeGen;
+			sourceTree = "<group>";
+		};
+		A972AD2421CEE30F0013AB25 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				A90FD89F21CC4EAB00B92BB2 /* libSPIRVCross.a */,
+				A90FD9E421CC4EB900B92BB2 /* libSPIRVCross.a */,
+				A972A80F21CECBBF0013AB25 /* libSPIRVTools.a */,
+				A972A82321CECBE90013AB25 /* libSPIRVTools.a */,
+				A972ABDC21CED7BC0013AB25 /* libglslang.a */,
+				A972ABF021CED7CB0013AB25 /* libglslang.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		A97628F021CC5DA700B52A68 /* SPIRV-Cross */ = {
+			isa = PBXGroup;
+			children = (
+				A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */,
+				A976290921CC60BC00B52A68 /* spirv_cfg.hpp */,
+				A976290721CC60BC00B52A68 /* spirv_common.hpp */,
+				A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */,
+				A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */,
+				A976290521CC60BC00B52A68 /* spirv_cross.cpp */,
+				A976290321CC60BC00B52A68 /* spirv_cross.hpp */,
+				A976290621CC60BC00B52A68 /* spirv_glsl.cpp */,
+				A976290A21CC60BC00B52A68 /* spirv_glsl.hpp */,
+				A976290D21CC60BC00B52A68 /* spirv_msl.cpp */,
+				A976290221CC60BC00B52A68 /* spirv_msl.hpp */,
+				A976290421CC60BC00B52A68 /* spirv_parser.cpp */,
+				A976290C21CC60BC00B52A68 /* spirv_parser.hpp */,
+			);
+			path = "SPIRV-Cross";
+			sourceTree = "<group>";
+		};
+		A9F55D24198BE6A7004EC31B = {
+			isa = PBXGroup;
+			children = (
+				A9C2104521D14FD7006BA2D3 /* fetchDependencies */,
+				A9C2104721D15843006BA2D3 /* ExternalRevisions */,
+				A90FD9E921CC519E00B92BB2 /* External */,
+				A9679AAB21D2699800856BF7 /* Scripts */,
+				A972AD2421CEE30F0013AB25 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		A972A7FD21CECBBF0013AB25 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972A9EE21CED2730013AB25 /* disassemble.h in Headers */,
+				A972AAE021CED2730013AB25 /* fold.h in Headers */,
+				A972AB5421CED2730013AB25 /* ext_inst.h in Headers */,
+				A972A97E21CED2730013AB25 /* string_utils.h in Headers */,
+				A972AB0E21CED2730013AB25 /* redundancy_elimination.h in Headers */,
+				A972AA0821CED2730013AB25 /* tree_iterator.h in Headers */,
+				A972A97221CED2730013AB25 /* text.h in Headers */,
+				A972AAC021CED2730013AB25 /* loop_fission.h in Headers */,
+				A972AA9821CED2730013AB25 /* freeze_spec_constant_value_pass.h in Headers */,
+				A972AAB621CED2730013AB25 /* constants.h in Headers */,
+				A972AA8221CED2730013AB25 /* decoration_manager.h in Headers */,
+				A972AA4621CED2730013AB25 /* ir_loader.h in Headers */,
+				A972A97C21CED2730013AB25 /* make_unique.h in Headers */,
+				A972AA0621CED2730013AB25 /* register_pressure.h in Headers */,
+				A972AB2E21CED2730013AB25 /* combine_access_chains.h in Headers */,
+				A972A98C21CED2730013AB25 /* hex_float.h in Headers */,
+				A972AB2C21CED2730013AB25 /* vector_dce.h in Headers */,
+				A972AA9C21CED2730013AB25 /* instrument_pass.h in Headers */,
+				A972AA1221CED2730013AB25 /* strip_debug_info_pass.h in Headers */,
+				A972AA5421CED2730013AB25 /* block_merge_pass.h in Headers */,
+				A972A9CE21CED2730013AB25 /* markv_logger.h in Headers */,
+				A972AA0A21CED2730013AB25 /* local_single_store_elim_pass.h in Headers */,
+				A972AA8A21CED2730013AB25 /* strength_reduction_pass.h in Headers */,
+				A972A9CA21CED2730013AB25 /* move_to_front.h in Headers */,
+				A972AB0621CED2730013AB25 /* scalar_replacement_pass.h in Headers */,
+				A972AAD821CED2730013AB25 /* pass.h in Headers */,
+				A972AB9621CED2730013AB25 /* validate.h in Headers */,
+				A972A9AA21CED2730013AB25 /* operand.h in Headers */,
+				A972AB6C21CED2730013AB25 /* binary.h in Headers */,
+				A972AB2021CED2730013AB25 /* loop_unswitch_pass.h in Headers */,
+				A972A99A21CED2730013AB25 /* latest_version_opencl_std_header.h in Headers */,
+				A972AB0421CED2730013AB25 /* const_folding_rules.h in Headers */,
+				A972AB4221CED2730013AB25 /* feature_manager.h in Headers */,
+				A972AB6621CED2730013AB25 /* latest_version_glsl_std_450_header.h in Headers */,
+				A972A9F221CED2730013AB25 /* if_conversion.h in Headers */,
+				A972AB6021CED2730013AB25 /* spirv_optimizer_options.h in Headers */,
+				A972A9F821CED2730013AB25 /* merge_return_pass.h in Headers */,
+				A972AB1821CED2730013AB25 /* loop_utils.h in Headers */,
+				A972AADA21CED2730013AB25 /* folding_rules.h in Headers */,
+				A972AB6221CED2730013AB25 /* opcode.h in Headers */,
+				A972ABB421CED2730013AB25 /* instruction.h in Headers */,
+				A972AB7E21CED2730013AB25 /* basic_block.h in Headers */,
+				A972AB4421CED2730013AB25 /* inst_bindless_check_pass.h in Headers */,
+				A972A9AE21CED2730013AB25 /* macro.h in Headers */,
+				A972A99E21CED2730013AB25 /* cfa.h in Headers */,
+				A972AA4821CED2730013AB25 /* types.h in Headers */,
+				A972AA2821CED2730013AB25 /* instruction_list.h in Headers */,
+				A972A9FA21CED2730013AB25 /* inline_opaque_pass.h in Headers */,
+				A972A9DA21CED2730013AB25 /* name_mapper.h in Headers */,
+				A972AA3C21CED2730013AB25 /* loop_unroller.h in Headers */,
+				A972A9C621CED2730013AB25 /* markv_model.h in Headers */,
+				A972A97A21CED2730013AB25 /* ilist_node.h in Headers */,
+				A972AA4E21CED2730013AB25 /* basic_block.h in Headers */,
+				A972AACE21CED2730013AB25 /* ssa_rewrite_pass.h in Headers */,
+				A972AAF021CED2730013AB25 /* passes.h in Headers */,
+				A972AAAC21CED2730013AB25 /* loop_dependence.h in Headers */,
+				A972A99221CED2730013AB25 /* ilist.h in Headers */,
+				A972AAC621CED2730013AB25 /* log.h in Headers */,
+				A972AB2421CED2730013AB25 /* loop_descriptor.h in Headers */,
+				A972A9C221CED2730013AB25 /* markv_decoder.h in Headers */,
+				A972AA7021CED2730013AB25 /* loop_peeling.h in Headers */,
+				A972AAC821CED2730013AB25 /* copy_prop_arrays.h in Headers */,
+				A972AB5C21CED2730013AB25 /* instruction.h in Headers */,
+				A972AB5E21CED2730013AB25 /* id_descriptor.h in Headers */,
+				A972A9D621CED2730013AB25 /* text_handler.h in Headers */,
+				A972AB3021CED2730013AB25 /* pass_manager.h in Headers */,
+				A972AACA21CED2730013AB25 /* eliminate_dead_constant_pass.h in Headers */,
+				A972A96C21CED2730013AB25 /* enum_set.h in Headers */,
+				A972AB1E21CED2730013AB25 /* ir_builder.h in Headers */,
+				A972AB6821CED2730013AB25 /* extensions.h in Headers */,
+				A972A9C021CED2730013AB25 /* markv_encoder.h in Headers */,
+				A972AA1C21CED2730013AB25 /* replace_invalid_opc.h in Headers */,
+				A972A9A221CED2730013AB25 /* enum_string_mapping.h in Headers */,
+				A972AB3821CED2730013AB25 /* licm_pass.h in Headers */,
+				A972A9CC21CED2730013AB25 /* markv_codec.h in Headers */,
+				A972A9BC21CED2730013AB25 /* bit_stream.h in Headers */,
+				A972AAB021CED2730013AB25 /* flatten_decoration_pass.h in Headers */,
+				A972AA1021CED2730013AB25 /* scalar_analysis.h in Headers */,
+				A972A98821CED2730013AB25 /* bit_vector.h in Headers */,
+				A972AAFA21CED2730013AB25 /* remove_duplicates_pass.h in Headers */,
+				A972A96A21CED2730013AB25 /* assembly_grammar.h in Headers */,
+				A972AAD621CED2730013AB25 /* dominator_analysis.h in Headers */,
+				A972AB0221CED2730013AB25 /* null_pass.h in Headers */,
+				A972A9DE21CED2730013AB25 /* diagnostic.h in Headers */,
+				A972AA0221CED2730013AB25 /* composite.h in Headers */,
+				A972A9EA21CED2730013AB25 /* print.h in Headers */,
+				A972AB2621CED2730013AB25 /* instruction.h in Headers */,
+				A972AA6021CED2730013AB25 /* private_to_local_pass.h in Headers */,
+				A972AB2221CED2730013AB25 /* cfg.h in Headers */,
+				A972AAD221CED2730013AB25 /* dead_variable_elimination.h in Headers */,
+				A972A98421CED2730013AB25 /* timer.h in Headers */,
+				A972AB2821CED2730013AB25 /* aggressive_dead_code_elim_pass.h in Headers */,
+				A972AA8621CED2730013AB25 /* local_single_block_elim_pass.h in Headers */,
+				A972AAE421CED2730013AB25 /* dead_branch_elim_pass.h in Headers */,
+				A972AA6E21CED2730013AB25 /* local_redundancy_elimination.h in Headers */,
+				A972AB4C21CED2730013AB25 /* type_manager.h in Headers */,
+				A972AADE21CED2730013AB25 /* common_uniform_elim_pass.h in Headers */,
+				A972AB0A21CED2730013AB25 /* pch_source_opt.h in Headers */,
+				A972A9E021CED2730013AB25 /* spirv_endian.h in Headers */,
+				A972AB3E21CED2730013AB25 /* function.h in Headers */,
+				A972ABC621CED2730013AB25 /* decoration.h in Headers */,
+				A972AB5821CED2730013AB25 /* latest_version_spirv_header.h in Headers */,
+				A972AB8C21CED2730013AB25 /* validation_state.h in Headers */,
+				A972A9B421CED2730013AB25 /* spirv_validator_options.h in Headers */,
+				A972AB3A21CED2730013AB25 /* build_module.h in Headers */,
+				A972AAF821CED2730013AB25 /* simplification_pass.h in Headers */,
+				A972AB3C21CED2730013AB25 /* ccp_pass.h in Headers */,
+				A972AAAE21CED2730013AB25 /* value_number_table.h in Headers */,
+				A972AAC221CED2730013AB25 /* workaround1209.h in Headers */,
+				A972AB1A21CED2730013AB25 /* module.h in Headers */,
+				A972AB5221CED2730013AB25 /* table.h in Headers */,
+				A972AA4421CED2730013AB25 /* unify_const_pass.h in Headers */,
+				A972A99421CED2730013AB25 /* spirv_target_env.h in Headers */,
+				A972AAFE21CED2730013AB25 /* reflect.h in Headers */,
+				A972AA6421CED2730013AB25 /* def_use_manager.h in Headers */,
+				A972AB1221CED2730013AB25 /* local_ssa_elim_pass.h in Headers */,
+				A972AAAA21CED2730013AB25 /* inline_pass.h in Headers */,
+				A972AAE821CED2730013AB25 /* scalar_analysis_nodes.h in Headers */,
+				A972A9A021CED2730013AB25 /* pch_source.h in Headers */,
+				A972AA7821CED2730013AB25 /* loop_fusion_pass.h in Headers */,
+				A972AA0421CED2730013AB25 /* compact_ids_pass.h in Headers */,
+				A972AA9E21CED2730013AB25 /* mem_pass.h in Headers */,
+				A972AA4A21CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.h in Headers */,
+				A972A9A821CED2730013AB25 /* spirv_definition.h in Headers */,
+				A972A9D821CED2730013AB25 /* parsed_operand.h in Headers */,
+				A972A98A21CED2730013AB25 /* bitutils.h in Headers */,
+				A972AAB421CED2730013AB25 /* inline_exhaustive_pass.h in Headers */,
+				A972AADC21CED2730013AB25 /* eliminate_dead_functions_pass.h in Headers */,
+				A972AAF421CED2730013AB25 /* strip_reflect_info_pass.h in Headers */,
+				A972AB4821CED2730013AB25 /* set_spec_constant_default_value_pass.h in Headers */,
+				A972A9FC21CED2730013AB25 /* loop_fusion.h in Headers */,
+				A972AB7621CED2730013AB25 /* construct.h in Headers */,
+				A972A97821CED2730013AB25 /* parse_number.h in Headers */,
+				A972AA0C21CED2730013AB25 /* reduce_load_size.h in Headers */,
+				A972AA3421CED2730013AB25 /* ir_context.h in Headers */,
+				A972AA7A21CED2730013AB25 /* struct_cfg_analysis.h in Headers */,
+				A972A98021CED2730013AB25 /* small_vector.h in Headers */,
+				A972AA9421CED2730013AB25 /* dead_insert_elim_pass.h in Headers */,
+				A972AB4A21CED2730013AB25 /* dominator_tree.h in Headers */,
+				A972A9B021CED2730013AB25 /* spirv_constant.h in Headers */,
+				A972AA6821CED2730013AB25 /* cfg_cleanup_pass.h in Headers */,
+				A972ABBE21CED2730013AB25 /* function.h in Headers */,
+				A972AA1E21CED2730013AB25 /* local_access_chain_convert_pass.h in Headers */,
+				A972A9C421CED2730013AB25 /* markv.h in Headers */,
+				A972A9BA21CED2730013AB25 /* huffman_codec.h in Headers */,
+				A972AA2621CED2730013AB25 /* propagator.h in Headers */,
+				A972AB3621CED2730013AB25 /* iterator.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972A81121CECBE90013AB25 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972A9EF21CED2730013AB25 /* disassemble.h in Headers */,
+				A972AAE121CED2730013AB25 /* fold.h in Headers */,
+				A972AB5521CED2730013AB25 /* ext_inst.h in Headers */,
+				A972A97F21CED2730013AB25 /* string_utils.h in Headers */,
+				A972AB0F21CED2730013AB25 /* redundancy_elimination.h in Headers */,
+				A972AA0921CED2730013AB25 /* tree_iterator.h in Headers */,
+				A972A97321CED2730013AB25 /* text.h in Headers */,
+				A972AAC121CED2730013AB25 /* loop_fission.h in Headers */,
+				A972AA9921CED2730013AB25 /* freeze_spec_constant_value_pass.h in Headers */,
+				A972AAB721CED2730013AB25 /* constants.h in Headers */,
+				A972AA8321CED2730013AB25 /* decoration_manager.h in Headers */,
+				A972AA4721CED2730013AB25 /* ir_loader.h in Headers */,
+				A972A97D21CED2730013AB25 /* make_unique.h in Headers */,
+				A972AA0721CED2730013AB25 /* register_pressure.h in Headers */,
+				A972AB2F21CED2730013AB25 /* combine_access_chains.h in Headers */,
+				A972A98D21CED2730013AB25 /* hex_float.h in Headers */,
+				A972AB2D21CED2730013AB25 /* vector_dce.h in Headers */,
+				A972AA9D21CED2730013AB25 /* instrument_pass.h in Headers */,
+				A972AA1321CED2730013AB25 /* strip_debug_info_pass.h in Headers */,
+				A972AA5521CED2730013AB25 /* block_merge_pass.h in Headers */,
+				A972A9CF21CED2730013AB25 /* markv_logger.h in Headers */,
+				A972AA0B21CED2730013AB25 /* local_single_store_elim_pass.h in Headers */,
+				A972AA8B21CED2730013AB25 /* strength_reduction_pass.h in Headers */,
+				A972A9CB21CED2730013AB25 /* move_to_front.h in Headers */,
+				A972AB0721CED2730013AB25 /* scalar_replacement_pass.h in Headers */,
+				A972AAD921CED2730013AB25 /* pass.h in Headers */,
+				A972AB9721CED2730013AB25 /* validate.h in Headers */,
+				A972A9AB21CED2730013AB25 /* operand.h in Headers */,
+				A972AB6D21CED2730013AB25 /* binary.h in Headers */,
+				A972AB2121CED2730013AB25 /* loop_unswitch_pass.h in Headers */,
+				A972A99B21CED2730013AB25 /* latest_version_opencl_std_header.h in Headers */,
+				A972AB0521CED2730013AB25 /* const_folding_rules.h in Headers */,
+				A972AB4321CED2730013AB25 /* feature_manager.h in Headers */,
+				A972AB6721CED2730013AB25 /* latest_version_glsl_std_450_header.h in Headers */,
+				A972A9F321CED2730013AB25 /* if_conversion.h in Headers */,
+				A972AB6121CED2730013AB25 /* spirv_optimizer_options.h in Headers */,
+				A972A9F921CED2730013AB25 /* merge_return_pass.h in Headers */,
+				A972AB1921CED2730013AB25 /* loop_utils.h in Headers */,
+				A972AADB21CED2730013AB25 /* folding_rules.h in Headers */,
+				A972AB6321CED2730013AB25 /* opcode.h in Headers */,
+				A972ABB521CED2730013AB25 /* instruction.h in Headers */,
+				A972AB7F21CED2730013AB25 /* basic_block.h in Headers */,
+				A972AB4521CED2730013AB25 /* inst_bindless_check_pass.h in Headers */,
+				A972A9AF21CED2730013AB25 /* macro.h in Headers */,
+				A972A99F21CED2730013AB25 /* cfa.h in Headers */,
+				A972AA4921CED2730013AB25 /* types.h in Headers */,
+				A972AA2921CED2730013AB25 /* instruction_list.h in Headers */,
+				A972A9FB21CED2730013AB25 /* inline_opaque_pass.h in Headers */,
+				A972A9DB21CED2730013AB25 /* name_mapper.h in Headers */,
+				A972AA3D21CED2730013AB25 /* loop_unroller.h in Headers */,
+				A972A9C721CED2730013AB25 /* markv_model.h in Headers */,
+				A972A97B21CED2730013AB25 /* ilist_node.h in Headers */,
+				A972AA4F21CED2730013AB25 /* basic_block.h in Headers */,
+				A972AACF21CED2730013AB25 /* ssa_rewrite_pass.h in Headers */,
+				A972AAF121CED2730013AB25 /* passes.h in Headers */,
+				A972AAAD21CED2730013AB25 /* loop_dependence.h in Headers */,
+				A972A99321CED2730013AB25 /* ilist.h in Headers */,
+				A972AAC721CED2730013AB25 /* log.h in Headers */,
+				A972AB2521CED2730013AB25 /* loop_descriptor.h in Headers */,
+				A972A9C321CED2730013AB25 /* markv_decoder.h in Headers */,
+				A972AA7121CED2730013AB25 /* loop_peeling.h in Headers */,
+				A972AAC921CED2730013AB25 /* copy_prop_arrays.h in Headers */,
+				A972AB5D21CED2730013AB25 /* instruction.h in Headers */,
+				A972AB5F21CED2730013AB25 /* id_descriptor.h in Headers */,
+				A972A9D721CED2730013AB25 /* text_handler.h in Headers */,
+				A972AB3121CED2730013AB25 /* pass_manager.h in Headers */,
+				A972AACB21CED2730013AB25 /* eliminate_dead_constant_pass.h in Headers */,
+				A972A96D21CED2730013AB25 /* enum_set.h in Headers */,
+				A972AB1F21CED2730013AB25 /* ir_builder.h in Headers */,
+				A972AB6921CED2730013AB25 /* extensions.h in Headers */,
+				A972A9C121CED2730013AB25 /* markv_encoder.h in Headers */,
+				A972AA1D21CED2730013AB25 /* replace_invalid_opc.h in Headers */,
+				A972A9A321CED2730013AB25 /* enum_string_mapping.h in Headers */,
+				A972AB3921CED2730013AB25 /* licm_pass.h in Headers */,
+				A972A9CD21CED2730013AB25 /* markv_codec.h in Headers */,
+				A972A9BD21CED2730013AB25 /* bit_stream.h in Headers */,
+				A972AAB121CED2730013AB25 /* flatten_decoration_pass.h in Headers */,
+				A972AA1121CED2730013AB25 /* scalar_analysis.h in Headers */,
+				A972A98921CED2730013AB25 /* bit_vector.h in Headers */,
+				A972AAFB21CED2730013AB25 /* remove_duplicates_pass.h in Headers */,
+				A972A96B21CED2730013AB25 /* assembly_grammar.h in Headers */,
+				A972AAD721CED2730013AB25 /* dominator_analysis.h in Headers */,
+				A972AB0321CED2730013AB25 /* null_pass.h in Headers */,
+				A972A9DF21CED2730013AB25 /* diagnostic.h in Headers */,
+				A972AA0321CED2730013AB25 /* composite.h in Headers */,
+				A972A9EB21CED2730013AB25 /* print.h in Headers */,
+				A972AB2721CED2730013AB25 /* instruction.h in Headers */,
+				A972AA6121CED2730013AB25 /* private_to_local_pass.h in Headers */,
+				A972AB2321CED2730013AB25 /* cfg.h in Headers */,
+				A972AAD321CED2730013AB25 /* dead_variable_elimination.h in Headers */,
+				A972A98521CED2730013AB25 /* timer.h in Headers */,
+				A972AB2921CED2730013AB25 /* aggressive_dead_code_elim_pass.h in Headers */,
+				A972AA8721CED2730013AB25 /* local_single_block_elim_pass.h in Headers */,
+				A972AAE521CED2730013AB25 /* dead_branch_elim_pass.h in Headers */,
+				A972AA6F21CED2730013AB25 /* local_redundancy_elimination.h in Headers */,
+				A972AB4D21CED2730013AB25 /* type_manager.h in Headers */,
+				A972AADF21CED2730013AB25 /* common_uniform_elim_pass.h in Headers */,
+				A972AB0B21CED2730013AB25 /* pch_source_opt.h in Headers */,
+				A972A9E121CED2730013AB25 /* spirv_endian.h in Headers */,
+				A972AB3F21CED2730013AB25 /* function.h in Headers */,
+				A972ABC721CED2730013AB25 /* decoration.h in Headers */,
+				A972AB5921CED2730013AB25 /* latest_version_spirv_header.h in Headers */,
+				A972AB8D21CED2730013AB25 /* validation_state.h in Headers */,
+				A972A9B521CED2730013AB25 /* spirv_validator_options.h in Headers */,
+				A972AB3B21CED2730013AB25 /* build_module.h in Headers */,
+				A972AAF921CED2730013AB25 /* simplification_pass.h in Headers */,
+				A972AB3D21CED2730013AB25 /* ccp_pass.h in Headers */,
+				A972AAAF21CED2730013AB25 /* value_number_table.h in Headers */,
+				A972AAC321CED2730013AB25 /* workaround1209.h in Headers */,
+				A972AB1B21CED2730013AB25 /* module.h in Headers */,
+				A972AB5321CED2730013AB25 /* table.h in Headers */,
+				A972AA4521CED2730013AB25 /* unify_const_pass.h in Headers */,
+				A972A99521CED2730013AB25 /* spirv_target_env.h in Headers */,
+				A972AAFF21CED2730013AB25 /* reflect.h in Headers */,
+				A972AA6521CED2730013AB25 /* def_use_manager.h in Headers */,
+				A972AB1321CED2730013AB25 /* local_ssa_elim_pass.h in Headers */,
+				A972AAAB21CED2730013AB25 /* inline_pass.h in Headers */,
+				A972AAE921CED2730013AB25 /* scalar_analysis_nodes.h in Headers */,
+				A972A9A121CED2730013AB25 /* pch_source.h in Headers */,
+				A972AA7921CED2730013AB25 /* loop_fusion_pass.h in Headers */,
+				A972AA0521CED2730013AB25 /* compact_ids_pass.h in Headers */,
+				A972AA9F21CED2730013AB25 /* mem_pass.h in Headers */,
+				A972AA4B21CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.h in Headers */,
+				A972A9A921CED2730013AB25 /* spirv_definition.h in Headers */,
+				A972A9D921CED2730013AB25 /* parsed_operand.h in Headers */,
+				A972A98B21CED2730013AB25 /* bitutils.h in Headers */,
+				A972AAB521CED2730013AB25 /* inline_exhaustive_pass.h in Headers */,
+				A972AADD21CED2730013AB25 /* eliminate_dead_functions_pass.h in Headers */,
+				A972AAF521CED2730013AB25 /* strip_reflect_info_pass.h in Headers */,
+				A972AB4921CED2730013AB25 /* set_spec_constant_default_value_pass.h in Headers */,
+				A972A9FD21CED2730013AB25 /* loop_fusion.h in Headers */,
+				A972AB7721CED2730013AB25 /* construct.h in Headers */,
+				A972A97921CED2730013AB25 /* parse_number.h in Headers */,
+				A972AA0D21CED2730013AB25 /* reduce_load_size.h in Headers */,
+				A972AA3521CED2730013AB25 /* ir_context.h in Headers */,
+				A972AA7B21CED2730013AB25 /* struct_cfg_analysis.h in Headers */,
+				A972A98121CED2730013AB25 /* small_vector.h in Headers */,
+				A972AA9521CED2730013AB25 /* dead_insert_elim_pass.h in Headers */,
+				A972AB4B21CED2730013AB25 /* dominator_tree.h in Headers */,
+				A972A9B121CED2730013AB25 /* spirv_constant.h in Headers */,
+				A972AA6921CED2730013AB25 /* cfg_cleanup_pass.h in Headers */,
+				A972ABBF21CED2730013AB25 /* function.h in Headers */,
+				A972AA1F21CED2730013AB25 /* local_access_chain_convert_pass.h in Headers */,
+				A972A9C521CED2730013AB25 /* markv.h in Headers */,
+				A972A9BB21CED2730013AB25 /* huffman_codec.h in Headers */,
+				A972AA2721CED2730013AB25 /* propagator.h in Headers */,
+				A972AB3721CED2730013AB25 /* iterator.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972ABCA21CED7BC0013AB25 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972ACB521CED9060013AB25 /* ConstantUnion.h in Headers */,
+				A972ACB121CED9060013AB25 /* arrays.h in Headers */,
+				A972AC6B21CED9060013AB25 /* SpvBuilder.h in Headers */,
+				A972AC7D21CED9060013AB25 /* GLSL.ext.EXT.h in Headers */,
+				A972ACBF21CED9060013AB25 /* gl_types.h in Headers */,
+				A972ACDB21CED9060013AB25 /* Versions.h in Headers */,
+				A972AC9D21CED9060013AB25 /* osinclude.h in Headers */,
+				A972AD0921CED9060013AB25 /* PpTokens.h in Headers */,
+				A972AC7521CED9060013AB25 /* GLSL.ext.AMD.h in Headers */,
+				A972AC8921CED9060013AB25 /* disassemble.h in Headers */,
+				A972ACCF21CED9060013AB25 /* RemoveTree.h in Headers */,
+				A972ABCB21CED7BC0013AB25 /* spirv_cfg.hpp in Headers */,
+				A972ACB921CED9060013AB25 /* PoolAlloc.h in Headers */,
+				A972AC6F21CED9060013AB25 /* SpvTools.h in Headers */,
+				A972ACAF21CED9060013AB25 /* ShHandle.h in Headers */,
+				A972ACF321CED9060013AB25 /* LiveTraverser.h in Headers */,
+				A972AC9521CED9060013AB25 /* Logger.h in Headers */,
+				A972AD1921CED9060013AB25 /* Scan.h in Headers */,
+				A972ABCC21CED7BC0013AB25 /* spirv_cross_parsed_ir.hpp in Headers */,
+				A972ACAD21CED9060013AB25 /* InitializeGlobals.h in Headers */,
+				A972ACB721CED9060013AB25 /* InfoSink.h in Headers */,
+				A972ACA521CED9060013AB25 /* Types.h in Headers */,
+				A972AC7921CED9060013AB25 /* spirv.hpp in Headers */,
+				A972ABCD21CED7BC0013AB25 /* spirv_common.hpp in Headers */,
+				A972ACC921CED9060013AB25 /* localintermediate.h in Headers */,
+				A972ACE721CED9060013AB25 /* SymbolTable.h in Headers */,
+				A972AC7F21CED9060013AB25 /* GLSL.ext.KHR.h in Headers */,
+				A972ACBD21CED9060013AB25 /* parseVersions.h in Headers */,
+				A972ACF521CED9060013AB25 /* Initialize.h in Headers */,
+				A972AC8121CED9060013AB25 /* GLSL.ext.NV.h in Headers */,
+				A972AC6521CED9060013AB25 /* InitializeDll.h in Headers */,
+				A972ACC721CED9060013AB25 /* iomapper.h in Headers */,
+				A972AC8B21CED9060013AB25 /* GlslangToSpv.h in Headers */,
+				A972ACD921CED9060013AB25 /* propagateNoContraction.h in Headers */,
+				A972AC6921CED9060013AB25 /* SPVRemapper.h in Headers */,
+				A972ABCE21CED7BC0013AB25 /* spirv_glsl.hpp in Headers */,
+				A972ACC521CED9060013AB25 /* ScanContext.h in Headers */,
+				A972AC7721CED9060013AB25 /* doc.h in Headers */,
+				A972AD1B21CED9060013AB25 /* ShaderLang.h in Headers */,
+				A972ACAB21CED9060013AB25 /* revision.h in Headers */,
+				A972AC8D21CED9060013AB25 /* GLSL.std.450.h in Headers */,
+				A972ACA921CED9060013AB25 /* BaseTypes.h in Headers */,
+				A972ACB321CED9060013AB25 /* Common.h in Headers */,
+				A972ACF121CED9060013AB25 /* glslang_tab.cpp.h in Headers */,
+				A972ABCF21CED7BC0013AB25 /* spirv_parser.hpp in Headers */,
+				A972AC8521CED9060013AB25 /* spvIR.h in Headers */,
+				A972AC9321CED9060013AB25 /* hex_float.h in Headers */,
+				A972ACA721CED9060013AB25 /* intermediate.h in Headers */,
+				A972ACA321CED9060013AB25 /* ResourceLimits.h in Headers */,
+				A972AD0521CED9060013AB25 /* ParseHelper.h in Headers */,
+				A972ABD021CED7BC0013AB25 /* spirv_cross.hpp in Headers */,
+				A972ABD121CED7BC0013AB25 /* spirv_msl.hpp in Headers */,
+				A972AD0D21CED9060013AB25 /* PpContext.h in Headers */,
+				A972ACC321CED9060013AB25 /* pch.h in Headers */,
+				A972AC8721CED9060013AB25 /* bitutils.h in Headers */,
+				A972AD1721CED9060013AB25 /* reflection.h in Headers */,
+				A972ACFD21CED9060013AB25 /* attribute.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972ABDE21CED7CB0013AB25 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972ACB621CED9060013AB25 /* ConstantUnion.h in Headers */,
+				A972ACB221CED9060013AB25 /* arrays.h in Headers */,
+				A972AC6C21CED9060013AB25 /* SpvBuilder.h in Headers */,
+				A972AC7E21CED9060013AB25 /* GLSL.ext.EXT.h in Headers */,
+				A972ACC021CED9060013AB25 /* gl_types.h in Headers */,
+				A972ACDC21CED9060013AB25 /* Versions.h in Headers */,
+				A972AC9E21CED9060013AB25 /* osinclude.h in Headers */,
+				A972AD0A21CED9060013AB25 /* PpTokens.h in Headers */,
+				A972AC7621CED9060013AB25 /* GLSL.ext.AMD.h in Headers */,
+				A972AC8A21CED9060013AB25 /* disassemble.h in Headers */,
+				A972ACD021CED9060013AB25 /* RemoveTree.h in Headers */,
+				A972ABDF21CED7CB0013AB25 /* spirv_cfg.hpp in Headers */,
+				A972ACBA21CED9060013AB25 /* PoolAlloc.h in Headers */,
+				A972AC7021CED9060013AB25 /* SpvTools.h in Headers */,
+				A972ACB021CED9060013AB25 /* ShHandle.h in Headers */,
+				A972ACF421CED9060013AB25 /* LiveTraverser.h in Headers */,
+				A972AC9621CED9060013AB25 /* Logger.h in Headers */,
+				A972AD1A21CED9060013AB25 /* Scan.h in Headers */,
+				A972ABE021CED7CB0013AB25 /* spirv_cross_parsed_ir.hpp in Headers */,
+				A972ACAE21CED9060013AB25 /* InitializeGlobals.h in Headers */,
+				A972ACB821CED9060013AB25 /* InfoSink.h in Headers */,
+				A972ACA621CED9060013AB25 /* Types.h in Headers */,
+				A972AC7A21CED9060013AB25 /* spirv.hpp in Headers */,
+				A972ABE121CED7CB0013AB25 /* spirv_common.hpp in Headers */,
+				A972ACCA21CED9060013AB25 /* localintermediate.h in Headers */,
+				A972ACE821CED9060013AB25 /* SymbolTable.h in Headers */,
+				A972AC8021CED9060013AB25 /* GLSL.ext.KHR.h in Headers */,
+				A972ACBE21CED9060013AB25 /* parseVersions.h in Headers */,
+				A972ACF621CED9060013AB25 /* Initialize.h in Headers */,
+				A972AC8221CED9060013AB25 /* GLSL.ext.NV.h in Headers */,
+				A972AC6621CED9060013AB25 /* InitializeDll.h in Headers */,
+				A972ACC821CED9060013AB25 /* iomapper.h in Headers */,
+				A972AC8C21CED9060013AB25 /* GlslangToSpv.h in Headers */,
+				A972ACDA21CED9060013AB25 /* propagateNoContraction.h in Headers */,
+				A972AC6A21CED9060013AB25 /* SPVRemapper.h in Headers */,
+				A972ABE221CED7CB0013AB25 /* spirv_glsl.hpp in Headers */,
+				A972ACC621CED9060013AB25 /* ScanContext.h in Headers */,
+				A972AC7821CED9060013AB25 /* doc.h in Headers */,
+				A972AD1C21CED9060013AB25 /* ShaderLang.h in Headers */,
+				A972ACAC21CED9060013AB25 /* revision.h in Headers */,
+				A972AC8E21CED9060013AB25 /* GLSL.std.450.h in Headers */,
+				A972ACAA21CED9060013AB25 /* BaseTypes.h in Headers */,
+				A972ACB421CED9060013AB25 /* Common.h in Headers */,
+				A972ACF221CED9060013AB25 /* glslang_tab.cpp.h in Headers */,
+				A972ABE321CED7CB0013AB25 /* spirv_parser.hpp in Headers */,
+				A972AC8621CED9060013AB25 /* spvIR.h in Headers */,
+				A972AC9421CED9060013AB25 /* hex_float.h in Headers */,
+				A972ACA821CED9060013AB25 /* intermediate.h in Headers */,
+				A972ACA421CED9060013AB25 /* ResourceLimits.h in Headers */,
+				A972AD0621CED9060013AB25 /* ParseHelper.h in Headers */,
+				A972ABE421CED7CB0013AB25 /* spirv_cross.hpp in Headers */,
+				A972ABE521CED7CB0013AB25 /* spirv_msl.hpp in Headers */,
+				A972AD0E21CED9060013AB25 /* PpContext.h in Headers */,
+				A972ACC421CED9060013AB25 /* pch.h in Headers */,
+				A972AC8821CED9060013AB25 /* bitutils.h in Headers */,
+				A972AD1821CED9060013AB25 /* reflection.h in Headers */,
+				A972ACFE21CED9060013AB25 /* attribute.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A97628FF21CC608900B52A68 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A976291E21CC60BC00B52A68 /* spirv_cfg.hpp in Headers */,
+				A976291C21CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp in Headers */,
+				A976291A21CC60BC00B52A68 /* spirv_common.hpp in Headers */,
+				A976292021CC60BC00B52A68 /* spirv_glsl.hpp in Headers */,
+				A976292421CC60BC00B52A68 /* spirv_parser.hpp in Headers */,
+				A976291221CC60BC00B52A68 /* spirv_cross.hpp in Headers */,
+				A976291021CC60BC00B52A68 /* spirv_msl.hpp in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A976290021CC608E00B52A68 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A976291D21CC60BC00B52A68 /* spirv_cfg.hpp in Headers */,
+				A976291B21CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp in Headers */,
+				A976291921CC60BC00B52A68 /* spirv_common.hpp in Headers */,
+				A976291F21CC60BC00B52A68 /* spirv_glsl.hpp in Headers */,
+				A976292321CC60BC00B52A68 /* spirv_parser.hpp in Headers */,
+				A976291121CC60BC00B52A68 /* spirv_cross.hpp in Headers */,
+				A976290F21CC60BC00B52A68 /* spirv_msl.hpp in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		A90FD75B21CC4EAB00B92BB2 /* SPIRV-Cross-iOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A90FD89C21CC4EAB00B92BB2 /* Build configuration list for PBXNativeTarget "SPIRV-Cross-iOS" */;
+			buildPhases = (
+				A976290021CC608E00B52A68 /* Headers */,
+				A976290121CC609100B52A68 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "SPIRV-Cross-iOS";
+			productName = "SPIRV-Cross-iOS";
+			productReference = A90FD89F21CC4EAB00B92BB2 /* libSPIRVCross.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		A90FD8A021CC4EB900B92BB2 /* SPIRV-Cross-macOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A90FD9E121CC4EB900B92BB2 /* Build configuration list for PBXNativeTarget "SPIRV-Cross-macOS" */;
+			buildPhases = (
+				A97628FF21CC608900B52A68 /* Headers */,
+				A97628FE21CC608400B52A68 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "SPIRV-Cross-macOS";
+			productName = "SPIRV-Cross-macOS";
+			productReference = A90FD9E421CC4EB900B92BB2 /* libSPIRVCross.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		A972A7FC21CECBBF0013AB25 /* SPIRV-Tools-iOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A972A80C21CECBBF0013AB25 /* Build configuration list for PBXNativeTarget "SPIRV-Tools-iOS" */;
+			buildPhases = (
+				A972A7FD21CECBBF0013AB25 /* Headers */,
+				A972A80521CECBBF0013AB25 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "SPIRV-Tools-iOS";
+			productName = "SPIRV-Cross-iOS";
+			productReference = A972A80F21CECBBF0013AB25 /* libSPIRVTools.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		A972A81021CECBE90013AB25 /* SPIRV-Tools-macOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A972A82021CECBE90013AB25 /* Build configuration list for PBXNativeTarget "SPIRV-Tools-macOS" */;
+			buildPhases = (
+				A972A81121CECBE90013AB25 /* Headers */,
+				A972A81921CECBE90013AB25 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "SPIRV-Tools-macOS";
+			productName = "SPIRV-Cross-macOS";
+			productReference = A972A82321CECBE90013AB25 /* libSPIRVTools.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		A972ABC921CED7BC0013AB25 /* glslang-iOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A972ABD921CED7BC0013AB25 /* Build configuration list for PBXNativeTarget "glslang-iOS" */;
+			buildPhases = (
+				A972ABCA21CED7BC0013AB25 /* Headers */,
+				A972ABD221CED7BC0013AB25 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "glslang-iOS";
+			productName = "SPIRV-Cross-iOS";
+			productReference = A972ABDC21CED7BC0013AB25 /* libglslang.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		A972ABDD21CED7CB0013AB25 /* glslang-macOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A972ABED21CED7CB0013AB25 /* Build configuration list for PBXNativeTarget "glslang-macOS" */;
+			buildPhases = (
+				A972ABDE21CED7CB0013AB25 /* Headers */,
+				A972ABE621CED7CB0013AB25 /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "glslang-macOS";
+			productName = "SPIRV-Cross-macOS";
+			productReference = A972ABF021CED7CB0013AB25 /* libglslang.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		A9F55D25198BE6A7004EC31B /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1010;
+				ORGANIZATIONNAME = "The Brenwill Workshop Ltd.";
+				TargetAttributes = {
+					A972A7E421CEC72F0013AB25 = {
+						CreatedOnToolsVersion = 10.1;
+						ProvisioningStyle = Automatic;
+					};
+					A972A7EA21CEC8030013AB25 = {
+						ProvisioningStyle = Automatic;
+					};
+					A972A7F221CEC81B0013AB25 = {
+						ProvisioningStyle = Automatic;
+					};
+				};
+			};
+			buildConfigurationList = A9F55D28198BE6A7004EC31B /* Build configuration list for PBXProject "ExternalDependencies" */;
+			compatibilityVersion = "Xcode 8.0";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = A9F55D24198BE6A7004EC31B;
+			productRefGroup = A9F55D24198BE6A7004EC31B;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				A972A7F221CEC81B0013AB25 /* ExternalDependencies */,
+				A972A7EA21CEC8030013AB25 /* ExternalDependencies-iOS */,
+				A972A7E421CEC72F0013AB25 /* ExternalDependencies-macOS */,
+				A90FD75B21CC4EAB00B92BB2 /* SPIRV-Cross-iOS */,
+				A90FD8A021CC4EB900B92BB2 /* SPIRV-Cross-macOS */,
+				A972A7FC21CECBBF0013AB25 /* SPIRV-Tools-iOS */,
+				A972A81021CECBE90013AB25 /* SPIRV-Tools-macOS */,
+				A972ABC921CED7BC0013AB25 /* glslang-iOS */,
+				A972ABDD21CED7CB0013AB25 /* glslang-macOS */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		A9679AAF21D26C1400856BF7 /* Package External Libraries */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Package External Libraries";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${SRCROOT}/Scripts/package_ext_libs_ios.sh\"\n";
+		};
+		A9679AB021D26C7000856BF7 /* Package External Libraries */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Package External Libraries";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${SRCROOT}/Scripts/package_ext_libs_macos.sh\"\n";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		A972A80521CECBBF0013AB25 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972AB8421CED2730013AB25 /* validate_debug.cpp in Sources */,
+				A972AA4C21CED2730013AB25 /* mem_pass.cpp in Sources */,
+				A972AB4621CED2730013AB25 /* scalar_analysis_simplification.cpp in Sources */,
+				A972AA1621CED2730013AB25 /* decoration_manager.cpp in Sources */,
+				A972AA3E21CED2730013AB25 /* strip_debug_info_pass.cpp in Sources */,
+				A972AA6221CED2730013AB25 /* inline_pass.cpp in Sources */,
+				A972ABC021CED2730013AB25 /* validate_composites.cpp in Sources */,
+				A972AA5621CED2730013AB25 /* module.cpp in Sources */,
+				A972AA2A21CED2730013AB25 /* feature_manager.cpp in Sources */,
+				A972AB1021CED2730013AB25 /* value_number_table.cpp in Sources */,
+				A972AA7421CED2730013AB25 /* loop_unroller.cpp in Sources */,
+				A972AA1421CED2730013AB25 /* cfg.cpp in Sources */,
+				A972A9D221CED2730013AB25 /* markv_encoder.cpp in Sources */,
+				A972AA8E21CED2730013AB25 /* simplification_pass.cpp in Sources */,
+				A972AB2A21CED2730013AB25 /* struct_cfg_analysis.cpp in Sources */,
+				A972A9FE21CED2730013AB25 /* combine_access_chains.cpp in Sources */,
+				A972AB9A21CED2730013AB25 /* validate_conversion.cpp in Sources */,
+				A972A9F421CED2730013AB25 /* register_pressure.cpp in Sources */,
+				A972AA4021CED2730013AB25 /* ssa_rewrite_pass.cpp in Sources */,
+				A972AA9A21CED2730013AB25 /* ir_context.cpp in Sources */,
+				A972AAC421CED2730013AB25 /* loop_fusion_pass.cpp in Sources */,
+				A972AAD421CED2730013AB25 /* block_merge_pass.cpp in Sources */,
+				A972AB4E21CED2730013AB25 /* compact_ids_pass.cpp in Sources */,
+				A972AB8621CED2730013AB25 /* validate_builtins.cpp in Sources */,
+				A972ABC221CED2730013AB25 /* validation_state.cpp in Sources */,
+				A972AAB221CED2730013AB25 /* if_conversion.cpp in Sources */,
+				A972AA2421CED2730013AB25 /* instrument_pass.cpp in Sources */,
+				A972ABAA21CED2730013AB25 /* validate_image.cpp in Sources */,
+				A972ABA021CED2730013AB25 /* validate_arithmetics.cpp in Sources */,
+				A972AB0821CED2730013AB25 /* instruction.cpp in Sources */,
+				A972A9B221CED2730013AB25 /* binary.cpp in Sources */,
+				A972AB9C21CED2730013AB25 /* validate_datarules.cpp in Sources */,
+				A972AAE621CED2730013AB25 /* private_to_local_pass.cpp in Sources */,
+				A972AA5A21CED2730013AB25 /* loop_unswitch_pass.cpp in Sources */,
+				A972AB7C21CED2730013AB25 /* validate_atomics.cpp in Sources */,
+				A972A96E21CED2730013AB25 /* text.cpp in Sources */,
+				A972A99C21CED2730013AB25 /* spirv_optimizer_options.cpp in Sources */,
+				A972AAD021CED2730013AB25 /* scalar_analysis.cpp in Sources */,
+				A972A9E621CED2730013AB25 /* software_version.cpp in Sources */,
+				A972AAA221CED2730013AB25 /* local_ssa_elim_pass.cpp in Sources */,
+				A972AA2021CED2730013AB25 /* inst_bindless_check_pass.cpp in Sources */,
+				A972A9D421CED2730013AB25 /* enum_string_mapping.cpp in Sources */,
+				A972AB3421CED2730013AB25 /* basic_block.cpp in Sources */,
+				A972AA8C21CED2730013AB25 /* aggressive_dead_code_elim_pass.cpp in Sources */,
+				A972AB0021CED2730013AB25 /* workaround1209.cpp in Sources */,
+				A972AB1621CED2730013AB25 /* replace_invalid_opc.cpp in Sources */,
+				A972AB1421CED2730013AB25 /* inline_opaque_pass.cpp in Sources */,
+				A972A97621CED2730013AB25 /* pch_source.cpp in Sources */,
+				A972AA3821CED2730013AB25 /* cfg_cleanup_pass.cpp in Sources */,
+				A972AA5C21CED2730013AB25 /* unify_const_pass.cpp in Sources */,
+				A972AA6621CED2730013AB25 /* ir_loader.cpp in Sources */,
+				A972AA5021CED2730013AB25 /* remove_duplicates_pass.cpp in Sources */,
+				A972AA7C21CED2730013AB25 /* common_uniform_elim_pass.cpp in Sources */,
+				A972AABE21CED2730013AB25 /* inline_exhaustive_pass.cpp in Sources */,
+				A972A9C821CED2730013AB25 /* markv_decoder.cpp in Sources */,
+				A972AA7221CED2730013AB25 /* vector_dce.cpp in Sources */,
+				A972AB1C21CED2730013AB25 /* dominator_analysis.cpp in Sources */,
+				A972A9F621CED2730013AB25 /* loop_utils.cpp in Sources */,
+				A972AABC21CED2730013AB25 /* pass_manager.cpp in Sources */,
+				A972A99821CED2730013AB25 /* id_descriptor.cpp in Sources */,
+				A972A99621CED2730013AB25 /* table.cpp in Sources */,
+				A972AAA421CED2730013AB25 /* function.cpp in Sources */,
+				A972A9AC21CED2730013AB25 /* spirv_endian.cpp in Sources */,
+				A972AA5821CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
+				A972AA8421CED2730013AB25 /* ccp_pass.cpp in Sources */,
+				A972A9EC21CED2730013AB25 /* ext_inst.cpp in Sources */,
+				A972AAE221CED2730013AB25 /* local_single_store_elim_pass.cpp in Sources */,
+				A972AA5221CED2730013AB25 /* dead_variable_elimination.cpp in Sources */,
+				A972AB3221CED2730013AB25 /* local_access_chain_convert_pass.cpp in Sources */,
+				A972A96821CED2730013AB25 /* spirv_target_env.cpp in Sources */,
+				A972AA0021CED2730013AB25 /* build_module.cpp in Sources */,
+				A972A98621CED2730013AB25 /* string_utils.cpp in Sources */,
+				A972A9B821CED2730013AB25 /* markv.cpp in Sources */,
+				A972AB5621CED2730013AB25 /* diagnostic.cpp in Sources */,
+				A972AB9E21CED2730013AB25 /* validate_id.cpp in Sources */,
+				A972AACC21CED2730013AB25 /* dead_insert_elim_pass.cpp in Sources */,
+				A972ABAE21CED2730013AB25 /* instruction.cpp in Sources */,
+				A972AB6A21CED2730013AB25 /* disassemble.cpp in Sources */,
+				A972AA2C21CED2730013AB25 /* pass.cpp in Sources */,
+				A972ABC421CED2730013AB25 /* validate_primitives.cpp in Sources */,
+				A972ABA221CED2730013AB25 /* validate_mode_setting.cpp in Sources */,
+				A972AA2221CED2730013AB25 /* local_redundancy_elimination.cpp in Sources */,
+				A972AAF221CED2730013AB25 /* fold.cpp in Sources */,
+				A972AA3621CED2730013AB25 /* eliminate_dead_constant_pass.cpp in Sources */,
+				A972AA8021CED2730013AB25 /* strip_reflect_info_pass.cpp in Sources */,
+				A972AA2E21CED2730013AB25 /* loop_fission.cpp in Sources */,
+				A972ABA421CED2730013AB25 /* validate_logicals.cpp in Sources */,
+				A972AB0C21CED2730013AB25 /* reduce_load_size.cpp in Sources */,
+				A972AB8021CED2730013AB25 /* validate_instruction.cpp in Sources */,
+				A972AB9821CED2730013AB25 /* validate_adjacency.cpp in Sources */,
+				A972ABB621CED2730013AB25 /* validate_execution_limitations.cpp in Sources */,
+				A972AB9221CED2730013AB25 /* construct.cpp in Sources */,
+				A972AA3A21CED2730013AB25 /* const_folding_rules.cpp in Sources */,
+				A972AB8221CED2730013AB25 /* validate_decorations.cpp in Sources */,
+				A972A9F021CED2730013AB25 /* optimizer.cpp in Sources */,
+				A972ABAC21CED2730013AB25 /* validate_literals.cpp in Sources */,
+				A972AA6C21CED2730013AB25 /* eliminate_dead_functions_pass.cpp in Sources */,
+				A972AAEA21CED2730013AB25 /* propagator.cpp in Sources */,
+				A972A9A621CED2730013AB25 /* print.cpp in Sources */,
+				A972ABB221CED2730013AB25 /* validate_ext_inst.cpp in Sources */,
+				A972AB7421CED2730013AB25 /* validate_capability.cpp in Sources */,
+				A972AA9621CED2730013AB25 /* folding_rules.cpp in Sources */,
+				A972AB7821CED2730013AB25 /* validate_barriers.cpp in Sources */,
+				A972AA3021CED2730013AB25 /* dominator_tree.cpp in Sources */,
+				A972AB7021CED2730013AB25 /* validate_annotation.cpp in Sources */,
+				A972A9E421CED2730013AB25 /* linker.cpp in Sources */,
+				A972AA9021CED2730013AB25 /* dead_branch_elim_pass.cpp in Sources */,
+				A972AB8E21CED2730013AB25 /* validate_constants.cpp in Sources */,
+				A972AA1A21CED2730013AB25 /* freeze_spec_constant_value_pass.cpp in Sources */,
+				A972ABBA21CED2730013AB25 /* basic_block.cpp in Sources */,
+				A972AA9221CED2730013AB25 /* flatten_decoration_pass.cpp in Sources */,
+				A972A98E21CED2730013AB25 /* parse_number.cpp in Sources */,
+				A972A9BE21CED2730013AB25 /* move_to_front.cpp in Sources */,
+				A972ABA621CED2730013AB25 /* validate_derivatives.cpp in Sources */,
+				A972AB5A21CED2730013AB25 /* libspirv.cpp in Sources */,
+				A972AB6421CED2730013AB25 /* operand.cpp in Sources */,
+				A972AA7621CED2730013AB25 /* constants.cpp in Sources */,
+				A972AB5021CED2730013AB25 /* loop_peeling.cpp in Sources */,
+				A972ABA821CED2730013AB25 /* validate_memory.cpp in Sources */,
+				A972AA1821CED2730013AB25 /* local_single_block_elim_pass.cpp in Sources */,
+				A972AAF621CED2730013AB25 /* scalar_replacement_pass.cpp in Sources */,
+				A972A97021CED2730013AB25 /* assembly_grammar.cpp in Sources */,
+				A972AAA821CED2730013AB25 /* composite.cpp in Sources */,
+				A972A99021CED2730013AB25 /* bit_vector.cpp in Sources */,
+				A972ABB021CED2730013AB25 /* validate_type.cpp in Sources */,
+				A972AB9021CED2730013AB25 /* validate_bitwise.cpp in Sources */,
+				A972AB9421CED2730013AB25 /* function.cpp in Sources */,
+				A972AAEC21CED2730013AB25 /* loop_dependence_helpers.cpp in Sources */,
+				A972AB7A21CED2730013AB25 /* validate_non_uniform.cpp in Sources */,
+				A972AA5E21CED2730013AB25 /* type_manager.cpp in Sources */,
+				A972A9DC21CED2730013AB25 /* parsed_operand.cpp in Sources */,
+				A972A9E821CED2730013AB25 /* opcode.cpp in Sources */,
+				A972A97421CED2730013AB25 /* extensions.cpp in Sources */,
+				A972AA0E21CED2730013AB25 /* types.cpp in Sources */,
+				A972AA8821CED2730013AB25 /* pch_source_opt.cpp in Sources */,
+				A972AA3221CED2730013AB25 /* merge_return_pass.cpp in Sources */,
+				A972AA6A21CED2730013AB25 /* licm_pass.cpp in Sources */,
+				A972AAA621CED2730013AB25 /* instruction_list.cpp in Sources */,
+				A972AB8A21CED2730013AB25 /* validate.cpp in Sources */,
+				A972A9E221CED2730013AB25 /* name_mapper.cpp in Sources */,
+				A972AAEE21CED2730013AB25 /* set_spec_constant_default_value_pass.cpp in Sources */,
+				A972AABA21CED2730013AB25 /* copy_prop_arrays.cpp in Sources */,
+				A972AA4221CED2730013AB25 /* loop_dependence.cpp in Sources */,
+				A972A98221CED2730013AB25 /* timer.cpp in Sources */,
+				A972A9B621CED2730013AB25 /* markv_codec.cpp in Sources */,
+				A972AAA021CED2730013AB25 /* loop_descriptor.cpp in Sources */,
+				A972AB8821CED2730013AB25 /* validate_interfaces.cpp in Sources */,
+				A972AAFC21CED2730013AB25 /* redundancy_elimination.cpp in Sources */,
+				A972A9A421CED2730013AB25 /* spirv_validator_options.cpp in Sources */,
+				A972AB6E21CED2730013AB25 /* text_handler.cpp in Sources */,
+				A972AAB821CED2730013AB25 /* strength_reduction_pass.cpp in Sources */,
+				A972ABB821CED2730013AB25 /* validate_layout.cpp in Sources */,
+				A972AB4021CED2730013AB25 /* loop_fusion.cpp in Sources */,
+				A972A9D021CED2730013AB25 /* bit_stream.cpp in Sources */,
+				A972AB7221CED2730013AB25 /* validate_cfg.cpp in Sources */,
+				A972AA7E21CED2730013AB25 /* def_use_manager.cpp in Sources */,
+				A972ABBC21CED2730013AB25 /* validate_function.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972A81921CECBE90013AB25 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972AB8521CED2730013AB25 /* validate_debug.cpp in Sources */,
+				A972AA4D21CED2730013AB25 /* mem_pass.cpp in Sources */,
+				A972AB4721CED2730013AB25 /* scalar_analysis_simplification.cpp in Sources */,
+				A972AA1721CED2730013AB25 /* decoration_manager.cpp in Sources */,
+				A972AA3F21CED2730013AB25 /* strip_debug_info_pass.cpp in Sources */,
+				A972AA6321CED2730013AB25 /* inline_pass.cpp in Sources */,
+				A972ABC121CED2730013AB25 /* validate_composites.cpp in Sources */,
+				A972AA5721CED2730013AB25 /* module.cpp in Sources */,
+				A972AA2B21CED2730013AB25 /* feature_manager.cpp in Sources */,
+				A972AB1121CED2730013AB25 /* value_number_table.cpp in Sources */,
+				A972AA7521CED2730013AB25 /* loop_unroller.cpp in Sources */,
+				A972AA1521CED2730013AB25 /* cfg.cpp in Sources */,
+				A972A9D321CED2730013AB25 /* markv_encoder.cpp in Sources */,
+				A972AA8F21CED2730013AB25 /* simplification_pass.cpp in Sources */,
+				A972AB2B21CED2730013AB25 /* struct_cfg_analysis.cpp in Sources */,
+				A972A9FF21CED2730013AB25 /* combine_access_chains.cpp in Sources */,
+				A972AB9B21CED2730013AB25 /* validate_conversion.cpp in Sources */,
+				A972A9F521CED2730013AB25 /* register_pressure.cpp in Sources */,
+				A972AA4121CED2730013AB25 /* ssa_rewrite_pass.cpp in Sources */,
+				A972AA9B21CED2730013AB25 /* ir_context.cpp in Sources */,
+				A972AAC521CED2730013AB25 /* loop_fusion_pass.cpp in Sources */,
+				A972AAD521CED2730013AB25 /* block_merge_pass.cpp in Sources */,
+				A972AB4F21CED2730013AB25 /* compact_ids_pass.cpp in Sources */,
+				A972AB8721CED2730013AB25 /* validate_builtins.cpp in Sources */,
+				A972ABC321CED2730013AB25 /* validation_state.cpp in Sources */,
+				A972AAB321CED2730013AB25 /* if_conversion.cpp in Sources */,
+				A972AA2521CED2730013AB25 /* instrument_pass.cpp in Sources */,
+				A972ABAB21CED2730013AB25 /* validate_image.cpp in Sources */,
+				A972ABA121CED2730013AB25 /* validate_arithmetics.cpp in Sources */,
+				A972AB0921CED2730013AB25 /* instruction.cpp in Sources */,
+				A972A9B321CED2730013AB25 /* binary.cpp in Sources */,
+				A972AB9D21CED2730013AB25 /* validate_datarules.cpp in Sources */,
+				A972AAE721CED2730013AB25 /* private_to_local_pass.cpp in Sources */,
+				A972AA5B21CED2730013AB25 /* loop_unswitch_pass.cpp in Sources */,
+				A972AB7D21CED2730013AB25 /* validate_atomics.cpp in Sources */,
+				A972A96F21CED2730013AB25 /* text.cpp in Sources */,
+				A972A99D21CED2730013AB25 /* spirv_optimizer_options.cpp in Sources */,
+				A972AAD121CED2730013AB25 /* scalar_analysis.cpp in Sources */,
+				A972A9E721CED2730013AB25 /* software_version.cpp in Sources */,
+				A972AAA321CED2730013AB25 /* local_ssa_elim_pass.cpp in Sources */,
+				A972AA2121CED2730013AB25 /* inst_bindless_check_pass.cpp in Sources */,
+				A972A9D521CED2730013AB25 /* enum_string_mapping.cpp in Sources */,
+				A972AB3521CED2730013AB25 /* basic_block.cpp in Sources */,
+				A972AA8D21CED2730013AB25 /* aggressive_dead_code_elim_pass.cpp in Sources */,
+				A972AB0121CED2730013AB25 /* workaround1209.cpp in Sources */,
+				A972AB1721CED2730013AB25 /* replace_invalid_opc.cpp in Sources */,
+				A972AB1521CED2730013AB25 /* inline_opaque_pass.cpp in Sources */,
+				A972A97721CED2730013AB25 /* pch_source.cpp in Sources */,
+				A972AA3921CED2730013AB25 /* cfg_cleanup_pass.cpp in Sources */,
+				A972AA5D21CED2730013AB25 /* unify_const_pass.cpp in Sources */,
+				A972AA6721CED2730013AB25 /* ir_loader.cpp in Sources */,
+				A972AA5121CED2730013AB25 /* remove_duplicates_pass.cpp in Sources */,
+				A972AA7D21CED2730013AB25 /* common_uniform_elim_pass.cpp in Sources */,
+				A972AABF21CED2730013AB25 /* inline_exhaustive_pass.cpp in Sources */,
+				A972A9C921CED2730013AB25 /* markv_decoder.cpp in Sources */,
+				A972AA7321CED2730013AB25 /* vector_dce.cpp in Sources */,
+				A972AB1D21CED2730013AB25 /* dominator_analysis.cpp in Sources */,
+				A972A9F721CED2730013AB25 /* loop_utils.cpp in Sources */,
+				A972AABD21CED2730013AB25 /* pass_manager.cpp in Sources */,
+				A972A99921CED2730013AB25 /* id_descriptor.cpp in Sources */,
+				A972A99721CED2730013AB25 /* table.cpp in Sources */,
+				A972AAA521CED2730013AB25 /* function.cpp in Sources */,
+				A972A9AD21CED2730013AB25 /* spirv_endian.cpp in Sources */,
+				A972AA5921CED2730013AB25 /* fold_spec_constant_op_and_composite_pass.cpp in Sources */,
+				A972AA8521CED2730013AB25 /* ccp_pass.cpp in Sources */,
+				A972A9ED21CED2730013AB25 /* ext_inst.cpp in Sources */,
+				A972AAE321CED2730013AB25 /* local_single_store_elim_pass.cpp in Sources */,
+				A972AA5321CED2730013AB25 /* dead_variable_elimination.cpp in Sources */,
+				A972AB3321CED2730013AB25 /* local_access_chain_convert_pass.cpp in Sources */,
+				A972A96921CED2730013AB25 /* spirv_target_env.cpp in Sources */,
+				A972AA0121CED2730013AB25 /* build_module.cpp in Sources */,
+				A972A98721CED2730013AB25 /* string_utils.cpp in Sources */,
+				A972A9B921CED2730013AB25 /* markv.cpp in Sources */,
+				A972AB5721CED2730013AB25 /* diagnostic.cpp in Sources */,
+				A972AB9F21CED2730013AB25 /* validate_id.cpp in Sources */,
+				A972AACD21CED2730013AB25 /* dead_insert_elim_pass.cpp in Sources */,
+				A972ABAF21CED2730013AB25 /* instruction.cpp in Sources */,
+				A972AB6B21CED2730013AB25 /* disassemble.cpp in Sources */,
+				A972AA2D21CED2730013AB25 /* pass.cpp in Sources */,
+				A972ABC521CED2730013AB25 /* validate_primitives.cpp in Sources */,
+				A972ABA321CED2730013AB25 /* validate_mode_setting.cpp in Sources */,
+				A972AA2321CED2730013AB25 /* local_redundancy_elimination.cpp in Sources */,
+				A972AAF321CED2730013AB25 /* fold.cpp in Sources */,
+				A972AA3721CED2730013AB25 /* eliminate_dead_constant_pass.cpp in Sources */,
+				A972AA8121CED2730013AB25 /* strip_reflect_info_pass.cpp in Sources */,
+				A972AA2F21CED2730013AB25 /* loop_fission.cpp in Sources */,
+				A972ABA521CED2730013AB25 /* validate_logicals.cpp in Sources */,
+				A972AB0D21CED2730013AB25 /* reduce_load_size.cpp in Sources */,
+				A972AB8121CED2730013AB25 /* validate_instruction.cpp in Sources */,
+				A972AB9921CED2730013AB25 /* validate_adjacency.cpp in Sources */,
+				A972ABB721CED2730013AB25 /* validate_execution_limitations.cpp in Sources */,
+				A972AB9321CED2730013AB25 /* construct.cpp in Sources */,
+				A972AA3B21CED2730013AB25 /* const_folding_rules.cpp in Sources */,
+				A972AB8321CED2730013AB25 /* validate_decorations.cpp in Sources */,
+				A972A9F121CED2730013AB25 /* optimizer.cpp in Sources */,
+				A972ABAD21CED2730013AB25 /* validate_literals.cpp in Sources */,
+				A972AA6D21CED2730013AB25 /* eliminate_dead_functions_pass.cpp in Sources */,
+				A972AAEB21CED2730013AB25 /* propagator.cpp in Sources */,
+				A972A9A721CED2730013AB25 /* print.cpp in Sources */,
+				A972ABB321CED2730013AB25 /* validate_ext_inst.cpp in Sources */,
+				A972AB7521CED2730013AB25 /* validate_capability.cpp in Sources */,
+				A972AA9721CED2730013AB25 /* folding_rules.cpp in Sources */,
+				A972AB7921CED2730013AB25 /* validate_barriers.cpp in Sources */,
+				A972AA3121CED2730013AB25 /* dominator_tree.cpp in Sources */,
+				A972AB7121CED2730013AB25 /* validate_annotation.cpp in Sources */,
+				A972A9E521CED2730013AB25 /* linker.cpp in Sources */,
+				A972AA9121CED2730013AB25 /* dead_branch_elim_pass.cpp in Sources */,
+				A972AB8F21CED2730013AB25 /* validate_constants.cpp in Sources */,
+				A972AA1B21CED2730013AB25 /* freeze_spec_constant_value_pass.cpp in Sources */,
+				A972ABBB21CED2730013AB25 /* basic_block.cpp in Sources */,
+				A972AA9321CED2730013AB25 /* flatten_decoration_pass.cpp in Sources */,
+				A972A98F21CED2730013AB25 /* parse_number.cpp in Sources */,
+				A972A9BF21CED2730013AB25 /* move_to_front.cpp in Sources */,
+				A972ABA721CED2730013AB25 /* validate_derivatives.cpp in Sources */,
+				A972AB5B21CED2730013AB25 /* libspirv.cpp in Sources */,
+				A972AB6521CED2730013AB25 /* operand.cpp in Sources */,
+				A972AA7721CED2730013AB25 /* constants.cpp in Sources */,
+				A972AB5121CED2730013AB25 /* loop_peeling.cpp in Sources */,
+				A972ABA921CED2730013AB25 /* validate_memory.cpp in Sources */,
+				A972AA1921CED2730013AB25 /* local_single_block_elim_pass.cpp in Sources */,
+				A972AAF721CED2730013AB25 /* scalar_replacement_pass.cpp in Sources */,
+				A972A97121CED2730013AB25 /* assembly_grammar.cpp in Sources */,
+				A972AAA921CED2730013AB25 /* composite.cpp in Sources */,
+				A972A99121CED2730013AB25 /* bit_vector.cpp in Sources */,
+				A972ABB121CED2730013AB25 /* validate_type.cpp in Sources */,
+				A972AB9121CED2730013AB25 /* validate_bitwise.cpp in Sources */,
+				A972AB9521CED2730013AB25 /* function.cpp in Sources */,
+				A972AAED21CED2730013AB25 /* loop_dependence_helpers.cpp in Sources */,
+				A972AB7B21CED2730013AB25 /* validate_non_uniform.cpp in Sources */,
+				A972AA5F21CED2730013AB25 /* type_manager.cpp in Sources */,
+				A972A9DD21CED2730013AB25 /* parsed_operand.cpp in Sources */,
+				A972A9E921CED2730013AB25 /* opcode.cpp in Sources */,
+				A972A97521CED2730013AB25 /* extensions.cpp in Sources */,
+				A972AA0F21CED2730013AB25 /* types.cpp in Sources */,
+				A972AA8921CED2730013AB25 /* pch_source_opt.cpp in Sources */,
+				A972AA3321CED2730013AB25 /* merge_return_pass.cpp in Sources */,
+				A972AA6B21CED2730013AB25 /* licm_pass.cpp in Sources */,
+				A972AAA721CED2730013AB25 /* instruction_list.cpp in Sources */,
+				A972AB8B21CED2730013AB25 /* validate.cpp in Sources */,
+				A972A9E321CED2730013AB25 /* name_mapper.cpp in Sources */,
+				A972AAEF21CED2730013AB25 /* set_spec_constant_default_value_pass.cpp in Sources */,
+				A972AABB21CED2730013AB25 /* copy_prop_arrays.cpp in Sources */,
+				A972AA4321CED2730013AB25 /* loop_dependence.cpp in Sources */,
+				A972A98321CED2730013AB25 /* timer.cpp in Sources */,
+				A972A9B721CED2730013AB25 /* markv_codec.cpp in Sources */,
+				A972AAA121CED2730013AB25 /* loop_descriptor.cpp in Sources */,
+				A972AB8921CED2730013AB25 /* validate_interfaces.cpp in Sources */,
+				A972AAFD21CED2730013AB25 /* redundancy_elimination.cpp in Sources */,
+				A972A9A521CED2730013AB25 /* spirv_validator_options.cpp in Sources */,
+				A972AB6F21CED2730013AB25 /* text_handler.cpp in Sources */,
+				A972AAB921CED2730013AB25 /* strength_reduction_pass.cpp in Sources */,
+				A972ABB921CED2730013AB25 /* validate_layout.cpp in Sources */,
+				A972AB4121CED2730013AB25 /* loop_fusion.cpp in Sources */,
+				A972A9D121CED2730013AB25 /* bit_stream.cpp in Sources */,
+				A972AB7321CED2730013AB25 /* validate_cfg.cpp in Sources */,
+				A972AA7F21CED2730013AB25 /* def_use_manager.cpp in Sources */,
+				A972ABBD21CED2730013AB25 /* validate_function.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972ABD221CED7BC0013AB25 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972AC8F21CED9060013AB25 /* SPVRemapper.cpp in Sources */,
+				A972AC9121CED9060013AB25 /* Logger.cpp in Sources */,
+				A972ACD721CED9060013AB25 /* parseConst.cpp in Sources */,
+				A972ACE121CED9060013AB25 /* iomapper.cpp in Sources */,
+				A972ABD321CED7BC0013AB25 /* spirv_msl.cpp in Sources */,
+				A972ACD321CED9060013AB25 /* glslang_tab.cpp in Sources */,
+				A972AC9B21CED9060013AB25 /* ossource.cpp in Sources */,
+				A972AC6D21CED9060013AB25 /* SpvPostProcess.cpp in Sources */,
+				A972AD1F21CED9060013AB25 /* Link.cpp in Sources */,
+				A972AD0721CED9060013AB25 /* PpAtom.cpp in Sources */,
+				A972ACF721CED9060013AB25 /* attribute.cpp in Sources */,
+				A972ABD421CED7BC0013AB25 /* spirv_parser.cpp in Sources */,
+				A972ACED21CED9060013AB25 /* pch.cpp in Sources */,
+				A972AC6721CED9060013AB25 /* InitializeDll.cpp in Sources */,
+				A972ACD521CED9060013AB25 /* limits.cpp in Sources */,
+				A972AD0B21CED9060013AB25 /* Pp.cpp in Sources */,
+				A972AD1521CED9060013AB25 /* ParseContextBase.cpp in Sources */,
+				A972ACFF21CED9060013AB25 /* Versions.cpp in Sources */,
+				A972ACF921CED9060013AB25 /* reflection.cpp in Sources */,
+				A972AC7B21CED9060013AB25 /* SpvBuilder.cpp in Sources */,
+				A972ACFB21CED9060013AB25 /* RemoveTree.cpp in Sources */,
+				A972ACEF21CED9060013AB25 /* SymbolTable.cpp in Sources */,
+				A972AC7121CED9060013AB25 /* SpvTools.cpp in Sources */,
+				A972ACEB21CED9060013AB25 /* Intermediate.cpp in Sources */,
+				A972ABD521CED7BC0013AB25 /* spirv_cfg.cpp in Sources */,
+				A972ACCB21CED9060013AB25 /* Scan.cpp in Sources */,
+				A972AD1121CED9060013AB25 /* PpContext.cpp in Sources */,
+				A972AC9721CED9060013AB25 /* doc.cpp in Sources */,
+				A972ACBB21CED9060013AB25 /* ParseHelper.cpp in Sources */,
+				A972ACC121CED9060013AB25 /* propagateNoContraction.cpp in Sources */,
+				A972ABD621CED7BC0013AB25 /* spirv_cross.cpp in Sources */,
+				A972AD0F21CED9060013AB25 /* PpTokens.cpp in Sources */,
+				A972AD1321CED9060013AB25 /* PpScanner.cpp in Sources */,
+				A972ABD721CED7BC0013AB25 /* spirv_glsl.cpp in Sources */,
+				A972ACD121CED9060013AB25 /* Initialize.cpp in Sources */,
+				A972ACDD21CED9060013AB25 /* IntermTraverse.cpp in Sources */,
+				A972ACE521CED9060013AB25 /* ShaderLang.cpp in Sources */,
+				A972AC9921CED9060013AB25 /* disassemble.cpp in Sources */,
+				A972AD0121CED9060013AB25 /* Constant.cpp in Sources */,
+				A972AC8321CED9060013AB25 /* GlslangToSpv.cpp in Sources */,
+				A972ACDF21CED9060013AB25 /* intermOut.cpp in Sources */,
+				A972ABD821CED7BC0013AB25 /* spirv_cross_parsed_ir.cpp in Sources */,
+				A972AD0321CED9060013AB25 /* linkValidate.cpp in Sources */,
+				A972ACE921CED9060013AB25 /* InfoSink.cpp in Sources */,
+				A972AD1D21CED9060013AB25 /* CodeGen.cpp in Sources */,
+				A972AC7321CED9060013AB25 /* InReadableOrder.cpp in Sources */,
+				A972ACE321CED9060013AB25 /* PoolAlloc.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A972ABE621CED7CB0013AB25 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A972AC9021CED9060013AB25 /* SPVRemapper.cpp in Sources */,
+				A972AC9221CED9060013AB25 /* Logger.cpp in Sources */,
+				A972ACD821CED9060013AB25 /* parseConst.cpp in Sources */,
+				A972ACE221CED9060013AB25 /* iomapper.cpp in Sources */,
+				A972ABE721CED7CB0013AB25 /* spirv_msl.cpp in Sources */,
+				A972ACD421CED9060013AB25 /* glslang_tab.cpp in Sources */,
+				A972AC9C21CED9060013AB25 /* ossource.cpp in Sources */,
+				A972AC6E21CED9060013AB25 /* SpvPostProcess.cpp in Sources */,
+				A972AD2021CED9060013AB25 /* Link.cpp in Sources */,
+				A972AD0821CED9060013AB25 /* PpAtom.cpp in Sources */,
+				A972ACF821CED9060013AB25 /* attribute.cpp in Sources */,
+				A972ABE821CED7CB0013AB25 /* spirv_parser.cpp in Sources */,
+				A972ACEE21CED9060013AB25 /* pch.cpp in Sources */,
+				A972AC6821CED9060013AB25 /* InitializeDll.cpp in Sources */,
+				A972ACD621CED9060013AB25 /* limits.cpp in Sources */,
+				A972AD0C21CED9060013AB25 /* Pp.cpp in Sources */,
+				A972AD1621CED9060013AB25 /* ParseContextBase.cpp in Sources */,
+				A972AD0021CED9060013AB25 /* Versions.cpp in Sources */,
+				A972ACFA21CED9060013AB25 /* reflection.cpp in Sources */,
+				A972AC7C21CED9060013AB25 /* SpvBuilder.cpp in Sources */,
+				A972ACFC21CED9060013AB25 /* RemoveTree.cpp in Sources */,
+				A972ACF021CED9060013AB25 /* SymbolTable.cpp in Sources */,
+				A972AC7221CED9060013AB25 /* SpvTools.cpp in Sources */,
+				A972ACEC21CED9060013AB25 /* Intermediate.cpp in Sources */,
+				A972ABE921CED7CB0013AB25 /* spirv_cfg.cpp in Sources */,
+				A972ACCC21CED9060013AB25 /* Scan.cpp in Sources */,
+				A972AD1221CED9060013AB25 /* PpContext.cpp in Sources */,
+				A972AC9821CED9060013AB25 /* doc.cpp in Sources */,
+				A972ACBC21CED9060013AB25 /* ParseHelper.cpp in Sources */,
+				A972ACC221CED9060013AB25 /* propagateNoContraction.cpp in Sources */,
+				A972ABEA21CED7CB0013AB25 /* spirv_cross.cpp in Sources */,
+				A972AD1021CED9060013AB25 /* PpTokens.cpp in Sources */,
+				A972AD1421CED9060013AB25 /* PpScanner.cpp in Sources */,
+				A972ABEB21CED7CB0013AB25 /* spirv_glsl.cpp in Sources */,
+				A972ACD221CED9060013AB25 /* Initialize.cpp in Sources */,
+				A972ACDE21CED9060013AB25 /* IntermTraverse.cpp in Sources */,
+				A972ACE621CED9060013AB25 /* ShaderLang.cpp in Sources */,
+				A972AC9A21CED9060013AB25 /* disassemble.cpp in Sources */,
+				A972AD0221CED9060013AB25 /* Constant.cpp in Sources */,
+				A972AC8421CED9060013AB25 /* GlslangToSpv.cpp in Sources */,
+				A972ACE021CED9060013AB25 /* intermOut.cpp in Sources */,
+				A972ABEC21CED7CB0013AB25 /* spirv_cross_parsed_ir.cpp in Sources */,
+				A972AD0421CED9060013AB25 /* linkValidate.cpp in Sources */,
+				A972ACEA21CED9060013AB25 /* InfoSink.cpp in Sources */,
+				A972AD1E21CED9060013AB25 /* CodeGen.cpp in Sources */,
+				A972AC7421CED9060013AB25 /* InReadableOrder.cpp in Sources */,
+				A972ACE421CED9060013AB25 /* PoolAlloc.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A97628FE21CC608400B52A68 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A976292621CC60BC00B52A68 /* spirv_msl.cpp in Sources */,
+				A976291421CC60BC00B52A68 /* spirv_parser.cpp in Sources */,
+				A976292221CC60BC00B52A68 /* spirv_cfg.cpp in Sources */,
+				A976291621CC60BC00B52A68 /* spirv_cross.cpp in Sources */,
+				A976291821CC60BC00B52A68 /* spirv_glsl.cpp in Sources */,
+				A976292821CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A976290121CC609100B52A68 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				A976292521CC60BC00B52A68 /* spirv_msl.cpp in Sources */,
+				A976291321CC60BC00B52A68 /* spirv_parser.cpp in Sources */,
+				A976292121CC60BC00B52A68 /* spirv_cfg.cpp in Sources */,
+				A976291521CC60BC00B52A68 /* spirv_cross.cpp in Sources */,
+				A976291721CC60BC00B52A68 /* spirv_glsl.cpp in Sources */,
+				A976292721CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		A972A7E921CEC76A0013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A90FD8A021CC4EB900B92BB2 /* SPIRV-Cross-macOS */;
+			targetProxy = A972A7E821CEC76A0013AB25 /* PBXContainerItemProxy */;
+		};
+		A972A7F121CEC8140013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A90FD75B21CC4EAB00B92BB2 /* SPIRV-Cross-iOS */;
+			targetProxy = A972A7F021CEC8140013AB25 /* PBXContainerItemProxy */;
+		};
+		A972A7F921CEC8500013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972A7E421CEC72F0013AB25 /* ExternalDependencies-macOS */;
+			targetProxy = A972A7F821CEC8500013AB25 /* PBXContainerItemProxy */;
+		};
+		A972A7FB21CEC8540013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972A7EA21CEC8030013AB25 /* ExternalDependencies-iOS */;
+			targetProxy = A972A7FA21CEC8540013AB25 /* PBXContainerItemProxy */;
+		};
+		A972A82621CECD6B0013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972A7FC21CECBBF0013AB25 /* SPIRV-Tools-iOS */;
+			targetProxy = A972A82521CECD6B0013AB25 /* PBXContainerItemProxy */;
+		};
+		A972A82821CECD780013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972A81021CECBE90013AB25 /* SPIRV-Tools-macOS */;
+			targetProxy = A972A82721CECD780013AB25 /* PBXContainerItemProxy */;
+		};
+		A972ABF221CED8BA0013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972ABC921CED7BC0013AB25 /* glslang-iOS */;
+			targetProxy = A972ABF121CED8BA0013AB25 /* PBXContainerItemProxy */;
+		};
+		A972ABF421CED8C20013AB25 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = A972ABDD21CED7CB0013AB25 /* glslang-macOS */;
+			targetProxy = A972ABF321CED8C20013AB25 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		A90FD89D21CC4EAB00B92BB2 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"SPIRV_CROSS_FLT_FMT=\\\"%.6g\\\"",
+				);
+				PRODUCT_NAME = SPIRVCross;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Debug;
+		};
+		A90FD89E21CC4EAB00B92BB2 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"SPIRV_CROSS_FLT_FMT=\\\"%.6g\\\"",
+				);
+				PRODUCT_NAME = SPIRVCross;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Release;
+		};
+		A90FD9E221CC4EB900B92BB2 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"SPIRV_CROSS_FLT_FMT=\\\"%.6g\\\"",
+				);
+				PRODUCT_NAME = SPIRVCross;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		A90FD9E321CC4EB900B92BB2 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"SPIRV_CROSS_FLT_FMT=\\\"%.6g\\\"",
+				);
+				PRODUCT_NAME = SPIRVCross;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		A972A7E521CEC72F0013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		A972A7E621CEC72F0013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+		A972A7EE21CEC8030013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		A972A7EF21CEC8030013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+		A972A7F621CEC81B0013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		A972A7F721CEC81B0013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+		A972A80D21CECBBF0013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/external/spirv-headers/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/build\"",
+				);
+				PRODUCT_NAME = SPIRVTools;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Debug;
+		};
+		A972A80E21CECBBF0013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/external/spirv-headers/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/build\"",
+				);
+				PRODUCT_NAME = SPIRVTools;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Release;
+		};
+		A972A82121CECBE90013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/external/spirv-headers/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/build\"",
+				);
+				PRODUCT_NAME = SPIRVTools;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		A972A82221CECBE90013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/external/spirv-headers/include\"",
+					"\"$(SRCROOT)/External/glslang/External/spirv-tools/build\"",
+				);
+				PRODUCT_NAME = SPIRVTools;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		A972ABDA21CED7BC0013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
+				GCC_WARN_UNUSED_PARAMETER = NO;
+				PRODUCT_NAME = glslang;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Debug;
+		};
+		A972ABDB21CED7BC0013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = arm64;
+				BITCODE_GENERATION_MODE = bitcode;
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
+				GCC_WARN_UNUSED_PARAMETER = NO;
+				PRODUCT_NAME = glslang;
+				SDKROOT = iphoneos;
+				VALID_ARCHS = arm64;
+			};
+			name = Release;
+		};
+		A972ABEE21CED7CB0013AB25 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
+				GCC_WARN_UNUSED_PARAMETER = NO;
+				PRODUCT_NAME = glslang;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		A972ABEF21CED7CB0013AB25 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
+				GCC_WARN_UNUSED_PARAMETER = NO;
+				PRODUCT_NAME = glslang;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		A9F55D3F198BE6A8004EC31B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = NO;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_CXX0X_EXTENSIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_PARAMETER = YES;
+				GCC_WARN_UNUSED_VARIABLE = NO;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				MACH_O_TYPE = staticlib;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				ONLY_ACTIVE_ARCH = YES;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		A9F55D40198BE6A8004EC31B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = NO;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_CXX0X_EXTENSIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = fast;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_PARAMETER = YES;
+				GCC_WARN_UNUSED_VARIABLE = NO;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				MACH_O_TYPE = staticlib;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		A90FD89C21CC4EAB00B92BB2 /* Build configuration list for PBXNativeTarget "SPIRV-Cross-iOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A90FD89D21CC4EAB00B92BB2 /* Debug */,
+				A90FD89E21CC4EAB00B92BB2 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A90FD9E121CC4EB900B92BB2 /* Build configuration list for PBXNativeTarget "SPIRV-Cross-macOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A90FD9E221CC4EB900B92BB2 /* Debug */,
+				A90FD9E321CC4EB900B92BB2 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972A7E721CEC72F0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-macOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972A7E521CEC72F0013AB25 /* Debug */,
+				A972A7E621CEC72F0013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972A7ED21CEC8030013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-iOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972A7EE21CEC8030013AB25 /* Debug */,
+				A972A7EF21CEC8030013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972A7F521CEC81B0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972A7F621CEC81B0013AB25 /* Debug */,
+				A972A7F721CEC81B0013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972A80C21CECBBF0013AB25 /* Build configuration list for PBXNativeTarget "SPIRV-Tools-iOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972A80D21CECBBF0013AB25 /* Debug */,
+				A972A80E21CECBBF0013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972A82021CECBE90013AB25 /* Build configuration list for PBXNativeTarget "SPIRV-Tools-macOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972A82121CECBE90013AB25 /* Debug */,
+				A972A82221CECBE90013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972ABD921CED7BC0013AB25 /* Build configuration list for PBXNativeTarget "glslang-iOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972ABDA21CED7BC0013AB25 /* Debug */,
+				A972ABDB21CED7BC0013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A972ABED21CED7CB0013AB25 /* Build configuration list for PBXNativeTarget "glslang-macOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A972ABEE21CED7CB0013AB25 /* Debug */,
+				A972ABEF21CED7CB0013AB25 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A9F55D28198BE6A7004EC31B /* Build configuration list for PBXProject "ExternalDependencies" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				A9F55D3F198BE6A8004EC31B /* Debug */,
+				A9F55D40198BE6A8004EC31B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = A9F55D25198BE6A7004EC31B /* Project object */;
+}
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-iOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-iOS.xcscheme
new file mode 100644
index 0000000..fe5c470
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-iOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972A7EA21CEC8030013AB25"
+               BuildableName = "ExternalDependencies-iOS"
+               BlueprintName = "ExternalDependencies-iOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7EA21CEC8030013AB25"
+            BuildableName = "ExternalDependencies-iOS"
+            BlueprintName = "ExternalDependencies-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7EA21CEC8030013AB25"
+            BuildableName = "ExternalDependencies-iOS"
+            BlueprintName = "ExternalDependencies-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-macOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-macOS.xcscheme
new file mode 100644
index 0000000..50f0306
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies-macOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972A7E421CEC72F0013AB25"
+               BuildableName = "ExternalDependencies-macOS"
+               BlueprintName = "ExternalDependencies-macOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7E421CEC72F0013AB25"
+            BuildableName = "ExternalDependencies-macOS"
+            BlueprintName = "ExternalDependencies-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7E421CEC72F0013AB25"
+            BuildableName = "ExternalDependencies-macOS"
+            BlueprintName = "ExternalDependencies-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies.xcscheme
new file mode 100644
index 0000000..d43f92f
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/ExternalDependencies.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972A7F221CEC81B0013AB25"
+               BuildableName = "ExternalDependencies"
+               BlueprintName = "ExternalDependencies"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7F221CEC81B0013AB25"
+            BuildableName = "ExternalDependencies"
+            BlueprintName = "ExternalDependencies"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7F221CEC81B0013AB25"
+            BuildableName = "ExternalDependencies"
+            BlueprintName = "ExternalDependencies"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-iOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-iOS.xcscheme
new file mode 100644
index 0000000..63689e9
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-iOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A90FD75B21CC4EAB00B92BB2"
+               BuildableName = "libSPIRVCross.a"
+               BlueprintName = "SPIRV-Cross-iOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A90FD75B21CC4EAB00B92BB2"
+            BuildableName = "libSPIRVCross.a"
+            BlueprintName = "SPIRV-Cross-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A90FD75B21CC4EAB00B92BB2"
+            BuildableName = "libSPIRVCross.a"
+            BlueprintName = "SPIRV-Cross-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-macOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-macOS.xcscheme
new file mode 100644
index 0000000..692618d
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Cross-macOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A90FD8A021CC4EB900B92BB2"
+               BuildableName = "libSPIRVCross.a"
+               BlueprintName = "SPIRV-Cross-macOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A90FD8A021CC4EB900B92BB2"
+            BuildableName = "libSPIRVCross.a"
+            BlueprintName = "SPIRV-Cross-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A90FD8A021CC4EB900B92BB2"
+            BuildableName = "libSPIRVCross.a"
+            BlueprintName = "SPIRV-Cross-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-iOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-iOS.xcscheme
new file mode 100644
index 0000000..abb7df8
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-iOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972A7FC21CECBBF0013AB25"
+               BuildableName = "libSPIRVTools.a"
+               BlueprintName = "SPIRV-Tools-iOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7FC21CECBBF0013AB25"
+            BuildableName = "libSPIRVTools.a"
+            BlueprintName = "SPIRV-Tools-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A7FC21CECBBF0013AB25"
+            BuildableName = "libSPIRVTools.a"
+            BlueprintName = "SPIRV-Tools-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-macOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-macOS.xcscheme
new file mode 100644
index 0000000..9c6f758
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/SPIRV-Tools-macOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972A81021CECBE90013AB25"
+               BuildableName = "libSPIRVTools.a"
+               BlueprintName = "SPIRV-Tools-macOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A81021CECBE90013AB25"
+            BuildableName = "libSPIRVTools.a"
+            BlueprintName = "SPIRV-Tools-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972A81021CECBE90013AB25"
+            BuildableName = "libSPIRVTools.a"
+            BlueprintName = "SPIRV-Tools-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-iOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-iOS.xcscheme
new file mode 100644
index 0000000..42ee640
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-iOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972ABC921CED7BC0013AB25"
+               BuildableName = "libglslang.a"
+               BlueprintName = "glslang-iOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972ABC921CED7BC0013AB25"
+            BuildableName = "libglslang.a"
+            BlueprintName = "glslang-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972ABC921CED7BC0013AB25"
+            BuildableName = "libglslang.a"
+            BlueprintName = "glslang-iOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-macOS.xcscheme b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-macOS.xcscheme
new file mode 100644
index 0000000..3507b94
--- /dev/null
+++ b/ExternalDependencies.xcodeproj/xcshareddata/xcschemes/glslang-macOS.xcscheme
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1010"
+   version = "2.0">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A972ABDD21CED7CB0013AB25"
+               BuildableName = "libglslang.a"
+               BlueprintName = "glslang-macOS"
+               ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
+      debugServiceExtension = "internal"
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972ABDD21CED7CB0013AB25"
+            BuildableName = "libglslang.a"
+            BlueprintName = "glslang-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A972ABDD21CED7CB0013AB25"
+            BuildableName = "libglslang.a"
+            BlueprintName = "glslang-macOS"
+            ReferencedContainer = "container:ExternalDependencies.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/MoltenVK/MoltenVK/API/mvk_datatypes.h b/MoltenVK/MoltenVK/API/mvk_datatypes.h
index c43aa94..7ae86bd 100644
--- a/MoltenVK/MoltenVK/API/mvk_datatypes.h
+++ b/MoltenVK/MoltenVK/API/mvk_datatypes.h
@@ -1,7 +1,7 @@
 /*
  * mvk_datatypes.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -204,6 +204,9 @@
 /** Returns whether the specified Metal MTLPixelFormat can be used as a stencil format. */
 bool mvkMTLPixelFormatIsStencilFormat(MTLPixelFormat mtlFormat);
 
+/** Returns whether the specified Metal MTLPixelFormat is a PVRTC format. */
+bool mvkMTLPixelFormatIsPVRTCFormat(MTLPixelFormat mtlFormat);
+
 /** Returns the Metal texture type from the specified Vulkan image properties. */
 MTLTextureType mvkMTLTextureTypeFromVkImageType(VkImageType vkImageType,
 												uint32_t arraySize,
diff --git a/MoltenVK/MoltenVK/API/mvk_vulkan.h b/MoltenVK/MoltenVK/API/mvk_vulkan.h
index 44d1780..a5158cc 100644
--- a/MoltenVK/MoltenVK/API/mvk_vulkan.h
+++ b/MoltenVK/MoltenVK/API/mvk_vulkan.h
@@ -1,7 +1,7 @@
 /*
  * mvk_vulkan.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
index 47aad9a..5a3eb17 100644
--- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
+++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
@@ -1,7 +1,7 @@
 /*
  * vk_mvk_moltenvk.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -48,55 +48,82 @@
  */
 #define MVK_VERSION_MAJOR   1
 #define MVK_VERSION_MINOR   0
-#define MVK_VERSION_PATCH   29
+#define MVK_VERSION_PATCH   31
 
 #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)
 
-
-#define VK_MVK_MOLTENVK_SPEC_VERSION            14
+#define VK_MVK_MOLTENVK_SPEC_VERSION            16
 #define VK_MVK_MOLTENVK_EXTENSION_NAME          "VK_MVK_moltenvk"
 
 /**
  * MoltenVK configuration settings.
  *
- * To change the MoltenVK configuration settings, use the vkGetMoltenVKConfigurationMVK() and
- * vkSetMoltenVKConfigurationMVK() functions to retrieve, modify, and set a copy of this structure.
- *
  * To be active, some configuration settings must be set before a VkDevice is created.
  * See the description of the individual configuration structure members for more information.
  *
- * The initial value of several of these settings is deterined when MolttenVK is compiled by the
- * presence of a DEBUG build setting, By default the DEBUG build setting is present when MoltenVK
- * is compiled in Debug mode, and not present when compiled in Release mode. The initial values
- * of the other settings are determined by other build settings when MoltenVK is compiled.
- * See the description of the individual configuration structure members for more information.
+ * There are three mechanisms for setting the values of the MoltenVK configuration parameters:
+ *   - Runtime API via the vkGetMoltenVKConfigurationMVK()/vkSetMoltenVKConfigurationMVK() functions.
+ *   - Application runtime environment variables.
+ *   - Build settings at MoltenVK build time.
+ *
+ * To change the MoltenVK configuration settings at runtime using a programmatic API,
+ * use the vkGetMoltenVKConfigurationMVK() and vkSetMoltenVKConfigurationMVK() functions
+ * to retrieve, modify, and set a copy of the MVKConfiguration structure.
+ *
+ * The initial value of each of the configuration settings can established at runtime
+ * by a corresponding environment variable, or if the environment variable is not set,
+ * by a corresponding build setting at the time MoltenVK is compiled. The environment
+ * variable and build setting for each configuration parameter share the same name.
+ *
+ * For example, the initial value of the shaderConversionFlipVertexY configuration setting
+ * is set by the MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y at runtime, or by the
+ * MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y build setting when MoltenVK is compiled.
  *
  * This structure may be extended as new features are added to MoltenVK. If you are linking to
  * an implementation of MoltenVK that was compiled from a different VK_MVK_MOLTENVK_SPEC_VERSION
  * than your app was, the size of this structure in your app may be larger or smaller than the
  * struct in MoltenVK. See the description of the vkGetMoltenVKConfigurationMVK() and
  * vkSetMoltenVKConfigurationMVK() functions for information about how to handle this.
+ *
+ * TO SUPPORT DYNAMIC LINKING TO THIS STRUCTURE AS DESCRIBED ABOVE, THIS STRUCTURE SHOULD NOT
+ * BE CHANGED EXCEPT TO ADD ADDITIONAL MEMBERS ON THE END. EXISTING MEMBERS, AND THEIR ORDER,
+ * SHOULD NOT BE CHANGED.
  */
 typedef struct {
 
 	/**
-	 * If enabled, debugging capabilities will be enabled, including logging shader code
-	 * during runtime shader conversion.
+	 * If enabled, debugging capabilities will be enabled, including logging
+	 * shader code during runtime shader conversion.
 	 *
-	 * Initial value is true in the presence of the DEBUG build setting, and false otherwise.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_DEBUG
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter is false if MoltenVK was
+	 * built in Release mode, and true if MoltenVK was built in Debug mode.
 	 */
     VkBool32 debugMode;
 
 	/**
 	 * If enabled, MSL vertex shader code created during runtime shader conversion will
 	 * flip the Y-axis of each vertex, as the Vulkan Y-axis is the inverse of OpenGL.
+	 *
 	 * An alternate way to reverse the Y-axis is to employ a negative Y-axis value on
 	 * the viewport, in which case this parameter can be disabled.
 	 *
-	 * Initial value is set by the MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y build setting
-	 * when MoltenVK is compiled. By default the MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y
-	 * build setting is set to true.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 * Specifically, this parameter can be enabled when compiling some pipelines,
+	 * and disabled when compiling others. Existing pipelines are not automatically
+	 * re-compiled when this parameter is changed.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
 	 */
     VkBool32 shaderConversionFlipVertexY;
 
@@ -106,10 +133,13 @@
 	 * will be dispatched to a GCD dispatch_queue whose priority is determined by
 	 * VkDeviceQueueCreateInfo::pQueuePriorities during vkCreateDevice().
 	 *
-	 * Initial value is set by the MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS build setting when MoltenVK
-	 * is compiled. By default the MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS build setting is set to false,
-	 * and command processing will be handled on a prioritizable queue thread. Changing the value of
-	 * this parameter must be done before creating a VkDevice, for the change to take effect.
+	 * The value of this parameter may be changed before creating a VkDevice,
+	 * for the change to take effect.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
 	 */
 	VkBool32 synchronousQueueSubmits;
 
@@ -143,8 +173,15 @@
 	 * command buffers do not support the concept of being reset after being filled. Depending on when
 	 * and how often you do this, it may cause unexpected visual artifacts and unnecessary GPU load.
 	 *
-	 * Initial value is set by the MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS build setting when MoltenVK
-	 * is compiled. By default the MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS build setting is set to false.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 * Specifically, this parameter can be enabled when filling some command buffers,
+	 * and disabled when filling others.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to false.
 	 */
 	VkBool32 prefillMetalCommandBuffers;
 
@@ -156,10 +193,13 @@
 	 * is required per command buffer queue submission, which may be significantly less than the
 	 * number of Vulkan command buffers.
 	 *
-	 * Initial value is set by the MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_POOL build setting
-	 * when MoltenVK is compiled. By default the MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_POOL
-	 * build setting is set to 64. Changing the value of this parameter must be done before creating
-	 * a VkDevice, for the change to take effect.
+	 * The value of this parameter may be changed before creating a VkDevice,
+	 * for the change to take effect.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to 64.
 	 */
 	uint32_t maxActiveMetalCommandBuffersPerQueue;
 
@@ -171,9 +211,15 @@
 	 * within a renderpass. If disabled, one MTLBuffer will be shared by all query pools,
 	 * which improves performance, but limits the total device queries to 8192.
 	 *
-	 * Initial value is set by the MVK_CONFIG_SUPPORT_LARGE_QUERY_POOLS build setting
-	 * when MoltenVK is compiled. By default the MVK_CONFIG_SUPPORT_LARGE_QUERY_POOLS
-	 * build setting is set to true.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 * Specifically, this parameter can be enabled when creating some query pools,
+	 * and disabled when creating others.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SUPPORT_LARGE_QUERY_POOLS
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
 	 */
 	VkBool32 supportLargeQueryPools;
 
@@ -181,8 +227,13 @@
 	 * If enabled, each surface presentation is scheduled using a command buffer. Enabling this
 	 * setting may improve rendering frame synchronization, but may result in reduced frame rates.
 	 *
-	 * Initial value is set by the MVK_CONFIG_PRESENT_WITH_COMMAND_BUFFER build setting when MoltenVK
-	 * is compiled. By default the MVK_CONFIG_PRESENT_WITH_COMMAND_BUFFER build setting is set to true.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_PRESENT_WITH_COMMAND_BUFFER
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
 	 */
 	VkBool32 presentWithCommandBuffer;
 
@@ -194,9 +245,13 @@
 	 * multiples of display pixels (eg- macOS Retina, and typical of graphics apps and games),
 	 * but may cause aliasing effects when using non-integer display scaling.
 	 *
-	 * Initial value is set by the MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST build setting
-	 * when MoltenVK is compiled. By default the MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST
-	 * build setting is set to true.
+	 * The value of this parameter may be changed before creating a VkSwapchain,
+	 * for the change to take effect.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
 	 */
 	VkBool32 swapchainMagFilterUseNearest;
 
@@ -206,8 +261,13 @@
 	 * within the Metal compiler can stall the thread for up to 30 seconds. Setting this value
 	 * limits that delay to a specified amount of time, allowing shader compilations to fail fast.
 	 *
-	 * Initial value is set by the MVK_CONFIG_METAL_COMPILE_TIMEOUT build setting when MoltenVK
-	 * is compiled. By default the MVK_CONFIG_METAL_COMPILE_TIMEOUT build setting is infinite.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_METAL_COMPILE_TIMEOUT
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to infinite.
 	 */
 	uint64_t metalCompileTimeout;
 
@@ -216,7 +276,13 @@
 	 * retrieved via the vkGetSwapchainPerformanceMVK() function, and various performance statistics
 	 * are tracked, logged, and can be retrieved via the vkGetPerformanceStatisticsMVK() function.
 	 *
-	 * Initial value is true in the presence of the DEBUG build setting, and false otherwise.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_PERFORMANCE_TRACKING
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to false.
 	 */
 	VkBool32 performanceTracking;
 
@@ -224,7 +290,13 @@
 	 * If non-zero, performance statistics will be periodically logged to the console, on a repeating
 	 * cycle of this many frames per swapchain. The performanceTracking capability must also be enabled.
 	 *
-	 * Initial value is 300 in the presence of the DEBUG build setting, and zero otherwise.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_PERFORMANCE_LOGGING_FRAME_COUNT
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to zero.
 	 */
 	uint32_t performanceLoggingFrameCount;
 
@@ -232,11 +304,116 @@
 	 * If enabled, a MoltenVK logo watermark will be rendered on top of the scene.
 	 * This can be enabled for publicity during demos.
 	 *
-	 * Initial value is set by the MVK_CONFIG_DISPLAY_WATERMARK build setting when MoltenVK
-	 * is compiled. By default the MVK_CONFIG_DISPLAY_WATERMARK build setting is set to false.
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_DISPLAY_WATERMARK
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to false.
 	 */
 	VkBool32 displayWatermark;
 
+	/**
+	 * Metal does not distinguish functionality between queues, which would normally mean only
+	 * a single general-purpose queue family with multiple queues is needed. However, Vulkan
+	 * associates command buffers with a queue family, whereas Metal associates command buffers
+	 * with a specific Metal queue. In order to allow a Metal command buffer to be prefilled
+	 * before is is formally submitted to a Vulkan queue, each Vulkan queue family can support
+	 * only a single Metal queue. As a result, in order to provide parallel queue operations,
+	 * MoltenVK provides multiple queue families, each with a single queue.
+	 *
+	 * If this parameter is disabled, all queue families will be advertised as having general-purpose
+	 * graphics + compute + transfer functionality, which is how the actual Metal queues behave.
+	 *
+	 * If this parameter is enabled, one queue family will be advertised as having general-purpose
+	 * graphics + compute + transfer functionality, and the remaining queue families will be advertised
+	 * as having specialized graphics OR compute OR transfer functionality, to make it easier for some
+	 * apps to select a queue family with the appropriate requirements.
+	 *
+	 * The value of this parameter may be changed before creating a VkDevice, and before
+	 * querying a VkPhysicalDevice for queue family properties, for the change to take effect.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SPECIALIZED_QUEUE_FAMILIES
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to false.
+	 */
+	VkBool32 specializedQueueFamilies;
+
+	/**
+	 * If enabled, when the app creates a VkDevice from a VkPhysicalDevice (GPU) that is neither
+	 * headless nor low-power, and is different than the GPU used by the windowing system, the
+	 * windowing system will be forced to switch to use the GPU selected by the Vulkan app.
+	 * When the Vulkan app is ended, the windowing system will automatically switch back to
+	 * using the previous GPU, depending on the usage requirements of other running apps.
+	 *
+	 * If disabled, the Vulkan app will render using its selected GPU, and if the windowing
+	 * system uses a different GPU, the windowing system compositor will automatically copy
+	 * framebuffer content from the app GPU to the windowing system GPU.
+	 *
+	 * The value of this parmeter has no effect on systems with a single GPU, or when the
+	 * Vulkan app creates a VkDevice from a low-power or headless VkPhysicalDevice (GPU).
+	 *
+	 * Switching the windowing system GPU to match the Vulkan app GPU maximizes app performance,
+	 * because it avoids the windowing system compositor from having to copy framebuffer content
+	 * between GPUs on each rendered frame. However, doing so forces the entire system to
+	 * potentially switch to using a GPU that may consume more power while the app is running.
+	 *
+	 * Some Vulkan apps may want to render using a high-power GPU, but leave it up to the
+	 * system window compositor to determine how best to blend content with the windowing
+	 * system, and as a result, may want to disable this parameter.
+	 *
+	 * The value of this parameter may be changed before creating a VkDevice,
+	 * for the change to take effect.
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_SWITCH_SYSTEM_GPU
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to true.
+	 */
+	VkBool32 switchSystemGPU;
+
+	/**
+	 * If enabled, arbitrary ImageView component swizzles are supported, as defined
+	 * in VkImageViewCreateInfo::components when creating a VkImageView.
+	 *
+	 * If disabled, a very limited set of ImageView component swizzles are supported
+	 * via format substitutions.
+	 *
+	 * Metal does not natively support per-texture swizzling. If this parameter is enabled
+	 * when a pipeline is compiled, ImageView swizzling is automatically performed in the
+	 * converted Metal shader code during all texture sampling and reading operations,
+	 * regardless of whether a swizzle has been specified for the ImageView associated
+	 * with the Metal texture. This may result in reduced performance.
+	 *
+	 * The value of this parameter may be changed at any time during application runtime,
+	 * and the changed value will immediately effect subsequent MoltenVK behaviour.
+	 * Specifically, this parameter can be enabled when compiling some pipelines,
+	 * and disabled when compiling others. Existing pipelines are not automatically
+	 * re-compiled when this parameter is changed.
+	 *
+	 * If this parameter is disabled, the following limited set of ImageView swizzles
+	 * are supported by MoltenVK, via automatic format substitution:
+	 *
+	 * Texture format			       Swizzle
+	 * --------------                  -------
+	 * VK_FORMAT_R8_UNORM              ZERO, ANY, ANY, RED
+	 * VK_FORMAT_A8_UNORM              ALPHA, ANY, ANY, ZERO
+	 * VK_FORMAT_R8G8B8A8_UNORM        BLUE, GREEN, RED, ALPHA
+	 * VK_FORMAT_R8G8B8A8_SRGB         BLUE, GREEN, RED, ALPHA
+	 * VK_FORMAT_B8G8R8A8_UNORM        BLUE, GREEN, RED, ALPHA
+	 * VK_FORMAT_B8G8R8A8_SRGB         BLUE, GREEN, RED, ALPHA
+	 * VK_FORMAT_D32_SFLOAT_S8_UINT    RED, ANY, ANY, ANY (stencil only)
+	 * VK_FORMAT_D24_UNORM_S8_UINT     RED, ANY, ANY, ANY (stencil only)
+	 *
+	 * The initial value or this parameter is set by the
+	 * MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE
+	 * runtime environment variable or MoltenVK compile-time build setting.
+	 * If neither is set, the value of this parameter defaults to false.
+	 */
+	VkBool32 fullImageViewSwizzle;
+
 } MVKConfiguration;
 
 /**
@@ -248,6 +425,10 @@
  * than your app was, the size of this structure in your app may be larger or smaller than the
  * struct in MoltenVK. See the description of the vkGetPhysicalDeviceMetalFeaturesMVK() function
  * for information about how to handle this.
+ *
+ * TO SUPPORT DYNAMIC LINKING TO THIS STRUCTURE AS DESCRIBED ABOVE, THIS STRUCTURE SHOULD NOT
+ * BE CHANGED EXCEPT TO ADD ADDITIONAL MEMBERS ON THE END. EXISTING MEMBERS, AND THEIR ORDER,
+ * SHOULD NOT BE CHANGED.
  */
 typedef struct {
     uint32_t mslVersion;                        /**< The version of the Metal Shading Language available on this device. The format of the integer is MMmmpp, with two decimal digts each for Major, minor, and patch version values (eg. MSL 1.2 would appear as 010200). */
@@ -271,6 +452,8 @@
     VkDeviceSize maxQueryBufferSize;            /**< The maximum size of an occlusion query buffer (in bytes). */
 	VkDeviceSize mtlCopyBufferAlignment;        /**< The alignment required during buffer copy operations (in bytes). */
     VkSampleCountFlags supportedSampleCounts;   /**< A bitmask identifying the sample counts supported by the device. */
+	uint32_t minSwapchainImageCount;	 	  	/**< The minimum number of swapchain images that can be supported by a surface. */
+	uint32_t maxSwapchainImageCount;	 	  	/**< The maximum number of swapchain images that can be supported by a surface. */
 } MVKPhysicalDeviceMetalFeatures;
 
 /**
@@ -282,6 +465,10 @@
  * than your app was, the size of this structure in your app may be larger or smaller than the
  * struct in MoltenVK. See the description of the vkGetSwapchainPerformanceMVK() function for
  * information about how to handle this.
+ *
+ * TO SUPPORT DYNAMIC LINKING TO THIS STRUCTURE AS DESCRIBED ABOVE, THIS STRUCTURE SHOULD NOT
+ * BE CHANGED EXCEPT TO ADD ADDITIONAL MEMBERS ON THE END. EXISTING MEMBERS, AND THEIR ORDER,
+ * SHOULD NOT BE CHANGED.
  */
 typedef struct {
     double lastFrameInterval;           /**< The time interval between this frame and the immediately previous frame, in milliseconds. */
@@ -330,6 +517,10 @@
  * than your app was, the size of this structure in your app may be larger or smaller than the
  * struct in MoltenVK. See the description of the vkGetPerformanceStatisticsMVK() function for
  * information about how to handle this.
+ *
+ * TO SUPPORT DYNAMIC LINKING TO THIS STRUCTURE AS DESCRIBED ABOVE, THIS STRUCTURE SHOULD NOT
+ * BE CHANGED EXCEPT TO ADD ADDITIONAL MEMBERS ON THE END. EXISTING MEMBERS, AND THEIR ORDER,
+ * SHOULD NOT BE CHANGED.
  */
 typedef struct {
 	MVKShaderCompilationPerformance shaderCompilation;	/** Shader compilations activities. */
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.h b/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.h
index 2352a97..3aecbb6 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.h
@@ -1,7 +1,7 @@
 /*
  * MVKMVKCmdDispatch.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.mm b/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.mm
index 0ab0d68..beaa5d9 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdDispatch.mm
@@ -1,7 +1,7 @@
 /*
  * MVKMVKCmdDispatch.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdDraw.h b/MoltenVK/MoltenVK/Commands/MVKCmdDraw.h
index 7e585cd..d9be776 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdDraw.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdDraw.h
@@ -1,7 +1,7 @@
 /*
  * MVKCmdDraw.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@
     MVKCmdBindVertexBuffers(MVKCommandTypePool<MVKCmdBindVertexBuffers>* pool);
 
 protected:
-    MVKVector<MVKMTLBufferBinding> _bindings;
+    MVKVectorInline<MVKMTLBufferBinding, 8> _bindings;
 };
 
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdDraw.mm b/MoltenVK/MoltenVK/Commands/MVKCmdDraw.mm
index 5b2d630..eaa5e81 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdDraw.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdDraw.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCmdDraw.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.h b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.h
index 724d7f1..2044f66 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.h
@@ -1,7 +1,7 @@
 /*
  * MVKCmdPipeline.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -102,8 +102,8 @@
 private:
 	VkPipelineBindPoint _pipelineBindPoint;
 	MVKPipelineLayout* _pipelineLayout;
-	MVKVector<MVKDescriptorSet*> _descriptorSets;
-	MVKVector<uint32_t>          _dynamicOffsets;
+	MVKVectorInline<MVKDescriptorSet*, 8> _descriptorSets;
+	MVKVectorInline<uint32_t, 8>          _dynamicOffsets;
 	uint32_t _firstSet;
 };
 
@@ -129,7 +129,7 @@
 	MVKPipelineLayout* _pipelineLayout;
 	VkShaderStageFlags _stageFlags;
 	uint32_t _offset;
-	MVKVector128<char> _pushConstants;
+	MVKVectorInline<char, 128> _pushConstants;
 };
 
 
@@ -157,7 +157,7 @@
 
 	VkPipelineBindPoint _pipelineBindPoint;
 	MVKPipelineLayout* _pipelineLayout;
-	MVKVector<VkWriteDescriptorSet> _descriptorWrites;
+	MVKVectorInline<VkWriteDescriptorSet, 8> _descriptorWrites;
 	uint32_t _set;
 };
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
index 01f141c..dd35941 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdPipeline.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCmdPipeline.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdQueries.h b/MoltenVK/MoltenVK/Commands/MVKCmdQueries.h
index 1e8e7c0..0fb2932 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdQueries.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdQueries.h
@@ -1,7 +1,7 @@
 /*
  * MVKCmdQueries.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdQueries.mm b/MoltenVK/MoltenVK/Commands/MVKCmdQueries.mm
index 3ca0fd1..0be9e89 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdQueries.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdQueries.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCmdQueries.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
index 9562d6b..8de657e 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
@@ -1,7 +1,7 @@
 /*
  * MVKCmdRenderPass.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@
 	VkSubpassContents _contents;
 	MVKRenderPass* _renderPass;
 	MVKFramebuffer* _framebuffer;
-	MVKVector<VkClearValue> _clearValues;
+	MVKVectorInline<VkClearValue, 8> _clearValues;
 };
 
 
@@ -115,7 +115,7 @@
 
 private:
 	uint32_t _firstViewport;
-	MVKVector<MTLViewport> _mtlViewports;
+	MVKVectorInline<MTLViewport, 8> _mtlViewports;
 };
 
 
@@ -134,7 +134,7 @@
 
 private:
 	uint32_t _firstScissor;
-	MVKVector<MTLScissorRect> _mtlScissors;
+	MVKVectorInline<MTLScissorRect, 8> _mtlScissors;
 };
 
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
index 450b842..f080273 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCmdRenderPass.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
index c441dd6..91d7a65 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
@@ -1,7 +1,7 @@
 /*
  * MVKCmdTransfer.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
index 6bb9790..731c144 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCmdTransfer.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -617,6 +617,21 @@
 #pragma mark -
 #pragma mark MVKCmdBufferImageCopy
 
+// Matches shader struct.
+typedef struct {
+    uint32_t srcRowStride;
+    uint32_t srcRowStrideHigh;
+    uint32_t srcDepthStride;
+    uint32_t srcDepthStrideHigh;
+    uint32_t destRowStride;
+    uint32_t destRowStrideHigh;
+    uint32_t destDepthStride;
+    uint32_t destDepthStrideHigh;
+    VkFormat format;
+    VkOffset3D offset;
+    VkExtent3D extent;
+} MVKCmdCopyBufferToImageInfo;
+
 void MVKCmdBufferImageCopy::setContent(VkBuffer buffer,
                                        VkImage image,
                                        VkImageLayout imageLayout,
@@ -648,15 +663,15 @@
     id<MTLTexture> mtlTexture = _image->getMTLTexture();
     if ( !mtlBuffer || !mtlTexture ) { return; }
 
-	NSUInteger mtlBuffOffset = _buffer->getMTLBufferOffset();
-    MTLPixelFormat mtlPixFmt = mtlTexture.pixelFormat;
+	NSUInteger mtlBuffOffsetBase = _buffer->getMTLBufferOffset();
+    MTLPixelFormat mtlPixFmt = _image->getMTLPixelFormat();
     MVKCommandUse cmdUse = _toImage ? kMVKCommandUseCopyBufferToImage : kMVKCommandUseCopyImageToBuffer;
-    id<MTLBlitCommandEncoder> mtlBlitEnc = cmdEncoder->getMTLBlitEncoder(cmdUse);
 
     for (auto& cpyRgn : _mtlBuffImgCopyRegions) {
 
         MTLOrigin mtlTxtOrigin = mvkMTLOriginFromVkOffset3D(cpyRgn.imageOffset);
         MTLSize mtlTxtSize = mvkMTLSizeFromVkExtent3D(cpyRgn.imageExtent);
+		NSUInteger mtlBuffOffset = mtlBuffOffsetBase + cpyRgn.bufferOffset;
 
         uint32_t buffImgWd = cpyRgn.bufferRowLength;
         if (buffImgWd == 0) { buffImgWd = cpyRgn.imageExtent.width; }
@@ -690,10 +705,89 @@
             }
         }
 
+#if MVK_IOS
+		if (mvkMTLPixelFormatIsPVRTCFormat(mtlPixFmt)) {
+			blitOptions |= MTLBlitOptionRowLinearPVRTC;
+		}
+#endif
+
+#if MVK_MACOS
+        if (_toImage && mvkFormatTypeFromMTLPixelFormat(mtlPixFmt) == kMVKFormatCompressed &&
+            mtlTexture.textureType == MTLTextureType3D) {
+            // If we're copying to a compressed 3D image, the image data need to be decompressed.
+            // If we're copying to mip level 0, we can skip the copy and just decode
+            // directly into the image. Otherwise, we need to use an intermediate
+            // buffer.
+            MVKCmdCopyBufferToImageInfo info;
+            info.srcRowStride = bytesPerRow & 0xffffffff;
+            info.srcRowStrideHigh = bytesPerRow >> 32;
+            info.srcDepthStride = bytesPerImg & 0xffffffff;
+            info.srcDepthStrideHigh = bytesPerImg >> 32;
+            info.destRowStride = info.destRowStrideHigh = 0;
+            info.destDepthStride = info.destDepthStrideHigh = 0;
+            info.format = _image->getVkFormat();
+            info.offset = cpyRgn.imageOffset;
+            info.extent = cpyRgn.imageExtent;
+            bool needsTempBuff = cpyRgn.imageSubresource.mipLevel != 0;
+            id<MTLComputeCommandEncoder> mtlComputeEnc = cmdEncoder->getMTLComputeEncoder(cmdUse);
+            id<MTLComputePipelineState> mtlComputeState = getCommandEncodingPool()->getCmdCopyBufferToImage3DDecompressMTLComputePipelineState(needsTempBuff);
+            [mtlComputeEnc pushDebugGroup: @"vkCmdCopyBufferToImage"];
+            [mtlComputeEnc setComputePipelineState: mtlComputeState];
+            [mtlComputeEnc setBuffer: mtlBuffer offset: mtlBuffOffset atIndex: 0];
+            MVKBuffer* tempBuff;
+            if (needsTempBuff) {
+                NSUInteger bytesPerDestRow = mvkMTLPixelFormatBytesPerRow(mtlTexture.pixelFormat, info.extent.width);
+                NSUInteger bytesPerDestImg = mvkMTLPixelFormatBytesPerLayer(mtlTexture.pixelFormat, bytesPerDestRow, info.extent.height);
+                // We're going to copy from the temporary buffer now, so use the
+                // temp buffer parameters in the copy below.
+                bytesPerRow = bytesPerDestRow;
+                bytesPerImg = bytesPerDestImg;
+                MVKBufferDescriptorData tempBuffData;
+                tempBuffData.size = bytesPerDestImg * mtlTxtSize.depth;
+                tempBuffData.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+                tempBuff = getCommandEncodingPool()->getTransferMVKBuffer(tempBuffData);
+                mtlBuffer = tempBuff->getMTLBuffer();
+                mtlBuffOffset = tempBuff->getMTLBufferOffset();
+                info.destRowStride = bytesPerDestRow & 0xffffffff;
+                info.destRowStrideHigh = bytesPerDestRow >> 32;
+                info.destDepthStride = bytesPerDestImg & 0xffffffff;
+                info.destDepthStrideHigh = bytesPerDestImg >> 32;
+                [mtlComputeEnc setBuffer: mtlBuffer offset: mtlBuffOffset atIndex: 1];
+            } else {
+                [mtlComputeEnc setTexture: mtlTexture atIndex: 0];
+            }
+            cmdEncoder->setComputeBytes(mtlComputeEnc, &info, sizeof(info), 2);
+
+            // Now work out how big to make the grid, and from there, the size and number of threadgroups.
+            // One thread is run per block. Each block decompresses to an m x n array of texels.
+            // So the size of the grid is (ceil(width/m), ceil(height/n), depth).
+            VkExtent2D blockExtent = mvkMTLPixelFormatBlockTexelSize(mtlPixFmt);
+            MTLSize mtlGridSize = MTLSizeMake(mvkCeilingDivide(mtlTxtSize.width, blockExtent.width),
+                                              mvkCeilingDivide(mtlTxtSize.height, blockExtent.height),
+                                              mtlTxtSize.depth);
+            // Use four times the thread execution width as the threadgroup size.
+            MTLSize mtlTgrpSize = MTLSizeMake(2, 2, mtlComputeState.threadExecutionWidth);
+            // Then the number of threadgroups is (ceil(x/2), ceil(y/2), ceil(z/t)),
+            // where 't' is the thread execution width.
+            mtlGridSize.width = mvkCeilingDivide(mtlGridSize.width, 2);
+            mtlGridSize.height = mvkCeilingDivide(mtlGridSize.height, 2);
+            mtlGridSize.depth = mvkCeilingDivide(mtlGridSize.depth, mtlTgrpSize.depth);
+            // There may be extra threads, but that's OK; the shader does bounds checking to
+            // ensure it doesn't try to write out of bounds.
+            // Alternatively, we could use the newer -[MTLComputeCommandEncoder dispatchThreads:threadsPerThreadgroup:] method,
+            // but that needs Metal 2.0.
+            [mtlComputeEnc dispatchThreadgroups: mtlGridSize threadsPerThreadgroup: mtlTgrpSize];
+            [mtlComputeEnc popDebugGroup];
+
+            if (!needsTempBuff) { continue; }
+        }
+#endif
+        id<MTLBlitCommandEncoder> mtlBlitEnc = cmdEncoder->getMTLBlitEncoder(cmdUse);
+
         for (uint32_t lyrIdx = 0; lyrIdx < cpyRgn.imageSubresource.layerCount; lyrIdx++) {
             if (_toImage) {
                 [mtlBlitEnc copyFromBuffer: mtlBuffer
-                              sourceOffset: (mtlBuffOffset + cpyRgn.bufferOffset + (bytesPerImg * lyrIdx))
+                              sourceOffset: (mtlBuffOffset + (bytesPerImg * lyrIdx))
                          sourceBytesPerRow: bytesPerRow
                        sourceBytesPerImage: bytesPerImg
                                 sourceSize: mtlTxtSize
@@ -709,7 +803,7 @@
                                sourceOrigin: mtlTxtOrigin
                                  sourceSize: mtlTxtSize
                                    toBuffer: mtlBuffer
-                          destinationOffset: (mtlBuffOffset + cpyRgn.bufferOffset + (bytesPerImg * lyrIdx))
+                          destinationOffset: (mtlBuffOffset + (bytesPerImg * lyrIdx))
                      destinationBytesPerRow: bytesPerRow
                    destinationBytesPerImage: bytesPerImg
                                     options: blitOptions];
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommand.h b/MoltenVK/MoltenVK/Commands/MVKCommand.h
index f080638..3f3c498 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommand.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommand.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommand.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommand.mm b/MoltenVK/MoltenVK/Commands/MVKCommand.mm
index 588d57b..e9c564c 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommand.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommand.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommand.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.h b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.h
index d970f0e..9b8d4a5 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandBuffer.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -403,7 +403,7 @@
 	uint32_t _renderSubpassIndex;
 	VkRect2D _renderArea;
     MVKActivatedQueries* _pActivatedQueries;
-	MVKVector<VkClearValue> _clearValues;
+	MVKVectorInline<VkClearValue, 8> _clearValues;
 	id<MTLComputeCommandEncoder> _mtlComputeEncoder;
 	MVKCommandUse _mtlComputeEncoderUse;
 	id<MTLBlitCommandEncoder> _mtlBlitEncoder;
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
index d36819b..a93f150 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommandBuffer.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -351,7 +351,7 @@
 }
 
 void MVKCommandEncoder::finalizeDispatchState() {
-    _computePipelineState.encode();
+    _computePipelineState.encode();    // Must do first..it sets others
     _computeResourcesState.encode();
     _computePushConstants.encode();
 }
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
index 4cb4036..a18e6d4 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandEncoderState.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -147,7 +147,7 @@
     void encodeImpl() override;
     void resetImpl() override;
 
-    MVKVector<MTLViewport> _mtlViewports;
+    MVKVectorInline<MTLViewport, 8> _mtlViewports;
 };
 
 
@@ -176,7 +176,7 @@
     void encodeImpl() override;
     void resetImpl() override;
 
-    MVKVector<MTLScissorRect> _mtlScissors;
+    MVKVectorInline<MTLScissorRect, 8> _mtlScissors;
 };
 
 
@@ -189,7 +189,7 @@
 public:
 
     /** Sets the specified push constants. */
-    void setPushConstants(uint32_t offset, MVKVector128<char>& pushConstants);
+    void setPushConstants(uint32_t offset, MVKVector<char>& pushConstants);
 
     /** Sets the index of the Metal buffer used to hold the push constants. */
     void setMTLBufferIndex(uint32_t mtlBufferIndex);
@@ -203,7 +203,7 @@
     void encodeImpl() override;
     void resetImpl() override;
 
-    MVKVector128<char> _pushConstants;
+    MVKVectorInline<char, 128> _pushConstants;
     VkShaderStageFlagBits _shaderStage;
     uint32_t _mtlBufferIndex = 0;
 };
@@ -374,6 +374,13 @@
         bindings.push_back(db);
     }
 
+	// For texture bindings, we also keep track of whether any bindings need a texture swizzle
+	void bind(const MVKMTLTextureBinding& tb, MVKVector<MVKMTLTextureBinding>& texBindings,
+			  bool& bindingsDirtyFlag, bool& needsSwizzleFlag) {
+		bind(tb, texBindings, bindingsDirtyFlag);
+		if (tb.swizzle != 0) { needsSwizzleFlag = true; }
+	}
+
     // Template function that executes a lambda expression on each dirty element of
     // a vector of bindings, and marks the bindings and the vector as no longer dirty.
     template<class T>
@@ -391,11 +398,6 @@
         }
     }
 
-    // Updates the swizzle for an image in the given vector.
-    void updateSwizzle(MVKVector<uint32_t> &constants, uint32_t index, uint32_t swizzle) {
-        if (index >= constants.size()) { constants.resize(index + 1); }
-        constants[index] = swizzle;
-    }
 };
 
 
@@ -434,7 +436,9 @@
     }
 
     /** Sets the current auxiliary buffer state. */
-    void bindAuxBuffer(const MVKShaderAuxBufferBinding& binding, bool needVertexAuxBuffer, bool needFragmentAuxBuffer);
+    void bindAuxBuffer(const MVKShaderAuxBufferBinding& binding,
+					   bool needVertexAuxBuffer,
+					   bool needFragmentAuxBuffer);
 
 
 #pragma mark Construction
@@ -447,14 +451,14 @@
     void resetImpl() override;
     void markDirty() override;
 
-    MVKVector<MVKMTLBufferBinding> _vertexBufferBindings;
-    MVKVector<MVKMTLBufferBinding> _fragmentBufferBindings;
-    MVKVector<MVKMTLTextureBinding> _vertexTextureBindings;
-    MVKVector<MVKMTLTextureBinding> _fragmentTextureBindings;
-    MVKVector<MVKMTLSamplerStateBinding> _vertexSamplerStateBindings;
-    MVKVector<MVKMTLSamplerStateBinding> _fragmentSamplerStateBindings;
-    MVKVector<uint32_t> _vertexSwizzleConstants;
-    MVKVector<uint32_t> _fragmentSwizzleConstants;
+    MVKVectorInline<MVKMTLBufferBinding, 8> _vertexBufferBindings;
+    MVKVectorInline<MVKMTLBufferBinding, 8> _fragmentBufferBindings;
+    MVKVectorInline<MVKMTLTextureBinding, 8> _vertexTextureBindings;
+    MVKVectorInline<MVKMTLTextureBinding, 8> _fragmentTextureBindings;
+    MVKVectorInline<MVKMTLSamplerStateBinding, 8> _vertexSamplerStateBindings;
+    MVKVectorInline<MVKMTLSamplerStateBinding, 8> _fragmentSamplerStateBindings;
+    MVKVectorInline<uint32_t, 8> _vertexSwizzleConstants;
+    MVKVectorInline<uint32_t, 8> _fragmentSwizzleConstants;
     MVKMTLBufferBinding _vertexAuxBufferBinding;
     MVKMTLBufferBinding _fragmentAuxBufferBinding;
 
@@ -464,6 +468,9 @@
     bool _areFragmentTextureBindingsDirty = false;
     bool _areVertexSamplerStateBindingsDirty = false;
     bool _areFragmentSamplerStateBindingsDirty = false;
+	
+	bool _needsVertexSwizzle = false;
+	bool _needsFragmentSwizzle = false;
 };
 
 
@@ -485,7 +492,7 @@
     void bindSamplerState(const MVKMTLSamplerStateBinding& binding);
 
     /** Sets the current auxiliary buffer state. */
-    void bindAuxBuffer(const MVKShaderAuxBufferBinding& binding);
+	void bindAuxBuffer(const MVKShaderAuxBufferBinding& binding, bool needAuxBuffer);
 
 #pragma mark Construction
 
@@ -497,15 +504,17 @@
     void resetImpl() override;
     void markDirty() override;
 
-    MVKVector<MVKMTLBufferBinding> _bufferBindings;
-    MVKVector<MVKMTLTextureBinding> _textureBindings;
-    MVKVector<MVKMTLSamplerStateBinding> _samplerStateBindings;
-    MVKVector<uint32_t> _swizzleConstants;
+    MVKVectorDefault<MVKMTLBufferBinding> _bufferBindings;
+    MVKVectorDefault<MVKMTLTextureBinding> _textureBindings;
+    MVKVectorDefault<MVKMTLSamplerStateBinding> _samplerStateBindings;
+    MVKVectorDefault<uint32_t> _swizzleConstants;
     MVKMTLBufferBinding _auxBufferBinding;
 
     bool _areBufferBindingsDirty = false;
     bool _areTextureBindingsDirty = false;
     bool _areSamplerStateBindingsDirty = false;
+
+	bool _needsSwizzle = false;
 };
 
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
index f56e8db..480fc9d 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommandEncoderState.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -136,7 +136,7 @@
 #pragma mark -
 #pragma mark MVKPushConstantsCommandEncoderState
 
-void MVKPushConstantsCommandEncoderState:: setPushConstants(uint32_t offset, MVKVector128<char>& pushConstants) {
+void MVKPushConstantsCommandEncoderState:: setPushConstants(uint32_t offset, MVKVector<char>& pushConstants) {
     uint32_t pcCnt = (uint32_t)pushConstants.size();
     mvkEnsureSize(_pushConstants, offset + pcCnt);
     copy(pushConstants.begin(), pushConstants.end(), _pushConstants.begin() + offset);
@@ -399,6 +399,32 @@
 
 
 #pragma mark -
+#pragma mark MVKResourcesCommandEncoderState
+
+// Updates the swizzle for an image in the given vector.
+template<typename T>
+static void updateSwizzle(T &constants, uint32_t index, uint32_t swizzle) {
+	if (index >= constants.size()) { constants.resize(index + 1); }
+	constants[index] = swizzle;
+}
+
+// If a swizzle is needed for this stage, iterates all the bindings and logs errors for those that need texture swizzling.
+static void assertMissingSwizzles(bool needsSwizzle, const char* stageName, MVKVector<MVKMTLTextureBinding>& texBindings) {
+	if (needsSwizzle) {
+		for (MVKMTLTextureBinding& tb : texBindings) {
+			VkComponentMapping vkcm = mvkUnpackSwizzle(tb.swizzle);
+			MVKLogError("Pipeline does not support component swizzle (%s, %s, %s, %s) required by a VkImageView used in the %s shader."
+						" Full VkImageView component swizzling will be supported by a pipeline if the MVKConfiguration::fullImageViewSwizzle"
+						" config parameter or MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE environment variable was enabled when the pipeline is compiled.",
+						mvkVkComponentSwizzleName(vkcm.r), mvkVkComponentSwizzleName(vkcm.g),
+						mvkVkComponentSwizzleName(vkcm.b), mvkVkComponentSwizzleName(vkcm.a), stageName);
+			MVKAssert(false, "See previous logged error.");
+		}
+	}
+}
+
+
+#pragma mark -
 #pragma mark MVKGraphicsResourcesCommandEncoderState
 
 void MVKGraphicsResourcesCommandEncoderState::bindVertexBuffer(const MVKMTLBufferBinding& binding) {
@@ -410,11 +436,11 @@
 }
 
 void MVKGraphicsResourcesCommandEncoderState::bindVertexTexture(const MVKMTLTextureBinding& binding) {
-    bind(binding, _vertexTextureBindings, _areVertexTextureBindingsDirty);
+    bind(binding, _vertexTextureBindings, _areVertexTextureBindingsDirty, _needsVertexSwizzle);
 }
 
 void MVKGraphicsResourcesCommandEncoderState::bindFragmentTexture(const MVKMTLTextureBinding& binding) {
-    bind(binding, _fragmentTextureBindings, _areFragmentTextureBindingsDirty);
+    bind(binding, _fragmentTextureBindings, _areFragmentTextureBindingsDirty, _needsFragmentSwizzle);
 }
 
 void MVKGraphicsResourcesCommandEncoderState::bindVertexSamplerState(const MVKMTLSamplerStateBinding& binding) {
@@ -425,7 +451,9 @@
     bind(binding, _fragmentSamplerStateBindings, _areFragmentSamplerStateBindingsDirty);
 }
 
-void MVKGraphicsResourcesCommandEncoderState::bindAuxBuffer(const MVKShaderAuxBufferBinding& binding, bool needVertexAuxBuffer, bool needFragmentAuxBuffer) {
+void MVKGraphicsResourcesCommandEncoderState::bindAuxBuffer(const MVKShaderAuxBufferBinding& binding,
+															bool needVertexAuxBuffer,
+															bool needFragmentAuxBuffer) {
     _vertexAuxBufferBinding.index = binding.vertex;
     _vertexAuxBufferBinding.isDirty = needVertexAuxBuffer;
     _fragmentAuxBufferBinding.index = binding.fragment;
@@ -445,20 +473,6 @@
 
 void MVKGraphicsResourcesCommandEncoderState::encodeImpl() {
 
-    if (_vertexAuxBufferBinding.isDirty) {
-        for (auto& b : _vertexTextureBindings) {
-            if (b.isDirty)
-                updateSwizzle(_vertexSwizzleConstants, b.index, b.swizzle);
-        }
-    }
-
-    if (_fragmentAuxBufferBinding.isDirty) {
-        for (auto& b : _fragmentTextureBindings) {
-            if (b.isDirty)
-                updateSwizzle(_fragmentSwizzleConstants, b.index, b.swizzle);
-        }
-    }
-
     encodeBinding<MVKMTLBufferBinding>(_vertexBufferBindings, _areVertexBufferBindingsDirty,
                                        [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b)->void {
                                            [cmdEncoder->_mtlRenderEncoder setVertexBuffer: b.mtlBuffer
@@ -474,17 +488,33 @@
                                        });
 
     if (_vertexAuxBufferBinding.isDirty) {
-        _cmdEncoder->setVertexBytes(_cmdEncoder->_mtlRenderEncoder,
+
+		for (auto& b : _vertexTextureBindings) {
+			if (b.isDirty) { updateSwizzle(_vertexSwizzleConstants, b.index, b.swizzle); }
+		}
+
+		_cmdEncoder->setVertexBytes(_cmdEncoder->_mtlRenderEncoder,
                                     _vertexSwizzleConstants.data(),
                                     _vertexSwizzleConstants.size() * sizeof(uint32_t),
                                     _vertexAuxBufferBinding.index);
-    }
+
+	} else {
+		assertMissingSwizzles(_needsVertexSwizzle, "vertex", _vertexTextureBindings);
+	}
 
     if (_fragmentAuxBufferBinding.isDirty) {
-        _cmdEncoder->setFragmentBytes(_cmdEncoder->_mtlRenderEncoder,
+
+		for (auto& b : _fragmentTextureBindings) {
+			if (b.isDirty) { updateSwizzle(_fragmentSwizzleConstants, b.index, b.swizzle); }
+		}
+
+		_cmdEncoder->setFragmentBytes(_cmdEncoder->_mtlRenderEncoder,
                                       _fragmentSwizzleConstants.data(),
                                       _fragmentSwizzleConstants.size() * sizeof(uint32_t),
                                       _fragmentAuxBufferBinding.index);
+
+	} else {
+		assertMissingSwizzles(_needsFragmentSwizzle, "fragment", _fragmentTextureBindings);
     }
 
     encodeBinding<MVKMTLTextureBinding>(_vertexTextureBindings, _areVertexTextureBindingsDirty,
@@ -530,6 +560,9 @@
     _areFragmentSamplerStateBindingsDirty = false;
     _vertexAuxBufferBinding.isDirty = false;
     _fragmentAuxBufferBinding.isDirty = false;
+
+	_needsVertexSwizzle = false;
+	_needsFragmentSwizzle = false;
 }
 
 
@@ -541,16 +574,17 @@
 }
 
 void MVKComputeResourcesCommandEncoderState::bindTexture(const MVKMTLTextureBinding& binding) {
-    bind(binding, _textureBindings, _areTextureBindingsDirty);
+	bind(binding, _textureBindings, _areTextureBindingsDirty, _needsSwizzle);
 }
 
 void MVKComputeResourcesCommandEncoderState::bindSamplerState(const MVKMTLSamplerStateBinding& binding) {
     bind(binding, _samplerStateBindings, _areSamplerStateBindingsDirty);
 }
 
-void MVKComputeResourcesCommandEncoderState::bindAuxBuffer(const MVKShaderAuxBufferBinding& binding) {
+void MVKComputeResourcesCommandEncoderState::bindAuxBuffer(const MVKShaderAuxBufferBinding& binding,
+														   bool needAuxBuffer) {
     _auxBufferBinding.index = binding.compute;
-    _auxBufferBinding.isDirty = true;
+    _auxBufferBinding.isDirty = needAuxBuffer;
 }
 
 // Mark everything as dirty
@@ -563,13 +597,6 @@
 
 void MVKComputeResourcesCommandEncoderState::encodeImpl() {
 
-    if (_auxBufferBinding.isDirty) {
-        for (auto& b : _textureBindings) {
-            if (b.isDirty)
-                updateSwizzle(_swizzleConstants, b.index, b.swizzle);
-        }
-    }
-
     encodeBinding<MVKMTLBufferBinding>(_bufferBindings, _areBufferBindingsDirty,
                                        [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b)->void {
                                            [cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch) setBuffer: b.mtlBuffer
@@ -578,10 +605,18 @@
                                        });
 
     if (_auxBufferBinding.isDirty) {
-        _cmdEncoder->setComputeBytes(_cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch),
+
+		for (auto& b : _textureBindings) {
+			if (b.isDirty) { updateSwizzle(_swizzleConstants, b.index, b.swizzle); }
+		}
+
+		_cmdEncoder->setComputeBytes(_cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch),
                                      _swizzleConstants.data(),
                                      _swizzleConstants.size() * sizeof(uint32_t),
                                      _auxBufferBinding.index);
+
+	} else {
+		assertMissingSwizzles(_needsSwizzle, "compute", _textureBindings);
     }
 
     encodeBinding<MVKMTLTextureBinding>(_textureBindings, _areTextureBindingsDirty,
@@ -607,6 +642,8 @@
     _areTextureBindingsDirty = false;
     _areSamplerStateBindingsDirty = false;
     _auxBufferBinding.isDirty = false;
+
+	_needsSwizzle = false;
 }
 
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.h b/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.h
index 1373cb0..d05d603 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandEncodingPool.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -91,12 +91,28 @@
      */
     MVKImage* getTransferMVKImage(MVKImageDescriptorData& imgData);
     
+    /**
+     * Returns an MVKBuffer configured from the specified MTLBuffer configuration,
+     * with content held in Private storage. The object returned can be used as a
+     * temporary buffer during buffer-image transfers.
+     *
+     * The same buffer instance will be returned for two calls to this funciton with
+     * the same buffer descriptor data. This implies that the same buffer instance could 
+     * be used by two transfers within the same encoder or queue. This is acceptable 
+     * becuase the content only needs to be valid during the transfer, and it can be 
+     * reused by subsequent transfers in the same encoding run.
+     */
+    MVKBuffer* getTransferMVKBuffer(MVKBufferDescriptorData& buffData);
+    
 	/** Returns a MTLComputePipelineState for copying between two buffers with byte-aligned copy regions. */
     id<MTLComputePipelineState> getCmdCopyBufferBytesMTLComputePipelineState();
 
 	/** Returns a MTLComputePipelineState for filling a buffer. */
 	id<MTLComputePipelineState> getCmdFillBufferMTLComputePipelineState();
 
+	/** Returns a MTLComputePipelineState for decompressing a buffer into a 3D image. */
+	id<MTLComputePipelineState> getCmdCopyBufferToImage3DDecompressMTLComputePipelineState(bool needsTempBuff);
+
 	/** Deletes all the internal resources. */
 	void clear();
 
@@ -114,6 +130,8 @@
 	std::unordered_map<MVKRPSKeyClearAtt, id<MTLRenderPipelineState>> _cmdClearMTLRenderPipelineStates;
     std::unordered_map<MVKMTLDepthStencilDescriptorData, id<MTLDepthStencilState>> _mtlDepthStencilStates;
     std::unordered_map<MVKImageDescriptorData, MVKImage*> _transferImages;
+    std::unordered_map<MVKBufferDescriptorData, MVKBuffer*> _transferBuffers;
+    std::unordered_map<MVKBufferDescriptorData, MVKDeviceMemory*> _transferBufferMemory;
     MVKMTLBufferAllocator _mtlBufferAllocator;
     id<MTLSamplerState> _cmdBlitImageLinearMTLSamplerState = nil;
     id<MTLSamplerState> _cmdBlitImageNearestMTLSamplerState = nil;
@@ -123,5 +141,6 @@
     id<MTLDepthStencilState> _cmdClearDefaultDepthStencilState = nil;
     id<MTLComputePipelineState> _mtlCopyBufferBytesComputePipelineState = nil;
 	id<MTLComputePipelineState> _mtlFillBufferComputePipelineState = nil;
+	id<MTLComputePipelineState> _mtlCopyBufferToImage3DDecompressComputePipelineState[2] = {nil, nil};
 };
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.mm
index f3447d4..33ec58a 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncodingPool.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommandEncodingPool.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -97,6 +97,10 @@
 	MVK_ENC_REZ_ACCESS(_transferImages[imgData], newMVKImage(imgData));
 }
 
+MVKBuffer* MVKCommandEncodingPool::getTransferMVKBuffer(MVKBufferDescriptorData& buffData) {
+	MVK_ENC_REZ_ACCESS(_transferBuffers[buffData], newMVKBuffer(buffData, _transferBufferMemory[buffData]));
+}
+
 id<MTLComputePipelineState> MVKCommandEncodingPool::getCmdCopyBufferBytesMTLComputePipelineState() {
 	MVK_ENC_REZ_ACCESS(_mtlCopyBufferBytesComputePipelineState, newCmdCopyBufferBytesMTLComputePipelineState());
 }
@@ -105,6 +109,10 @@
 	MVK_ENC_REZ_ACCESS(_mtlFillBufferComputePipelineState, newCmdFillBufferMTLComputePipelineState());
 }
 
+id<MTLComputePipelineState> MVKCommandEncodingPool::getCmdCopyBufferToImage3DDecompressMTLComputePipelineState(bool needsTempBuff) {
+	MVK_ENC_REZ_ACCESS(_mtlCopyBufferToImage3DDecompressComputePipelineState[needsTempBuff ? 1 : 0], newCmdCopyBufferToImage3DDecompressMTLComputePipelineState(needsTempBuff));
+}
+
 void MVKCommandEncodingPool::clear() {
 	lock_guard<mutex> lock(_lock);
 	destroyMetalResources();
@@ -135,6 +143,12 @@
     for (auto& pair : _transferImages) { _device->destroyImage(pair.second, nullptr); }
     _transferImages.clear();
 
+    for (auto& pair : _transferBuffers) { _device->destroyBuffer(pair.second, nullptr); }
+    _transferBuffers.clear();
+
+    for (auto& pair : _transferBufferMemory) { _device->freeMemory(pair.second, nullptr); }
+    _transferBufferMemory.clear();
+
     [_cmdBlitImageLinearMTLSamplerState release];
     _cmdBlitImageLinearMTLSamplerState = nil;
 
@@ -155,5 +169,13 @@
 
     [_mtlCopyBufferBytesComputePipelineState release];
     _mtlCopyBufferBytesComputePipelineState = nil;
+
+    [_mtlFillBufferComputePipelineState release];
+    _mtlFillBufferComputePipelineState = nil;
+
+    [_mtlCopyBufferToImage3DDecompressComputePipelineState[0] release];
+    [_mtlCopyBufferToImage3DDecompressComputePipelineState[1] release];
+    _mtlCopyBufferToImage3DDecompressComputePipelineState[0] = nil;
+    _mtlCopyBufferToImage3DDecompressComputePipelineState[1] = nil;
 }
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h b/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h
index 46ac6b6..65908d2 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandPipelineStateFactoryShaderSource.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,6 +37,41 @@
     float2 v_texCoord;                                                                                          \n\
 } VaryingsPosTex;                                                                                               \n\
                                                                                                                 \n\
+typedef size_t VkDeviceSize;                                                                                    \n\
+                                                                                                                \n\
+typedef enum : uint32_t {                                                                                       \n\
+    VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131,                                                                        \n\
+    VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132,                                                                         \n\
+    VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133,                                                                       \n\
+    VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134,                                                                        \n\
+    VK_FORMAT_BC2_UNORM_BLOCK = 135,                                                                            \n\
+    VK_FORMAT_BC2_SRGB_BLOCK = 136,                                                                             \n\
+    VK_FORMAT_BC3_UNORM_BLOCK = 137,                                                                            \n\
+    VK_FORMAT_BC3_SRGB_BLOCK = 138,                                                                             \n\
+} VkFormat;                                                                                                     \n\
+                                                                                                                \n\
+typedef struct {                                                                                                \n\
+    uint32_t width;                                                                                             \n\
+    uint32_t height;                                                                                            \n\
+} VkExtent2D;                                                                                                   \n\
+                                                                                                                \n\
+typedef struct {                                                                                                \n\
+    uint32_t width;                                                                                             \n\
+    uint32_t height;                                                                                            \n\
+    uint32_t depth;                                                                                             \n\
+} __attribute__((packed)) VkExtent3D;                                                                           \n\
+                                                                                                                \n\
+typedef struct {                                                                                                \n\
+    int32_t x;                                                                                                  \n\
+    int32_t y;                                                                                                  \n\
+    int32_t z;                                                                                                  \n\
+} __attribute__((packed)) VkOffset3D;                                                                           \n\
+                                                                                                                \n"
+#define MVK_DECOMPRESS_CODE(...) #__VA_ARGS__
+#include "MVKDXTnCodec.def"
+#undef MVK_DECOMPRESS_CODE
+"\n\
+                                                                                                                \n\
 vertex VaryingsPosTex vtxCmdBlitImage(AttributesPosTex attributes [[stage_in]]) {                               \n\
     VaryingsPosTex varyings;                                                                                    \n\
     varyings.v_position = float4(attributes.a_position, 0.0, 1.0);                                              \n\
@@ -70,5 +105,68 @@
     }                                                                                                           \n\
 };                                                                                                              \n\
                                                                                                                 \n\
+typedef struct {                                                                                                \n\
+    uint32_t srcRowStride;                                                                                      \n\
+    uint32_t srcRowStrideHigh;                                                                                  \n\
+    uint32_t srcDepthStride;                                                                                    \n\
+    uint32_t srcDepthStrideHigh;                                                                                \n\
+    uint32_t destRowStride;                                                                                     \n\
+    uint32_t destRowStrideHigh;                                                                                 \n\
+    uint32_t destDepthStride;                                                                                   \n\
+    uint32_t destDepthStrideHigh;                                                                               \n\
+    VkFormat format;                                                                                            \n\
+    VkOffset3D offset;                                                                                          \n\
+    VkExtent3D extent;                                                                                          \n\
+} CmdCopyBufferToImageInfo;                                                                                     \n\
+                                                                                                                \n\
+kernel void cmdCopyBufferToImage3DDecompressDXTn(constant uint8_t* src [[buffer(0)]],                           \n\
+                                                 texture3d<float, access::write> dest [[texture(0)]],           \n\
+                                                 constant CmdCopyBufferToImageInfo& info [[buffer(2)]],         \n\
+                                                 uint3 pos [[thread_position_in_grid]]) {                       \n\
+    uint x = pos.x * 4, y = pos.y * 4, z = pos.z;                                                               \n\
+    VkDeviceSize blockByteCount = isBC1Format(info.format) ? 8 : 16;                                            \n\
+                                                                                                                \n\
+    if (x >= info.extent.width || y >= info.extent.height || z >= info.extent.depth) { return; }                \n\
+                                                                                                                \n\
+    src += z * info.srcDepthStride + y * info.srcRowStride / 4 + x * blockByteCount / 4;                        \n\
+    VkExtent2D blockExtent;                                                                                     \n\
+    blockExtent.width = min(info.extent.width - x, 4u);                                                         \n\
+    blockExtent.height = min(info.extent.height - y, 4u);                                                       \n\
+    uint pixels[16] = {0};                                                                                      \n\
+    decompressDXTnBlock(src, pixels, blockExtent, 4 * sizeof(uint), info.format);                               \n\
+    for (uint j = 0; j < blockExtent.height; ++j) {                                                             \n\
+        for (uint i = 0; i < blockExtent.width; ++i) {                                                          \n\
+            // The pixel components are in BGRA order, but texture::write wants them                            \n\
+            // in RGBA order. We can fix that (ironically) with a BGRA swizzle.                                 \n\
+            dest.write(unpack_unorm4x8_to_float(pixels[j * 4 + i]).bgra,                                        \n\
+                       uint3(info.offset.x + x + i, info.offset.y + y + j, info.offset.z + z));                 \n\
+        }                                                                                                       \n\
+    }                                                                                                           \n\
+}                                                                                                               \n\
+                                                                                                                \n\
+kernel void cmdCopyBufferToImage3DDecompressTempBufferDXTn(constant uint8_t* src [[buffer(0)]],                 \n\
+                                                           device uint8_t* dest [[buffer(1)]],                  \n\
+                                                           constant CmdCopyBufferToImageInfo& info [[buffer(2)]],\n\
+                                                           uint3 pos [[thread_position_in_grid]]) {             \n\
+    uint x = pos.x * 4, y = pos.y * 4, z = pos.z;                                                               \n\
+    VkDeviceSize blockByteCount = isBC1Format(info.format) ? 8 : 16;                                            \n\
+                                                                                                                \n\
+    if (x >= info.extent.width || y >= info.extent.height || z >= info.extent.depth) { return; }                \n\
+                                                                                                                \n\
+    src += z * info.srcDepthStride + y * info.srcRowStride / 4 + x * blockByteCount / 4;                        \n\
+    dest += z * info.destDepthStride + y * info.destRowStride + x * sizeof(uint);                               \n\
+    VkExtent2D blockExtent;                                                                                     \n\
+    blockExtent.width = min(info.extent.width - x, 4u);                                                         \n\
+    blockExtent.height = min(info.extent.height - y, 4u);                                                       \n\
+    uint pixels[16] = {0};                                                                                      \n\
+    decompressDXTnBlock(src, pixels, blockExtent, 4 * sizeof(uint), info.format);                               \n\
+    device uint* destPixel = (device uint*)dest;                                                                \n\
+    for (uint j = 0; j < blockExtent.height; ++j) {                                                             \n\
+        for (uint i = 0; i < blockExtent.width; ++i) {                                                          \n\
+            destPixel[j * info.destRowStride / sizeof(uint) + i] = pixels[j * 4 + i];                           \n\
+        }                                                                                                       \n\
+    }                                                                                                           \n\
+}                                                                                                               \n\
+                                                                                                                \n\
 ";
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandPool.h b/MoltenVK/MoltenVK/Commands/MVKCommandPool.h
index 8e5e850..41971ec 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandPool.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandPool.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandPool.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm b/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
index 514dd78..cfac20a 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandPool.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommandPool.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
index 274f2c3..d6e558a 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
@@ -1,7 +1,7 @@
 /*
  * MVKCommandResourceFactory.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -259,6 +259,43 @@
 
 
 #pragma mark -
+#pragma mark MVKBufferDescriptorData
+
+/**
+ * Key to use for looking up cached MVKBuffer instances, and to create a new MVKBuffer when needed.
+ * The contents of this structure is a subset of the contents of the VkBufferCreateInfo structure.
+ *
+ * This structure can be used as a key in a std::map and std::unordered_map.
+ */
+typedef struct MVKBufferDescriptorData_t {
+    VkDeviceSize             size;
+    VkBufferUsageFlags       usage;
+
+    bool operator==(const MVKBufferDescriptorData_t& rhs) const {
+        return (memcmp(this, &rhs, sizeof(*this)) == 0);
+    }
+
+	std::size_t hash() const {
+		return mvkHash((uint64_t*)this, sizeof(*this) / sizeof(uint64_t));
+	}
+
+    MVKBufferDescriptorData_t() { memset(this, 0, sizeof(*this)); }
+
+} __attribute__((aligned(sizeof(uint64_t)))) MVKBufferDescriptorData;
+
+/**
+ * Hash structure implementation for MVKBufferDescriptorData in std namespace, so
+ * MVKBufferDescriptorData can be used as a key in a std::map and std::unordered_map.
+ */
+namespace std {
+    template <>
+    struct hash<MVKBufferDescriptorData> {
+        std::size_t operator()(const MVKBufferDescriptorData& k) const { return k.hash(); }
+    };
+}
+
+
+#pragma mark -
 #pragma mark MVKCommandResourceFactory
 
 /** 
@@ -308,12 +345,23 @@
      */
     MVKImage* newMVKImage(MVKImageDescriptorData& imgData);
     
+    /**
+     * Returns a new MVKBuffer configured with content held in Private storage.
+     * The buffer returned is bound to a new device memory, also returned, and
+     * can be used as a temporary buffer during buffer-image transfers.
+     */
+    MVKBuffer* newMVKBuffer(MVKBufferDescriptorData& buffData, MVKDeviceMemory*& buffMem);
+    
     /** Returns a new MTLComputePipelineState for copying between two buffers with byte-aligned copy regions. */
     id<MTLComputePipelineState> newCmdCopyBufferBytesMTLComputePipelineState();
 
 	/** Returns a new MTLComputePipelineState for filling a buffer. */
 	id<MTLComputePipelineState> newCmdFillBufferMTLComputePipelineState();
 
+	/** Returns a new MTLComputePipelineState for copying between a buffer holding compressed data and a 3D image. */
+	id<MTLComputePipelineState> newCmdCopyBufferToImage3DDecompressMTLComputePipelineState(bool needTempBuf);
+
+
 #pragma mark Construction
 
 	MVKCommandResourceFactory(MVKDevice* device);
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
index 91602a2..ddc7b19 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm
@@ -1,7 +1,7 @@
 /*
  * MVKCommandResourceFactory.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 #include "MVKCommandPipelineStateFactoryShaderSource.h"
 #include "MVKPipeline.h"
 #include "MVKFoundation.h"
+#include "MVKBuffer.h"
 #include "NSString+MoltenVK.h"
 #include "MTLRenderPipelineDescriptor+MoltenVK.h"
 #include "MVKLogging.h"
@@ -342,6 +343,35 @@
 	return mvkImg;
 }
 
+MVKBuffer* MVKCommandResourceFactory::newMVKBuffer(MVKBufferDescriptorData& buffData, MVKDeviceMemory*& buffMem) {
+    const VkBufferCreateInfo createInfo = {
+        .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+        .pNext = nullptr,
+        .flags = 0,
+        .size = buffData.size,
+        .usage = buffData.usage,
+        .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
+        .queueFamilyIndexCount = 0,
+        .pQueueFamilyIndices = nullptr,
+    };
+    MVKBuffer* mvkBuff = _device->createBuffer(&createInfo, nullptr);
+    const VkMemoryDedicatedAllocateInfo dedicatedInfo = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+        .pNext = nullptr,
+        .image = VK_NULL_HANDLE,
+        .buffer = (VkBuffer)mvkBuff,
+    };
+    const VkMemoryAllocateInfo allocInfo = {
+    	.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+    	.pNext = &dedicatedInfo,
+    	.allocationSize = buffData.size,
+    	.memoryTypeIndex = _device->getVulkanMemoryTypeIndex(MTLStorageModePrivate),
+    };
+    buffMem = _device->allocateMemory(&allocInfo, nullptr);
+    mvkBuff->bindDeviceMemory(buffMem, 0);
+    return mvkBuff;
+}
+
 id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdCopyBufferBytesMTLComputePipelineState() {
 	return newMTLComputePipelineState(getFunctionNamed("cmdCopyBufferBytes"));
 }
@@ -350,6 +380,11 @@
 	return newMTLComputePipelineState(getFunctionNamed("cmdFillBuffer"));
 }
 
+id<MTLComputePipelineState> MVKCommandResourceFactory::newCmdCopyBufferToImage3DDecompressMTLComputePipelineState(bool needTempBuf) {
+	return newMTLComputePipelineState(getFunctionNamed(needTempBuf ? "cmdCopyBufferToImage3DDecompressTempBufferDXTn" :
+																	 "cmdCopyBufferToImage3DDecompressDXTn"));
+}
+
 
 #pragma mark Support methods
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.h b/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.h
index 8cfdb50..c86c6f4 100644
--- a/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.h
+++ b/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.h
@@ -1,7 +1,7 @@
 /*
  * MVKMTLBufferAllocation.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.mm b/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.mm
index 368fd66..3f73a54 100644
--- a/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKMTLBufferAllocation.mm
@@ -1,7 +1,7 @@
 /*
  * MVKMTLBufferAllocation.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Commands/MVKMTLResourceBindings.h b/MoltenVK/MoltenVK/Commands/MVKMTLResourceBindings.h
index ddb615a..3316594 100644
--- a/MoltenVK/MoltenVK/Commands/MVKMTLResourceBindings.h
+++ b/MoltenVK/MoltenVK/Commands/MVKMTLResourceBindings.h
@@ -1,7 +1,7 @@
 /*
  * MVKMTLResourceBindings.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.h b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.h
index dcb972b..3cf4155 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.h
@@ -1,7 +1,7 @@
 /*
  * MVKBuffer.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
index 9d5ed4b..061a702 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
@@ -1,7 +1,7 @@
 /*
  * MVKBuffer.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
index 782cbf6..b94c9ff 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h
@@ -1,7 +1,7 @@
 /*
  * MVKDescriptorSet.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -171,7 +171,7 @@
 	friend class MVKPipelineLayout;
 	friend class MVKDescriptorSet;
 
-	MVKVector<MVKDescriptorSetLayoutBinding> _bindings;
+	MVKVectorInline<MVKDescriptorSetLayoutBinding, 8> _bindings;
 	std::unordered_map<uint32_t, uint32_t> _bindingToIndex;
 	MVKShaderResourceBinding _mtlResourceCounts;
 	bool _isPushDescriptorLayout : 1;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
index d8370ca..4d7e64f 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
@@ -1,7 +1,7 @@
 /*
  * MVKDescriptorSetLayout.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
index c0d7459..19f7ea3 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
@@ -1,7 +1,7 @@
 /*
  * MVKDevice.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -277,7 +277,7 @@
 	void initFeatures();
 	void initProperties();
 	void initMemoryProperties();
-	void initQueueFamilies();
+	std::vector<MVKQueueFamily*>& getQueueFamilies();
 	void initPipelineCacheUUID();
 	MTLFeatureSet getHighestMTLFeatureSet();
 	void logGPUInfo();
@@ -581,6 +581,7 @@
 	MVKResource* addResource(MVKResource* rez);
 	MVKResource* removeResource(MVKResource* rez);
     void initPerformanceTracking();
+	void initPhysicalDevice(MVKPhysicalDevice* physicalDevice);
 	void initQueues(const VkDeviceCreateInfo* pCreateInfo);
     const char* getActivityPerformanceDescription(MVKPerformanceTracker& shaderCompilationEvent);
 	uint64_t getPerformanceTimestampImpl();
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index de5e7f8..3e1bc09 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -1,7 +1,7 @@
 /*
  * MVKDevice.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@
 #include "MVKRenderPass.h"
 #include "MVKCommandPool.h"
 #include "MVKFoundation.h"
+#include "MVKCodec.h"
 #include "MVKEnvironment.h"
 #include "MVKOSExtensions.h"
 #include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
@@ -62,16 +63,16 @@
     if (features) {
         features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
         features->features = _features;
-        auto* next = (VkStructureType*)features->pNext;
+        auto* next = (MVKVkAPIStructHeader*)features->pNext;
         while (next) {
-            switch (*next) {
+            switch (next->sType) {
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
                 auto* storageFeatures = (VkPhysicalDevice16BitStorageFeatures*)next;
                 storageFeatures->storageBuffer16BitAccess = true;
                 storageFeatures->uniformAndStorageBuffer16BitAccess = true;
                 storageFeatures->storagePushConstant16 = true;
                 storageFeatures->storageInputOutput16 = true;
-                next = (VkStructureType*)storageFeatures->pNext;
+                next = (MVKVkAPIStructHeader*)storageFeatures->pNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: {
@@ -79,25 +80,32 @@
                 storageFeatures->storageBuffer8BitAccess = true;
                 storageFeatures->uniformAndStorageBuffer8BitAccess = true;
                 storageFeatures->storagePushConstant8 = true;
-                next = (VkStructureType*)storageFeatures->pNext;
+                next = (MVKVkAPIStructHeader*)storageFeatures->pNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: {
                 auto* f16Features = (VkPhysicalDeviceFloat16Int8FeaturesKHR*)next;
                 f16Features->shaderFloat16 = true;
                 f16Features->shaderInt8 = false;  // FIXME Needs SPIRV-Cross update
-                next = (VkStructureType*)f16Features->pNext;
+                next = (MVKVkAPIStructHeader*)f16Features->pNext;
+                break;
+            }
+            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES: {
+                auto* varPtrFeatures = (VkPhysicalDeviceVariablePointerFeatures*)next;
+                varPtrFeatures->variablePointersStorageBuffer = true;
+                varPtrFeatures->variablePointers = true;
+                next = (MVKVkAPIStructHeader*)varPtrFeatures->pNext;
                 break;
             }
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
                 auto* divisorFeatures = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*)next;
                 divisorFeatures->vertexAttributeInstanceRateDivisor = true;
                 divisorFeatures->vertexAttributeInstanceRateZeroDivisor = true;
-                next = (VkStructureType*)divisorFeatures->pNext;
+                next = (MVKVkAPIStructHeader*)divisorFeatures->pNext;
                 break;
             }
             default:
-                next = (VkStructureType*)((VkPhysicalDeviceFeatures2*)next)->pNext;
+                next = (MVKVkAPIStructHeader*)next->pNext;
                 break;
             }
         }
@@ -261,10 +269,22 @@
                 return VK_ERROR_FORMAT_NOT_SUPPORTED;
             }
 			// Metal does not allow compressed or depth/stencil formats on 3D textures
-			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil ||
-				mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
+			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatDepthStencil
+#if MVK_IOS
+				|| mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed
+#endif
+				) {
 				return VK_ERROR_FORMAT_NOT_SUPPORTED;
 			}
+#if MVK_MACOS
+			if (mvkFormatTypeFromVkFormat(format) == kMVKFormatCompressed) {
+				// If this is a compressed format and there's no codec, it isn't
+				// supported.
+				if (!mvkCanDecodeFormat(format) ) { return VK_ERROR_FORMAT_NOT_SUPPORTED; }
+				// Compressed multisampled textures aren't supported.
+				sampleCounts = VK_SAMPLE_COUNT_1_BIT;
+			}
+#endif
             maxExt.width = pLimits->maxImageDimension3D;
             maxExt.height = pLimits->maxImageDimension3D;
             maxExt.depth = pLimits->maxImageDimension3D;
@@ -341,10 +361,8 @@
 
     VkExtent2D surfExtnt = mvkVkExtent2DFromCGSize(mtlLayer.naturalDrawableSizeMVK);
 
-	// Metal supports 3 concurrent drawables, but if the swapchain is destroyed and
-	// rebuilt as part of resizing, one will be held by the current display image.
-	pSurfaceCapabilities->minImageCount = 2;
-	pSurfaceCapabilities->maxImageCount = 2;
+	pSurfaceCapabilities->minImageCount = _metalFeatures.minSwapchainImageCount;
+	pSurfaceCapabilities->maxImageCount = _metalFeatures.maxSwapchainImageCount;
 
 	pSurfaceCapabilities->currentExtent = surfExtnt;
 	pSurfaceCapabilities->minImageExtent = surfExtnt;
@@ -406,40 +424,72 @@
 	CAMetalLayer* mtlLayer = surface->getCAMetalLayer();
 	if ( !mtlLayer ) { return surface->getConfigurationResult(); }
 
-	vector<VkPresentModeKHR> presentModes;
-	presentModes.push_back(VK_PRESENT_MODE_FIFO_KHR);
+#define ADD_VK_PRESENT_MODE(VK_PM)																	\
+	do {																							\
+		if (pPresentModes && presentModesCnt < *pCount) { pPresentModes[presentModesCnt] = VK_PM; }	\
+		presentModesCnt++;																			\
+	} while(false)
+
+	uint32_t presentModesCnt = 0;
+
+	ADD_VK_PRESENT_MODE(VK_PRESENT_MODE_FIFO_KHR);
 
 	if (_metalFeatures.presentModeImmediate) {
-		presentModes.push_back(VK_PRESENT_MODE_IMMEDIATE_KHR);
+		ADD_VK_PRESENT_MODE(VK_PRESENT_MODE_IMMEDIATE_KHR);
 	}
 
-	uint32_t presentModesCnt = uint32_t(presentModes.size());
-
-	// If properties aren't actually being requested yet, simply update the returned count
-	if ( !pPresentModes ) {
-		*pCount = presentModesCnt;
-		return VK_SUCCESS;
+	if (pPresentModes && *pCount < presentModesCnt) {
+		return VK_INCOMPLETE;
 	}
 
-	// Determine how many results we'll return, and return that number
-	VkResult result = (*pCount <= presentModesCnt) ? VK_SUCCESS : VK_INCOMPLETE;
-	*pCount = min(*pCount, presentModesCnt);
-
-	// Now populate the supplied array
-	for (uint fmtIdx = 0; fmtIdx < *pCount; fmtIdx++) {
-		pPresentModes[fmtIdx] = presentModes[fmtIdx];
-	}
-
-	return result;
+	*pCount = presentModesCnt;
+	return VK_SUCCESS;
 }
 
 
 #pragma mark Queues
 
+// Returns the queue families supported by this instance, lazily creating them if necessary.
+// Metal does not distinguish functionality between queues, which would normally lead us
+// to create only only one general-purpose queue family. However, Vulkan associates command
+// buffers with a queue family, whereas Metal associates command buffers with a Metal queue.
+// In order to allow a Metal command buffer to be prefilled before is is formally submitted to
+// a Vulkan queue, we need to enforce that each Vulkan queue family can have only one Metal queue.
+// In order to provide parallel queue operations, we therefore provide multiple queue families.
+vector<MVKQueueFamily*>& MVKPhysicalDevice::getQueueFamilies() {
+	if (_queueFamilies.empty()) {
+		VkQueueFamilyProperties qfProps;
+		bool specialize = _mvkInstance->getMoltenVKConfiguration()->specializedQueueFamilies;
+		uint32_t qfIdx = 0;
+
+		qfProps.queueCount = 1;		// Each queue family must have a single Metal queue (see above)
+		qfProps.timestampValidBits = 64;
+		qfProps.minImageTransferGranularity = { 1, 1, 1};
+
+		// General-purpose queue family
+		qfProps.queueFlags = (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT);
+		_queueFamilies.push_back(new MVKQueueFamily(this, qfIdx++, &qfProps));
+
+		// Dedicated graphics queue family...or another general-purpose queue family.
+		if (specialize) { qfProps.queueFlags = (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_TRANSFER_BIT); }
+		_queueFamilies.push_back(new MVKQueueFamily(this, qfIdx++, &qfProps));
+
+		// Dedicated compute queue family...or another general-purpose queue family.
+		if (specialize) { qfProps.queueFlags = (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT); }
+		_queueFamilies.push_back(new MVKQueueFamily(this, qfIdx++, &qfProps));
+
+		// Dedicated transfer queue family...or another general-purpose queue family.
+		if (specialize) { qfProps.queueFlags = VK_QUEUE_TRANSFER_BIT; }
+		_queueFamilies.push_back(new MVKQueueFamily(this, qfIdx++, &qfProps));
+	}
+	return _queueFamilies;
+}
+
 VkResult MVKPhysicalDevice::getQueueFamilyProperties(uint32_t* pCount,
 													 VkQueueFamilyProperties* queueProperties) {
 
-	uint32_t qfCnt = uint32_t(_queueFamilies.size());
+	vector<MVKQueueFamily*> qFams = getQueueFamilies();
+	uint32_t qfCnt = uint32_t(qFams.size());
 
 	// If properties aren't actually being requested yet, simply update the returned count
 	if ( !queueProperties ) {
@@ -453,7 +503,7 @@
 	// Now populate the queue families
 	if (queueProperties) {
 		for (uint32_t qfIdx = 0; qfIdx < *pCount; qfIdx++) {
-			_queueFamilies[qfIdx]->getProperties(&queueProperties[qfIdx]);
+			qFams[qfIdx]->getProperties(&queueProperties[qfIdx]);
 		}
 	}
 
@@ -463,7 +513,8 @@
 VkResult MVKPhysicalDevice::getQueueFamilyProperties(uint32_t* pCount,
 													 VkQueueFamilyProperties2KHR* queueProperties) {
 
-	uint32_t qfCnt = uint32_t(_queueFamilies.size());
+	vector<MVKQueueFamily*> qFams = getQueueFamilies();
+	uint32_t qfCnt = uint32_t(qFams.size());
 
 	// If properties aren't actually being requested yet, simply update the returned count
 	if ( !queueProperties ) {
@@ -478,7 +529,7 @@
 	if (queueProperties) {
 		for (uint32_t qfIdx = 0; qfIdx < *pCount; qfIdx++) {
 			queueProperties[qfIdx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR;
-			_queueFamilies[qfIdx]->getProperties(&queueProperties[qfIdx].queueFamilyProperties);
+			qFams[qfIdx]->getProperties(&queueProperties[qfIdx].queueFamilyProperties);
 		}
 	}
 
@@ -505,6 +556,17 @@
 
 #pragma mark Construction
 
+MVKPhysicalDevice::MVKPhysicalDevice(MVKInstance* mvkInstance, id<MTLDevice> mtlDevice) {
+	_mvkInstance = mvkInstance;
+	_mtlDevice = [mtlDevice retain];
+
+	initMetalFeatures();        // Call first.
+	initFeatures();             // Call second.
+	initProperties();           // Call third.
+	initMemoryProperties();
+	logGPUInfo();
+}
+
 /** Initializes the Metal-specific physical device features of this instance. */
 void MVKPhysicalDevice::initMetalFeatures() {
 	memset(&_metalFeatures, 0, sizeof(_metalFeatures));	// Start with everything cleared
@@ -518,6 +580,10 @@
 
 	_metalFeatures.ioSurfaces = MVK_SUPPORT_IOSURFACE_BOOL;
 
+	// Metal supports 2 or 3 concurrent CAMetalLayer drawables.
+	_metalFeatures.minSwapchainImageCount = 2;
+	_metalFeatures.maxSwapchainImageCount = 3;
+
 #if MVK_IOS
     _metalFeatures.mslVersion = SPIRVToMSLConverterOptions::makeMSLVersion(1);
     _metalFeatures.maxPerStageTextureCount = 31;
@@ -1262,33 +1328,6 @@
 			   SPIRVToMSLConverterOptions::printMSLVersion(_metalFeatures.mslVersion).c_str());
 }
 
-// Initializes the queue families supported by this instance.
-void MVKPhysicalDevice::initQueueFamilies() {
-	VkQueueFamilyProperties qfProps;
-	uint32_t qfIdx;
-
-	qfProps.queueCount = 1;		// In Metal, each family must have a single queue
-
-	qfIdx = 0;
-	qfProps.queueFlags = (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT);
-	qfProps.timestampValidBits = 64;
-	qfProps.minImageTransferGranularity = { 1, 1, 1};
-
-	_queueFamilies.push_back(new MVKQueueFamily(this, qfIdx, &qfProps));
-}
-
-MVKPhysicalDevice::MVKPhysicalDevice(MVKInstance* mvkInstance, id<MTLDevice> mtlDevice) {
-	_mvkInstance = mvkInstance;
-	_mtlDevice = [mtlDevice retain];
-
-    initMetalFeatures();        // Call first.
-	initFeatures();             // Call second.
-	initProperties();           // Call third.
-	initMemoryProperties();
-	initQueueFamilies();
-	logGPUInfo();
-}
-
 MVKPhysicalDevice::~MVKPhysicalDevice() {
 	mvkDestroyContainerContents(_queueFamilies);
 	[_mtlDevice release];
@@ -1761,27 +1800,7 @@
 MVKDevice::MVKDevice(MVKPhysicalDevice* physicalDevice, const VkDeviceCreateInfo* pCreateInfo) {
 
 	initPerformanceTracking();
-    
-#if MVK_MACOS
-    //on mac OS, the wrong GPU will drive the screen (graphics switching will not occur)
-    //unless we call this specific MTLCreateSystemDefaultDevice method to create the metal device
-    id<MTLDevice> device = physicalDevice->getMTLDevice();
-    if (!device.headless && !device.lowPower) {
-        id<MTLDevice> sysDefaultDevice = MTLCreateSystemDefaultDevice();
-        
-        //lets be 100% sure this is the device the user asked for
-        if (sysDefaultDevice.registryID == device.registryID) {
-            physicalDevice->replaceMTLDevice(sysDefaultDevice);
-        }
-    }
-#endif
-
-	_physicalDevice = physicalDevice;
-	_pMVKConfig = _physicalDevice->_mvkInstance->getMoltenVKConfiguration();
-	_pFeatures = &_physicalDevice->_features;
-	_pMetalFeatures = _physicalDevice->getMetalFeatures();
-	_pProperties = &_physicalDevice->_properties;
-	_pMemoryProperties = &_physicalDevice->_memoryProperties;
+	initPhysicalDevice(physicalDevice);
 
     _globalVisibilityResultMTLBuffer = nil;
     _globalVisibilityQueryCount = 0;
@@ -1821,13 +1840,38 @@
 	_performanceStatistics.queue.mtlQueueAccess = initPerf;
 }
 
+void MVKDevice::initPhysicalDevice(MVKPhysicalDevice* physicalDevice) {
+
+	_physicalDevice = physicalDevice;
+	_pMVKConfig = _physicalDevice->_mvkInstance->getMoltenVKConfiguration();
+	_pFeatures = &_physicalDevice->_features;
+	_pMetalFeatures = _physicalDevice->getMetalFeatures();
+	_pProperties = &_physicalDevice->_properties;
+	_pMemoryProperties = &_physicalDevice->_memoryProperties;
+
+#if MVK_MACOS
+	// If we have selected a high-power GPU and want to force the window system
+	// to use it, force the window system to use a high-power GPU by calling the
+	// MTLCreateSystemDefaultDevice function, and if that GPU is the same as the
+	// selected GPU, update the MTLDevice instance used by the MVKPhysicalDevice.
+	id<MTLDevice> mtlDevice = _physicalDevice->getMTLDevice();
+	if (_pMVKConfig->switchSystemGPU && !(mtlDevice.lowPower || mtlDevice.headless) ) {
+		id<MTLDevice> sysMTLDevice = MTLCreateSystemDefaultDevice();
+		if (sysMTLDevice.registryID == mtlDevice.registryID) {
+			_physicalDevice->replaceMTLDevice(sysMTLDevice);
+		}
+	}
+#endif
+}
+
 // Create the command queues
 void MVKDevice::initQueues(const VkDeviceCreateInfo* pCreateInfo) {
+	vector<MVKQueueFamily*> qFams = _physicalDevice->getQueueFamilies();
 	uint32_t qrCnt = pCreateInfo->queueCreateInfoCount;
 	for (uint32_t qrIdx = 0; qrIdx < qrCnt; qrIdx++) {
 		const VkDeviceQueueCreateInfo* pQFInfo = &pCreateInfo->pQueueCreateInfos[qrIdx];
 		uint32_t qfIdx = pQFInfo->queueFamilyIndex;
-		MVKQueueFamily* qFam = _physicalDevice->_queueFamilies[qfIdx];
+		MVKQueueFamily* qFam = qFams[qfIdx];
 		_queuesByQueueFamilyIndex.resize(qfIdx + 1);	// Ensure an entry for this queue family exists
 		auto& queues = _queuesByQueueFamilyIndex[qfIdx];
 		for (uint32_t qIdx = 0; qIdx < pQFInfo->queueCount; qIdx++) {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
index baeda6b..ced14e9 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.h
@@ -1,7 +1,7 @@
 /*
  * MVKDeviceMemory.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
index 99ec0e6..224f651 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm
@@ -1,7 +1,7 @@
 /*
  * MVKDeviceMemory.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
index 3449925..b109348 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
@@ -1,7 +1,7 @@
 /*
  * MVKFramebuffer.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm
index 878b7f4..57dd79d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm
@@ -1,7 +1,7 @@
 /*
  * MVKFramebuffer.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
index 4f45043..bdf64a5 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
@@ -1,7 +1,7 @@
 /*
  * MVKImage.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -238,6 +238,7 @@
     bool _hasExpectedTexelSize;
 	bool _usesTexelBuffer;
 	bool _isLinear;
+	bool _is3DCompressed;
 };
 
 
@@ -288,8 +289,6 @@
 	void initMTLTextureViewSupport();
     MTLPixelFormat getSwizzledMTLPixelFormat(VkFormat format, VkComponentMapping components, bool& useSwizzle);
     bool matchesSwizzle(VkComponentMapping components, VkComponentMapping pattern);
-    const char* getSwizzleName(VkComponentSwizzle swizzle);
-    uint32_t packSwizzle(VkComponentMapping components);
 	void validateImageViewConfig(const VkImageViewCreateInfo* pCreateInfo);
 
     MVKImage* _image;
@@ -397,7 +396,7 @@
 	uint32_t _swapchainIndex;
 	id<CAMetalDrawable> _mtlDrawable;
 	std::mutex _availabilityLock;
-	MVKVector<MVKSwapchainSignaler> _availabilitySignalers;
+	MVKVectorInline<MVKSwapchainSignaler, 4> _availabilitySignalers;
 	MVKSwapchainSignaler _preSignaled;
 	MVKSwapchainImageAvailability _availability;
 };
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
index 46f0470..715470b 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
@@ -1,7 +1,7 @@
 /*
  * MVKImage.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include "MVKFoundation.h"
 #include "MVKEnvironment.h"
 #include "MVKLogging.h"
+#include "MVKCodec.h"
 #import "MTLTextureDescriptor+MoltenVK.h"
 #import "MTLSamplerDescriptor+MoltenVK.h"
 
@@ -387,13 +388,30 @@
 		mvkDisableFlag(usage, MTLTextureUsageRenderTarget);
 	}
 
+#if MVK_MACOS
+	// If this is a 3D compressed texture, tell Metal we might write to it.
+	if (_is3DCompressed) {
+		mvkEnableFlag(usage, MTLTextureUsageShaderWrite);
+	}
+#endif
+
 	return usage;
 }
 
 // Returns an autoreleased Metal texture descriptor constructed from the properties of this image.
 MTLTextureDescriptor* MVKImage::getMTLTextureDescriptor() {
 	MTLTextureDescriptor* mtlTexDesc = [[MTLTextureDescriptor alloc] init];
+#if MVK_MACOS
+	if (_is3DCompressed) {
+		// Metal doesn't yet support 3D compressed textures, so we'll decompress
+		// the texture ourselves. This, then, is the *uncompressed* format.
+		mtlTexDesc.pixelFormat = MTLPixelFormatBGRA8Unorm;
+	} else {
+		mtlTexDesc.pixelFormat = _mtlPixelFormat;
+	}
+#else
 	mtlTexDesc.pixelFormat = _mtlPixelFormat;
+#endif
 	mtlTexDesc.textureType = _mtlTextureType;
 	mtlTexDesc.width = _extent.width;
 	mtlTexDesc.height = _extent.height;
@@ -447,6 +465,27 @@
     mtlRegion.origin = MTLOriginMake(0, 0, 0);
     mtlRegion.size = mvkMTLSizeFromVkExtent3D(mipExtent);
 
+#if MVK_MACOS
+    std::unique_ptr<char[]> decompBuffer;
+    if (_is3DCompressed) {
+        // We cannot upload the texture data directly in this case. But we
+        // can upload the decompressed image data.
+        std::unique_ptr<MVKCodec> codec = mvkCreateCodec(getVkFormat());
+        if (!codec) {
+            mvkNotifyErrorWithText(VK_ERROR_FORMAT_NOT_SUPPORTED, "A 3D texture used a compressed format that MoltenVK does not yet support.");
+            return;
+        }
+        VkSubresourceLayout destLayout;
+        destLayout.rowPitch = 4 * mipExtent.width;
+        destLayout.depthPitch = destLayout.rowPitch * mipExtent.height;
+        destLayout.size = destLayout.depthPitch * mipExtent.depth;
+        decompBuffer = std::unique_ptr<char[]>(new char[destLayout.size]);
+        codec->decompress(decompBuffer.get(), pImgBytes, destLayout, imgLayout, mipExtent);
+        pImgBytes = decompBuffer.get();
+        imgLayout = destLayout;
+    }
+#endif
+
     [getMTLTexture() replaceRegion: mtlRegion
                        mipmapLevel: imgSubRez.mipLevel
                              slice: imgSubRez.arrayLayer
@@ -499,9 +538,15 @@
         setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Metal does not allow uncompressed views of compressed images."));
     }
 
+#if MVK_IOS
     if ( (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatCompressed) ) {
         setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, compressed formats may only be used with 2D images."));
     }
+#else
+    if ( (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatCompressed) && !mvkCanDecodeFormat(pCreateInfo->format) ) {
+        setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, compressed formats may only be used with 2D images."));
+    }
+#endif
     if ( (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) && (mvkFormatTypeFromVkFormat(pCreateInfo->format) == kMVKFormatDepthStencil) ) {
         setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : Under Metal, depth/stencil formats may only be used with 2D images."));
     }
@@ -552,6 +597,7 @@
     _hasExpectedTexelSize = (mvkMTLPixelFormatBytesPerBlock(_mtlPixelFormat) == mvkVkFormatBytesPerBlock(pCreateInfo->format));
 	_isLinear = validateLinear(pCreateInfo);
 	_usesTexelBuffer = false;
+	_is3DCompressed = _mtlTextureType == MTLTextureType3D && mvkFormatTypeFromMTLPixelFormat(_mtlPixelFormat) == kMVKFormatCompressed;
 
 	_byteAlignment = _isLinear ? _device->getVkFormatTexelBufferAlignment(pCreateInfo->format) : mvkEnsurePowerOfTwo(mvkVkFormatBytesPerBlock(pCreateInfo->format));
 
@@ -752,7 +798,7 @@
     _mtlPixelFormat = getSwizzledMTLPixelFormat(pCreateInfo->format, pCreateInfo->components, useSwizzle);
 	_mtlTextureType = mvkMTLTextureTypeFromVkImageViewType(pCreateInfo->viewType, (_image->getSampleCount() != VK_SAMPLE_COUNT_1_BIT));
 	initMTLTextureViewSupport();
-	_packedSwizzle = useSwizzle ? packSwizzle(pCreateInfo->components) : 0;
+	_packedSwizzle = useSwizzle ? mvkPackSwizzle(pCreateInfo->components) : 0;
 }
 
 // Validate whether the image view configuration can be supported
@@ -850,19 +896,6 @@
     return mtlPF;
 }
 
-const char*  MVKImageView::getSwizzleName(VkComponentSwizzle swizzle) {
-    switch (swizzle) {
-        case VK_COMPONENT_SWIZZLE_IDENTITY: return "VK_COMPONENT_SWIZZLE_IDENTITY";
-        case VK_COMPONENT_SWIZZLE_ZERO:     return "VK_COMPONENT_SWIZZLE_ZERO";
-        case VK_COMPONENT_SWIZZLE_ONE:      return "VK_COMPONENT_SWIZZLE_ONE";
-        case VK_COMPONENT_SWIZZLE_R:        return "VK_COMPONENT_SWIZZLE_R";
-        case VK_COMPONENT_SWIZZLE_G:        return "VK_COMPONENT_SWIZZLE_G";
-        case VK_COMPONENT_SWIZZLE_B:        return "VK_COMPONENT_SWIZZLE_B";
-        case VK_COMPONENT_SWIZZLE_A:        return "VK_COMPONENT_SWIZZLE_A";
-        default:                            return "VK_COMPONENT_SWIZZLE_UNKNOWN";
-    }
-}
-
 // Returns whether the swizzle components of the internal VkComponentMapping matches the
 // swizzle pattern, by comparing corresponding elements of the two structures. The pattern
 // supports wildcards, in that any element of pattern can be set to VK_COMPONENT_SWIZZLE_MAX_ENUM
@@ -880,12 +913,6 @@
     return true;
 }
 
-// Packs a VkComponentMapping structure into a single 32-bit word.
-uint32_t MVKImageView::packSwizzle(VkComponentMapping components) {
-    return ((components.r & 0xFF) << 0) | ((components.g & 0xFF) << 8) |
-           ((components.b & 0xFF) << 16) | ((components.a & 0xFF) << 24);
-}
-
 // Determine whether this image view should use a Metal texture view,
 // and set the _useMTLTextureView variable appropriately.
 void MVKImageView::initMTLTextureViewSupport() {
@@ -1000,7 +1027,7 @@
 		// If this image is not yet available, extract and signal the first semaphore and fence.
 
 		signaler = _availabilitySignalers.front();
-                _availabilitySignalers.erase( _availabilitySignalers.begin() );
+    _availabilitySignalers.erase( _availabilitySignalers.begin() );
 		//_availabilitySignalers.pop_front();
 	}
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
index 9c6fdc2..c29038a 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
@@ -1,7 +1,7 @@
 /*
  * MVKInstance.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
index 462fe40..185ea46 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
@@ -1,7 +1,7 @@
 /*
  * MVKInstance.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include "MVKFoundation.h"
 #include "MVKEnvironment.h"
 #include "MVKSurface.h"
+#include "MVKOSExtensions.h"
 
 using namespace std;
 
@@ -125,7 +126,10 @@
 
 	if (MVK_VULKAN_API_VERSION_CONFORM(MVK_VULKAN_API_VERSION) <
 		MVK_VULKAN_API_VERSION_CONFORM(_appInfo.apiVersion)) {
-		setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INCOMPATIBLE_DRIVER, "Request for driver version %x is not compatible with provided version %x.", _appInfo.apiVersion, MVK_VULKAN_API_VERSION));
+		setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INCOMPATIBLE_DRIVER,
+													  "Request for Vulkan version %s is not compatible with supported version %s.",
+													  mvkGetVulkanVersionString(_appInfo.apiVersion).c_str(),
+													  mvkGetVulkanVersionString(MVK_VULKAN_API_VERSION).c_str()));
 	}
 
 	// Populate the array of physical GPU devices
@@ -338,31 +342,32 @@
 }
 
 void MVKInstance::logVersions() {
-    uint32_t buffLen = 32;
-    char mvkVer[buffLen];
-    char vkVer[buffLen];
-    vkGetVersionStringsMVK(mvkVer, buffLen, vkVer, buffLen);
-
-	string logMsg = "MoltenVK version %s. Vulkan version %s.";
-	logMsg += "\n\tThe following Vulkan extensions are supported:";
+	string logMsg = "MoltenVK version ";
+	logMsg += mvkGetMoltenVKVersionString(MVK_VERSION);
+	logMsg += ". Vulkan version ";
+	logMsg += mvkGetVulkanVersionString(MVK_VULKAN_API_VERSION);
+	logMsg += ".\n\tThe following Vulkan extensions are supported:";
 	logMsg += getDriverLayer()->getSupportedExtensions()->enabledNamesString("\n\t\t", true);
-	MVKLogInfo(logMsg.c_str(), mvkVer, vkVer);
+	MVKLogInfo("%s", logMsg.c_str());
 }
 
 // Init config.
 void MVKInstance::initConfig() {
-	_mvkConfig.debugMode							= MVK_DEBUG;
-	_mvkConfig.shaderConversionFlipVertexY			= MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y;
-	_mvkConfig.synchronousQueueSubmits				= MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS;
-	_mvkConfig.prefillMetalCommandBuffers			= MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS;
-	_mvkConfig.maxActiveMetalCommandBuffersPerQueue	= MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_POOL;
-	_mvkConfig.supportLargeQueryPools				= MVK_CONFIG_SUPPORT_LARGE_QUERY_POOLS;
-	_mvkConfig.presentWithCommandBuffer				= MVK_CONFIG_PRESENT_WITH_COMMAND_BUFFER;
-	_mvkConfig.swapchainMagFilterUseNearest			= MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST;
-	_mvkConfig.displayWatermark						= MVK_CONFIG_DISPLAY_WATERMARK;
-	_mvkConfig.performanceTracking					= MVK_DEBUG;
-	_mvkConfig.performanceLoggingFrameCount			= MVK_DEBUG ? 300 : 0;
-	_mvkConfig.metalCompileTimeout					= MVK_CONFIG_METAL_COMPILE_TIMEOUT;
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.debugMode,                            MVK_DEBUG);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.shaderConversionFlipVertexY,          MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.synchronousQueueSubmits,              MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.prefillMetalCommandBuffers,           MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS);
+	MVK_SET_FROM_ENV_OR_BUILD_INT32(_mvkConfig.maxActiveMetalCommandBuffersPerQueue, MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.supportLargeQueryPools,               MVK_CONFIG_SUPPORT_LARGE_QUERY_POOLS);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.presentWithCommandBuffer,             MVK_CONFIG_PRESENT_WITH_COMMAND_BUFFER);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.swapchainMagFilterUseNearest,         MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST);
+	MVK_SET_FROM_ENV_OR_BUILD_INT64(_mvkConfig.metalCompileTimeout,                  MVK_CONFIG_METAL_COMPILE_TIMEOUT);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.performanceTracking,                  MVK_CONFIG_PERFORMANCE_TRACKING);
+	MVK_SET_FROM_ENV_OR_BUILD_INT32(_mvkConfig.performanceLoggingFrameCount,         MVK_CONFIG_PERFORMANCE_LOGGING_FRAME_COUNT);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.displayWatermark,                     MVK_CONFIG_DISPLAY_WATERMARK);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.specializedQueueFamilies,             MVK_CONFIG_SPECIALIZED_QUEUE_FAMILIES);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.switchSystemGPU,                      MVK_CONFIG_SWITCH_SYSTEM_GPU);
+	MVK_SET_FROM_ENV_OR_BUILD_BOOL( _mvkConfig.fullImageViewSwizzle,                 MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE);
 }
 
 VkResult MVKInstance::verifyLayers(uint32_t count, const char* const* names) {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
index 67c7d65..5132a05 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
@@ -1,7 +1,7 @@
 /*
  * MVKPipeline.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -34,18 +34,14 @@
 
 
 #pragma mark -
-#pragma mark MVKShaderAuxBufferBinding
+#pragma mark MVKPipelineLayout
 
 struct MVKShaderAuxBufferBinding {
-	uint32_t vertex;
-	uint32_t fragment;
-	uint32_t compute;
+	uint32_t vertex = 0;
+	uint32_t fragment = 0;
+	uint32_t compute = 0;
 };
 
-
-#pragma mark -
-#pragma mark MVKPipelineLayout
-
 /** Represents a Vulkan pipeline layout. */
 class MVKPipelineLayout : public MVKBaseDeviceObject {
 
@@ -81,9 +77,9 @@
 	MVKPipelineLayout(MVKDevice* device, const VkPipelineLayoutCreateInfo* pCreateInfo);
 
 protected:
-	MVKVector<MVKDescriptorSetLayout> _descriptorSetLayouts;
-	MVKVector<MVKShaderResourceBinding> _dslMTLResourceIndexOffsets;
-	MVKVector<VkPushConstantRange> _pushConstants;
+	MVKVectorInline<MVKDescriptorSetLayout, 8> _descriptorSetLayouts;
+	MVKVectorInline<MVKShaderResourceBinding, 8> _dslMTLResourceIndexOffsets;
+	MVKVectorInline<VkPushConstantRange, 8> _pushConstants;
 	MVKShaderResourceBinding _pushConstantsMTLResourceIndexes;
 	MVKShaderAuxBufferBinding _auxBufferIndex;
 };
@@ -128,12 +124,6 @@
     /** Returns whether this pipeline permits dynamic setting of the specifie state. */
     bool supportsDynamicState(VkDynamicState state);
 
-    /** Returns whether or not the vertex shader needs a buffer to hold auxiliary state. */
-    bool needsVertexAuxBuffer() { return _needsVertexAuxBuffer; }
-
-    /** Returns whether or not the fragment shader needs a buffer to hold auxiliary state. */
-    bool needsFragmentAuxBuffer() { return _needsFragmentAuxBuffer; }
-
 	/** Constructs an instance for the device and parent (which may be NULL). */
 	MVKGraphicsPipeline(MVKDevice* device,
 						MVKPipelineCache* pipelineCache,
@@ -152,8 +142,8 @@
 	VkPipelineRasterizationStateCreateInfo _rasterInfo;
 	VkPipelineDepthStencilStateCreateInfo _depthStencilInfo;
 
-  MVKVector<MTLViewport> _mtlViewports;
-  MVKVector<MTLScissorRect> _mtlScissors;
+  MVKVectorInline<MTLViewport, 8> _mtlViewports;
+  MVKVectorInline<MTLScissorRect, 8> _mtlScissors;
 
 	id<MTLRenderPipelineState> _mtlPipelineState;
 	MTLCullMode _mtlCullMode;
@@ -166,8 +156,8 @@
 
 	bool _dynamicStateEnabled[VK_DYNAMIC_STATE_RANGE_SIZE];
 	bool _hasDepthStencilInfo;
-	bool _needsVertexAuxBuffer;
-	bool _needsFragmentAuxBuffer;
+	bool _needsVertexAuxBuffer = false;
+	bool _needsFragmentAuxBuffer = false;
 };
 
 
@@ -182,9 +172,6 @@
 	/** Binds this pipeline to the specified command encoder. */
 	void encode(MVKCommandEncoder* cmdEncoder) override;
 
-	/** Returns whether or not the compute shader needs a buffer to hold auxiliary state. */
-	bool needsAuxBuffer() { return _needsAuxBuffer; }
-
 	/** Constructs an instance for the device and parent (which may be NULL). */
 	MVKComputePipeline(MVKDevice* device,
 					   MVKPipelineCache* pipelineCache,
@@ -198,7 +185,7 @@
 
     id<MTLComputePipelineState> _mtlPipelineState;
     MTLSize _mtlThreadgroupSize;
-    bool _needsAuxBuffer;
+    bool _needsAuxBuffer = false;
 };
 
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 3a8bbad..4e1916d 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -1,7 +1,7 @@
 /*
  * MVKPipeline.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -138,7 +138,7 @@
 		_pushConstants.push_back(pCreateInfo->pPushConstantRanges[i]);
 	}
 
-	// Set auxiliary buffer offsets
+	// Set auxiliary buffer indices
 	_auxBufferIndex.vertex = _pushConstantsMTLResourceIndexes.vertexStage.bufferIndex + 1;
 	_auxBufferIndex.fragment = _pushConstantsMTLResourceIndexes.fragmentStage.bufferIndex + 1;
 	_auxBufferIndex.compute = _pushConstantsMTLResourceIndexes.computeStage.bufferIndex + 1;
@@ -307,9 +307,6 @@
     SPIRVToMSLConverterContext shaderContext;
     initMVKShaderConverterContext(shaderContext, pCreateInfo);
 
-    auto* mvkLayout = (MVKPipelineLayout*)pCreateInfo->layout;
-    _auxBufferIndex = mvkLayout->getAuxBufferIndex();
-
     // Retrieve the render subpass for which this pipeline is being constructed
     MVKRenderPass* mvkRendPass = (MVKRenderPass*)pCreateInfo->renderPass;
     MVKRenderSubpass* mvkRenderSubpass = mvkRendPass->getSubpass(pCreateInfo->subpass);
@@ -318,7 +315,7 @@
 
     uint32_t vbCnt = pCreateInfo->pVertexInputState->vertexBindingDescriptionCount;
 
-	// Add shader stages. Compile vertex shder before others just in case conversion changes anything...like rasterizaion disable.
+	// Add shader stages. Compile vertex shader before others just in case conversion changes anything...like rasterizaion disable.
 	for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
 		const VkPipelineShaderStageCreateInfo* pSS = &pCreateInfo->pStages[i];
 		if (mvkAreFlagsEnabled(pSS->stage, VK_SHADER_STAGE_VERTEX_BIT)) {
@@ -327,7 +324,7 @@
 			shaderContext.options.entryPointName = pSS->pName;
 			id<MTLFunction> mtlFunction = ((MVKShaderModule*)pSS->module)->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache).mtlFunction;
 			if ( !mtlFunction ) {
-				setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Vertex shader function could not be compiled into pipeline. See previous error."));
+				setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Vertex shader function could not be compiled into pipeline. See previous logged error."));
 				return nil;
 			}
 			plDesc.vertexFunction = mtlFunction;
@@ -341,10 +338,6 @@
 		}
 	}
 
-  // bug fix by aerofly -> if no fragment shader is used and _needsFragmentAuxBuffer was true newBufferWithLength was trying to allocate zero bytes
-  // please verify this fix
-  _needsFragmentAuxBuffer = false;
-
   // Fragment shader - only add if rasterization is enabled
 	for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
 		const VkPipelineShaderStageCreateInfo* pSS = &pCreateInfo->pStages[i];
@@ -354,7 +347,7 @@
 			shaderContext.options.entryPointName = pSS->pName;
 			id<MTLFunction> mtlFunction = ((MVKShaderModule*)pSS->module)->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache).mtlFunction;
 			if ( !mtlFunction ) {
-				setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Fragment shader function could not be compiled into pipeline. See previous error."));
+				setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Fragment shader function could not be compiled into pipeline. See previous logged error."));
 			}
 			plDesc.fragmentFunction = mtlFunction;
 			_needsFragmentAuxBuffer = shaderContext.options.needsAuxBuffer;
@@ -486,10 +479,12 @@
 
     MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout;
     layout->populateShaderConverterContext(shaderContext);
+	_auxBufferIndex = layout->getAuxBufferIndex();
 
     shaderContext.options.isRenderingPoints = isRenderingPoints(pCreateInfo);
 	shaderContext.options.isRasterizationDisabled = (pCreateInfo->pRasterizationState && (pCreateInfo->pRasterizationState->rasterizerDiscardEnable));
     shaderContext.options.shouldFlipVertexY = _device->_pMVKConfig->shaderConversionFlipVertexY;
+	shaderContext.options.shouldSwizzleTextureSamples = _device->_pMVKConfig->fullImageViewSwizzle;
 
     // Set the shader context vertex attribute information
     shaderContext.vertexAttributes.clear();
@@ -569,9 +564,7 @@
 void MVKComputePipeline::encode(MVKCommandEncoder* cmdEncoder) {
     [cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch) setComputePipelineState: _mtlPipelineState];
     cmdEncoder->_mtlThreadgroupSize = _mtlThreadgroupSize;
-    if (_needsAuxBuffer) {
-        cmdEncoder->_computeResourcesState.bindAuxBuffer(_auxBufferIndex);
-    }
+	cmdEncoder->_computeResourcesState.bindAuxBuffer(_auxBufferIndex, _needsAuxBuffer);
 }
 
 MVKComputePipeline::MVKComputePipeline(MVKDevice* device,
@@ -588,7 +581,7 @@
 		setConfigurationResult(plc->getConfigurationResult());
 		plc->destroy();
 	} else {
-		setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Compute shader function could not be compiled into pipeline. See previous error."));
+		setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_INITIALIZATION_FAILED, "Compute shader function could not be compiled into pipeline. See previous logged error."));
 	}
 
 	if (_needsAuxBuffer && _auxBufferIndex.compute == ~0u) {
@@ -606,6 +599,7 @@
 	shaderContext.options.entryPointName = pCreateInfo->stage.pName;
 	shaderContext.options.entryPointStage = spv::ExecutionModelGLCompute;
     shaderContext.options.mslVersion = _device->_pMetalFeatures->mslVersion;
+	shaderContext.options.shouldSwizzleTextureSamples = _device->_pMVKConfig->fullImageViewSwizzle;
 
     MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout;
     layout->populateShaderConverterContext(shaderContext);
@@ -613,12 +607,11 @@
     shaderContext.options.auxBufferIndex = _auxBufferIndex.compute;
 
     MVKShaderModule* mvkShdrMod = (MVKShaderModule*)pSS->module;
-    auto func = mvkShdrMod->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache);
+    MVKMTLFunction func = mvkShdrMod->getMTLFunction(&shaderContext, pSS->pSpecializationInfo, _pipelineCache);
     _needsAuxBuffer = shaderContext.options.needsAuxBuffer;
     return func;
 }
 
-
 MVKComputePipeline::~MVKComputePipeline() {
     [_mtlPipelineState release];
 }
@@ -686,6 +679,7 @@
 				opt.auxBufferIndex,
 				opt.shouldFlipVertexY,
 				opt.isRenderingPoints,
+				opt.shouldSwizzleTextureSamples,
 				opt.isRasterizationDisabled,
 				opt.needsAuxBuffer);
 	}
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h
index 69db01f..236d95e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.h
@@ -1,7 +1,7 @@
 /*
  * MVKQueryPool.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
index 482be63..b48cdd5 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueryPool.mm
@@ -1,7 +1,7 @@
 /*
  * MVKQueryPool.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
index d3e6a2f..580d98e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.h
@@ -1,7 +1,7 @@
 /*
  * MVKQueue.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -170,7 +170,7 @@
 	MVKQueueSubmission* _prev;
 	MVKQueueSubmission* _next;
 	VkResult _submissionResult;
-	MVKVector<MVKSemaphore*> _waitSemaphores;
+	MVKVectorInline<MVKSemaphore*, 8> _waitSemaphores;
 	bool _isAwaitingSemaphores;
 };
 
@@ -205,8 +205,8 @@
 	void commitActiveMTLCommandBuffer(bool signalCompletion = false);
 	void finish();
 
-	MVKVector<MVKCommandBuffer*> _cmdBuffers;
-	MVKVector<MVKSemaphore*> _signalSemaphores;
+	MVKVectorInline<MVKCommandBuffer*, 16> _cmdBuffers;
+	MVKVectorInline<MVKSemaphore*, 16> _signalSemaphores;
 	MVKFence* _fence;
     MVKCommandUse _cmdBuffUse;
 	id<MTLCommandBuffer> _activeMTLCommandBuffer;
@@ -228,6 +228,6 @@
 									 const VkPresentInfoKHR* pPresentInfo);
 
 protected:
-	MVKVector<MVKSwapchainImage*> _surfaceImages;
+	MVKVectorInline<MVKSwapchainImage*, 4> _surfaceImages;
 };
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
index f36a41e..9f05901 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKQueue.mm
@@ -1,7 +1,7 @@
 /*
  * MVKQueue.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h
index 34cbea6..ad591b0 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h
@@ -1,7 +1,7 @@
 /*
  * MVKRenderPass.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
index b695ba5..bb1f8b3 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
@@ -1,7 +1,7 @@
 /*
  * MVKRenderPass.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKResource.h b/MoltenVK/MoltenVK/GPUObjects/MVKResource.h
index 4128eec..a96867a 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKResource.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKResource.h
@@ -1,7 +1,7 @@
 /*
  * MVKResource.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKResource.mm b/MoltenVK/MoltenVK/GPUObjects/MVKResource.mm
index b2806a5..b3a3bc8 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKResource.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKResource.mm
@@ -1,7 +1,7 @@
 /*
  * MVKResource.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
index 2214052..6eeaa84 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
@@ -1,7 +1,7 @@
 /*
  * MVKShaderModule.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
index 13522cc..2ebacb4 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm
@@ -1,7 +1,7 @@
 /*
  * MVKShaderModule.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
index 5647141..7430ab9 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.h
@@ -1,7 +1,7 @@
 /*
  * MVKSurface.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
index 37024f1..ff71088 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSurface.mm
@@ -1,7 +1,7 @@
 /*
  * MVKSurface.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.h b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.h
index a7bb266..db29353 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.h
@@ -1,7 +1,7 @@
 /*
  * MVKSwapchain.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -87,8 +87,8 @@
 protected:
 	friend class MVKSwapchainImage;
 
-	void initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo);
-	void initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo);
+	void initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt);
+	void initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt);
     void initFrameIntervalTracking();
 	void releaseUndisplayedSurfaces();
 	uint64_t getNextAcquisitionID();
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
index 5bc4f23..e7926f1 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
@@ -1,7 +1,7 @@
 /*
  * MVKSwapchain.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -179,39 +179,43 @@
 	MVKSwapchain* oldSwapchain = (MVKSwapchain*)pCreateInfo->oldSwapchain;
 	if (oldSwapchain) { oldSwapchain->releaseUndisplayedSurfaces(); }
 
-	initCAMetalLayer(pCreateInfo);
-    initSurfaceImages(pCreateInfo);
+	uint32_t imgCnt = mvkClamp(pCreateInfo->minImageCount,
+							   _device->_pMetalFeatures->minSwapchainImageCount,
+							   _device->_pMetalFeatures->maxSwapchainImageCount);
+	initCAMetalLayer(pCreateInfo, imgCnt);
+    initSurfaceImages(pCreateInfo, imgCnt);		// After initCAMetalLayer()
     initFrameIntervalTracking();
 
     _licenseWatermark = NULL;
 }
 
 // Initializes the CAMetalLayer underlying the surface of this swapchain.
-void MVKSwapchain::initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo) {
+void MVKSwapchain::initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt) {
 
 	MVKSurface* mvkSrfc = (MVKSurface*)pCreateInfo->surface;
 	_mtlLayer = mvkSrfc->getCAMetalLayer();
 	_mtlLayer.device = getMTLDevice();
 	_mtlLayer.pixelFormat = getMTLPixelFormatFromVkFormat(pCreateInfo->imageFormat);
+	_mtlLayer.maximumDrawableCountMVK = imgCnt;
 	_mtlLayer.displaySyncEnabledMVK = (pCreateInfo->presentMode != VK_PRESENT_MODE_IMMEDIATE_KHR);
 	_mtlLayer.magnificationFilter = _device->_pMVKConfig->swapchainMagFilterUseNearest ? kCAFilterNearest : kCAFilterLinear;
 	_mtlLayer.framebufferOnly = !mvkIsAnyFlagEnabled(pCreateInfo->imageUsage, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
 																			   VK_IMAGE_USAGE_TRANSFER_DST_BIT |
 																			   VK_IMAGE_USAGE_SAMPLED_BIT |
 																			   VK_IMAGE_USAGE_STORAGE_BIT));
+	_mtlLayerOrigDrawSize = _mtlLayer.updatedDrawableSizeMVK;
 
 	// TODO: set additional CAMetalLayer properties before extracting drawables:
 	//	- presentsWithTransaction
-	//  - maximumDrawableCount (maybe for MAILBOX?)
 	//	- drawsAsynchronously
 	//  - colorspace (macOS only) Vulkan only supports sRGB colorspace for now.
 	//  - wantsExtendedDynamicRangeContent (macOS only)
 }
 
 // Initializes the array of images used for the surface of this swapchain.
-void MVKSwapchain::initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo) {
+// The CAMetalLayer should already be initialized when this is called.
+void MVKSwapchain::initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt) {
 
-    _mtlLayerOrigDrawSize = _mtlLayer.updatedDrawableSizeMVK;
     VkExtent2D imgExtent = mvkVkExtent2DFromCGSize(_mtlLayerOrigDrawSize);
 
     VkImageCreateInfo imgInfo = {
@@ -229,14 +233,9 @@
     };
 
 	if (mvkAreFlagsEnabled(pCreateInfo->flags, VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR)) {
-		mvkEnableFlag(imgInfo.flags, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT|VK_IMAGE_CREATE_EXTENDED_USAGE_BIT);
+		mvkEnableFlag(imgInfo.flags, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT);
 	}
 
-	VkSurfaceCapabilitiesKHR srfcProps;
-	MVKSurface* mvkSrfc = (MVKSurface*)pCreateInfo->surface;
-	_device->getPhysicalDevice()->getSurfaceCapabilities(mvkSrfc, &srfcProps);
-
-	uint32_t imgCnt = srfcProps.maxImageCount;
 	_surfaceImages.reserve(imgCnt);
     for (uint32_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
         _surfaceImages.push_back(_device->createSwapchainImage(&imgInfo, this, NULL));
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
index 6f2b430..aa325b5 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
@@ -1,7 +1,7 @@
 /*
  * MVKSync.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
index 9cc0110..8f39de2 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
@@ -1,7 +1,7 @@
 /*
  * MVKSync.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -150,8 +150,11 @@
 		((MVKFence*)pFences[i])->addSitter(&fenceSitter);
 	}
 
-	if ( !fenceSitter.wait(timeout) && timeout > 0 ) {
-		rslt = mvkNotifyErrorWithText(VK_TIMEOUT, "Vulkan fence timeout after %llu nanoseconds.", timeout);
+	if ( !fenceSitter.wait(timeout) ) {
+		rslt = VK_TIMEOUT;
+		if (timeout > 0) {
+			mvkNotifyErrorWithText(rslt, "Vulkan fence timeout after %llu nanoseconds.", timeout);
+		}
 	}
 
 	for (uint32_t i = 0; i < fenceCount; i++) {
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.cpp b/MoltenVK/MoltenVK/Layers/MVKExtensions.cpp
index 5a714b8..7c821cb 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.cpp
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.cpp
@@ -1,7 +1,7 @@
 /*
  * MVKExtensions.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.def b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
index 791100f..6569826 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.def
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
@@ -1,7 +1,7 @@
 /*
  * MVKExtensions.def
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -50,11 +50,13 @@
 MVK_EXTENSION(KHR_surface, KHR_SURFACE)
 MVK_EXTENSION(KHR_swapchain, KHR_SWAPCHAIN)
 MVK_EXTENSION(KHR_swapchain_mutable_format, KHR_SWAPCHAIN_MUTABLE_FORMAT)
+MVK_EXTENSION(KHR_variable_pointers, KHR_VARIABLE_POINTERS)
 MVK_EXTENSION(EXT_shader_viewport_index_layer, EXT_SHADER_VIEWPORT_INDEX_LAYER)
 MVK_EXTENSION(EXT_vertex_attribute_divisor, EXT_VERTEX_ATTRIBUTE_DIVISOR)
 MVK_EXTENSION(MVK_ios_surface, MVK_IOS_SURFACE)
 MVK_EXTENSION(MVK_macos_surface, MVK_MACOS_SURFACE)
 MVK_EXTENSION(MVK_moltenvk, MVK_MOLTENVK)
+MVK_EXTENSION(AMD_gpu_shader_half_float, AMD_GPU_SHADER_HALF_FLOAT)
 MVK_EXTENSION(AMD_negative_viewport_height, AMD_NEGATIVE_VIEWPORT_HEIGHT)
 MVK_EXTENSION_LAST(IMG_format_pvrtc, IMG_FORMAT_PVRTC)
 
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.h b/MoltenVK/MoltenVK/Layers/MVKExtensions.h
index 822de8a..77d4dde 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.h
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.h
@@ -1,7 +1,7 @@
 /*
  * MVKExtensions.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Layers/MVKLayers.h b/MoltenVK/MoltenVK/Layers/MVKLayers.h
index f539a31..62a2b48 100644
--- a/MoltenVK/MoltenVK/Layers/MVKLayers.h
+++ b/MoltenVK/MoltenVK/Layers/MVKLayers.h
@@ -1,7 +1,7 @@
 /*
  * MVKLayers.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Layers/MVKLayers.mm b/MoltenVK/MoltenVK/Layers/MVKLayers.mm
index d1764cd..ce8670d 100644
--- a/MoltenVK/MoltenVK/Layers/MVKLayers.mm
+++ b/MoltenVK/MoltenVK/Layers/MVKLayers.mm
@@ -1,7 +1,7 @@
 /*
  * MVKLayers.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h
index bb6a599..0b762ee 100644
--- a/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * CAMetalLayer+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -48,4 +48,12 @@
  */
 @property(nonatomic, readwrite) BOOL displaySyncEnabledMVK;
 
+/**
+ * Replacement for the maximumDrawableCount property.
+ *
+ * This property allows support under all OS versions. Delegates to the maximumDrawableCount
+ * property if it is available. otherwise, returns zero when read and does nothing when set.
+ */
+@property(nonatomic, readwrite) NSUInteger maximumDrawableCountMVK;
+
 @end
diff --git a/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m
index 3bbb860..06b91f8 100644
--- a/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m
+++ b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m
@@ -1,7 +1,7 @@
 /*
  * CAMetalLayer+MoltenVK.m
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -53,4 +53,13 @@
 #endif
 }
 
+-(NSUInteger) maximumDrawableCountMVK {
+	if ( [self respondsToSelector: @selector(maximumDrawableCount)] ) { return self.maximumDrawableCount; }
+	return 0;
+}
+
+-(void) setMaximumDrawableCountMVK: (NSUInteger) count {
+	if ( [self respondsToSelector: @selector(setMaximumDrawableCount:)] ) { self.maximumDrawableCount = count; }
+}
+
 @end
diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h
index dc5f319..258906d 100644
--- a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * MTLRenderPassDescriptor+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m
index d42517a..3e32c38 100644
--- a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m
+++ b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m
@@ -1,7 +1,7 @@
 /*
  * MTLRenderPassDescriptor+MoltenVK.m
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h
index 751775c..99ee2b2 100644
--- a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * MTLRenderPipelineDescriptor+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m
index 55ff134..5308930 100644
--- a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m
+++ b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m
@@ -1,7 +1,7 @@
 /*
  * MTLRenderPipelineDescriptor+MoltenVK.m
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h
index 01feefe..94a4255 100644
--- a/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * MTLSamplerDescriptor+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m
index 4f02de6..745d0ba 100644
--- a/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m
+++ b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m
@@ -1,7 +1,7 @@
 /*
  * MTLSamplerDescriptor+MoltenVK.m
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h
index e7df96d..5de5856 100644
--- a/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * MTLTextureDescriptor+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m
index b653dde..1b9e3ae 100644
--- a/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m
+++ b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m
@@ -1,7 +1,7 @@
 /*
  * MTLTextureDescriptor+MoltenVK.m
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MVKGPUCapture.h b/MoltenVK/MoltenVK/OS/MVKGPUCapture.h
index b20887c..3bda589 100644
--- a/MoltenVK/MoltenVK/OS/MVKGPUCapture.h
+++ b/MoltenVK/MoltenVK/OS/MVKGPUCapture.h
@@ -1,7 +1,7 @@
 /*
  * MVKGPUCapture.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm b/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
index c2b9631..bd1d9f3 100644
--- a/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
+++ b/MoltenVK/MoltenVK/OS/MVKGPUCapture.mm
@@ -1,7 +1,7 @@
 /*
  * MVKGPUCapture.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/MVKOSExtensions.h b/MoltenVK/MoltenVK/OS/MVKOSExtensions.h
index 58cd4ec..53a8ae7 100644
--- a/MoltenVK/MoltenVK/OS/MVKOSExtensions.h
+++ b/MoltenVK/MoltenVK/OS/MVKOSExtensions.h
@@ -1,7 +1,7 @@
 /*
  * MVKOSExtensions.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
 #pragma once
 
 #include "mvk_vulkan.h"
+#include "MVKFoundation.h"
+#include <string>
 
 #import <Metal/Metal.h>
 
@@ -68,6 +70,69 @@
 
 
 #pragma mark -
+#pragma mark Process environment
+
+
+/**
+ * Returns the value of the environment variable at the given name,
+ * or an empty string if no environment variable with that name exists.
+ *
+ * If pWasFound is not null, it's value is set to true if the environment
+ * variable exists, or false if not.
+ */
+inline std::string mvkGetEnvVar(std::string varName, bool* pWasFound = nullptr) {
+	NSDictionary* env = [[NSProcessInfo processInfo] environment];
+	NSString* envStr = env[@(varName.c_str())];
+	if (pWasFound) { *pWasFound = envStr != nil; }
+	return envStr ? envStr.UTF8String : "";
+}
+
+/**
+ * Returns the value of the environment variable at the given name,
+ * or zero if no environment variable with that name exists.
+ *
+ * If pWasFound is not null, it's value is set to true if the environment
+ * variable exists, or false if not.
+ */
+inline int64_t mvkGetEnvVarInt64(std::string varName, bool* pWasFound = nullptr) {
+	return strtoll(mvkGetEnvVar(varName, pWasFound).c_str(), NULL, 0);
+}
+
+/**
+ * Returns the value of the environment variable at the given name,
+ * or false if no environment variable with that name exists.
+ *
+ * If pWasFound is not null, it's value is set to true if the environment
+ * variable exists, or false if not.
+ */
+inline bool mvkGetEnvVarBool(std::string varName, bool* pWasFound = nullptr) {
+	return mvkGetEnvVarInt64(varName, pWasFound) != 0;
+}
+
+#define MVK_SET_FROM_ENV_OR_BUILD_BOOL(cfgVal, EV)	\
+	do {											\
+		bool wasFound = false;						\
+		bool ev = mvkGetEnvVarBool(#EV, &wasFound);	\
+		cfgVal = wasFound ? ev : EV;				\
+	} while(false)
+
+#define MVK_SET_FROM_ENV_OR_BUILD_INT64(cfgVal, EV)		\
+	do {												\
+		bool wasFound = false;							\
+		int64_t ev = mvkGetEnvVarInt64(#EV, &wasFound);	\
+		cfgVal = wasFound ? ev : EV;					\
+	} while(false)
+
+#define MVK_SET_FROM_ENV_OR_BUILD_INT32(cfgVal, EV)				\
+	do {														\
+		bool wasFound = false;									\
+		int64_t ev = mvkGetEnvVarInt64(#EV, &wasFound);			\
+		int64_t val = wasFound ? ev : EV;						\
+		cfgVal = (int32_t)mvkClamp(val, (int64_t)INT32_MIN, (int64_t)INT32_MAX);	\
+	} while(false)
+
+
+#pragma mark -
 #pragma mark MTLDevice
 
 /** Returns an approximation of how much memory, in bytes, the device can use with good performance. */
diff --git a/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm b/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm
index 603558e..7717d8d 100644
--- a/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm
+++ b/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm
@@ -1,7 +1,7 @@
 /*
  * MVKOSExtensions.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h
index 406defb..d1b5eb4 100644
--- a/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h
+++ b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h
@@ -1,7 +1,7 @@
 /*
  * NSString+MoltenVK.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm
index 791c18f..08e5e30 100644
--- a/MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm
+++ b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm
@@ -1,7 +1,7 @@
 /*
  * NSString+MoltenVK.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKBaseObject.cpp b/MoltenVK/MoltenVK/Utility/MVKBaseObject.cpp
index 0275acd..0d67b9f 100644
--- a/MoltenVK/MoltenVK/Utility/MVKBaseObject.cpp
+++ b/MoltenVK/MoltenVK/Utility/MVKBaseObject.cpp
@@ -1,7 +1,7 @@
 /*
  * MVKBaseObject.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKBaseObject.h b/MoltenVK/MoltenVK/Utility/MVKBaseObject.h
index 6827bf1..e9abadf 100644
--- a/MoltenVK/MoltenVK/Utility/MVKBaseObject.h
+++ b/MoltenVK/MoltenVK/Utility/MVKBaseObject.h
@@ -1,7 +1,7 @@
 /*
  * MVKBaseObject.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKCodec.cpp b/MoltenVK/MoltenVK/Utility/MVKCodec.cpp
new file mode 100644
index 0000000..62b9b2f
--- /dev/null
+++ b/MoltenVK/MoltenVK/Utility/MVKCodec.cpp
@@ -0,0 +1,125 @@
+/*
+ * MVKCodec.cpp
+ *
+ * Copyright (c) 2018 Chip Davis for CodeWeavers
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "MVKCodec.h"
+
+#include <algorithm>
+#include <simd/simd.h>
+
+
+using simd::float3;
+using simd::float4;
+using simd::pow;
+using simd::select;
+
+static uint32_t pack_float_to_unorm4x8(float4 x) {
+	return ((((uint8_t)(x.r * 255)) & 0x000000ff) | ((((uint8_t)(x.g * 255)) << 8) & 0x0000ff00) |
+		((((uint8_t)(x.b * 255)) & 0x00ff0000) << 16) | ((((uint8_t)(x.a * 255)) << 24) & 0xff000000));
+}
+
+static float3 unpack_unorm565_to_float(uint16_t x) {
+	return simd::make_float3(((x >> 11) & 0x1f) / 31.0f, ((x >> 5) & 0x3f) / 63.0f, (x & 0x1f) / 31.0f);
+}
+
+
+/** Texture codec for DXTn (i.e. BC[1-3]) compressed data.
+ *
+ * This implementation is largely derived from Wine, from code originally
+ * written by Connor McAdams.
+ */
+class MVKDXTnCodec : public MVKCodec {
+
+public:
+
+	void decompress(void* pDest, const void* pSrc, const VkSubresourceLayout& destLayout, const VkSubresourceLayout& srcLayout, VkExtent3D extent) override {
+		VkDeviceSize blockByteCount;
+		const uint8_t* pSrcRow;
+		const uint8_t* pSrcSlice = (const uint8_t*)pSrc;
+		uint8_t* pDestRow;
+		uint8_t* pDestSlice = (uint8_t*)pDest;
+
+		blockByteCount = isBC1Format(_format) ? 8 : 16;
+
+		for (uint32_t z = 0; z < extent.depth; ++z) {
+			pSrcRow = pSrcSlice;
+			pDestRow = pDestSlice;
+			for (uint32_t y = 0; y < extent.height; y += 4) {
+				for (uint32_t x = 0; x < extent.width; x += 4) {
+					VkExtent2D blockExtent;
+					blockExtent.width = std::min(extent.width - x, 4u);
+					blockExtent.height = std::min(extent.height - y, 4u);
+					decompressDXTnBlock(pSrcRow + x * (blockByteCount / 4),
+						pDestRow + x * 4, blockExtent, destLayout.rowPitch, _format);
+				}
+				pSrcRow += srcLayout.rowPitch;
+				pDestRow += destLayout.rowPitch * 4;
+			}
+			pSrcSlice += srcLayout.depthPitch;
+			pDestSlice += destLayout.depthPitch;
+		}
+	}
+
+	/** Constructs an instance. */
+	MVKDXTnCodec(VkFormat format) : _format(format) {}
+
+private:
+
+#define constant const
+#define device
+#define thread
+#define MVK_DECOMPRESS_CODE(...) __VA_ARGS__
+#include "MVKDXTnCodec.def"
+#undef MVK_DECOMPRESS_CODE
+
+	VkFormat _format;
+};
+
+std::unique_ptr<MVKCodec> mvkCreateCodec(VkFormat format) {
+	switch (format) {
+	case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
+	case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
+	case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
+	case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
+	case VK_FORMAT_BC2_UNORM_BLOCK:
+	case VK_FORMAT_BC2_SRGB_BLOCK:
+	case VK_FORMAT_BC3_UNORM_BLOCK:
+	case VK_FORMAT_BC3_SRGB_BLOCK:
+		return std::unique_ptr<MVKCodec>(new MVKDXTnCodec(format));
+
+	default:
+		return nullptr;
+	}
+}
+
+bool mvkCanDecodeFormat(VkFormat format) {
+	switch (format) {
+	case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
+	case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
+	case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
+	case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
+	case VK_FORMAT_BC2_UNORM_BLOCK:
+	case VK_FORMAT_BC2_SRGB_BLOCK:
+	case VK_FORMAT_BC3_UNORM_BLOCK:
+	case VK_FORMAT_BC3_SRGB_BLOCK:
+		return true;
+
+	default:
+		return false;
+	}
+}
diff --git a/MoltenVK/MoltenVK/Utility/MVKCodec.h b/MoltenVK/MoltenVK/Utility/MVKCodec.h
new file mode 100644
index 0000000..ddff1ec
--- /dev/null
+++ b/MoltenVK/MoltenVK/Utility/MVKCodec.h
@@ -0,0 +1,50 @@
+/*
+ * MVKCodec.h
+ *
+ * Copyright (c) 2018 Chip Davis for CodeWeavers
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#pragma once
+
+#include "MVKFoundation.h"
+
+#include <string>
+
+
+#pragma mark Texture data codecs
+
+/**
+ * This is the base class implemented by all codecs supported by MoltenVK.
+ * Objects of this class are used to decompress texture data for upload to a
+ * 3D texture.
+ */
+class MVKCodec {
+
+public:
+
+	/** Decompresses compressed texture data for upload. */
+	virtual void decompress(void* pDest, const void* pSrc, const VkSubresourceLayout& destLayout, const VkSubresourceLayout& srcLayout, VkExtent3D extent) = 0;
+
+	/** Destructor. */
+	virtual ~MVKCodec() = default;
+
+};
+
+/** Returns an appropriate codec for the given format, or nullptr if the format is not supported. */
+std::unique_ptr<MVKCodec> mvkCreateCodec(VkFormat format);
+
+/** Returns whether or not the given format can be decompressed. */
+bool mvkCanDecodeFormat(VkFormat format);
diff --git a/MoltenVK/MoltenVK/Utility/MVKDXTnCodec.def b/MoltenVK/MoltenVK/Utility/MVKDXTnCodec.def
new file mode 100644
index 0000000..22cf9da
--- /dev/null
+++ b/MoltenVK/MoltenVK/Utility/MVKDXTnCodec.def
@@ -0,0 +1,128 @@
+/*
+ * MVKDXTnCodec.def
+ *
+ * Copyright (c) 2018 Chip Davis for CodeWeavers
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef MVK_DECOMPRESS_CODE
+#error MVK_DECOMPRESS_CODE must be defined before including this file
+#endif
+
+MVK_DECOMPRESS_CODE(
+	static bool isBC1Format(VkFormat format) {
+		return format == VK_FORMAT_BC1_RGB_UNORM_BLOCK || format == VK_FORMAT_BC1_RGB_SRGB_BLOCK ||
+			format == VK_FORMAT_BC1_RGBA_UNORM_BLOCK || format == VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
+	}
+
+	static bool isBC2Format(VkFormat format) {
+		return format == VK_FORMAT_BC2_UNORM_BLOCK || format == VK_FORMAT_BC2_SRGB_BLOCK;
+	}
+
+	static bool isBC3Format(VkFormat format) {
+		return format == VK_FORMAT_BC3_UNORM_BLOCK || format == VK_FORMAT_BC3_SRGB_BLOCK;
+	}
+
+	static bool isSRGBFormat(VkFormat format) {
+		return format == VK_FORMAT_BC1_RGB_SRGB_BLOCK || format == VK_FORMAT_BC1_RGBA_SRGB_BLOCK ||
+			format == VK_FORMAT_BC2_SRGB_BLOCK || format == VK_FORMAT_BC3_SRGB_BLOCK;
+	}
+
+	static void buildDXTnColourTable(uint16_t colour0, uint16_t colour1, thread float3* pColourTable, VkFormat format) {
+		pColourTable[0] = unpack_unorm565_to_float(colour0);
+		pColourTable[1] = unpack_unorm565_to_float(colour1);
+
+		if (isBC1Format(format) && colour0 <= colour1) {
+			pColourTable[2] = (pColourTable[0] + pColourTable[1]) / 2;
+			pColourTable[3] = float3(0);
+		} else {
+			for (uint32_t i = 0; i < 2; ++i) {
+				pColourTable[i + 2] = (2 * pColourTable[i] + pColourTable[1 - i]) / 3;
+			}
+		}
+	}
+
+	static void buildDXT5AlphaTable(uint8_t alpha0, uint8_t alpha1, thread float* pAlphaTable) {
+		pAlphaTable[0] = alpha0 / 255.0f;
+		pAlphaTable[1] = alpha1 / 255.0f;
+
+		if (alpha0 > alpha1) {
+			for (uint32_t i = 0; i < 6; ++i) {
+				pAlphaTable[2 + i] = ((6 - i) * pAlphaTable[0] + (i + 1) * pAlphaTable[1]) / 7;
+			}
+		} else {
+			for (uint32_t i = 0; i < 4; ++i) {
+				pAlphaTable[2 + i] = ((4 - i) * pAlphaTable[0] + (i + 1) * pAlphaTable[1]) / 5;
+			}
+			pAlphaTable[6] = 0;
+			pAlphaTable[7] = 1;
+		}
+	}
+
+	static float3 sRGBCorrect(float3 colour) {
+		return select(pow((colour + 0.055)/1.055, float3(2.4)), colour/12.92, colour <= 0.04045);
+	}
+
+	static void decompressDXTnBlock(constant void* pSrc, thread void* pDest, VkExtent2D extent, VkDeviceSize destRowPitch, VkFormat format) {
+		constant uint32_t* pSrcBlock = (constant uint32_t *)pSrc;
+		bool isBC1Alpha = false;
+		float3 colourTable[4];
+		float alphaTable[8];
+		size_t alphaBits;
+		uint32_t colourBits;
+
+		if (isBC1Format(format)) {
+			alphaBits = 0;
+
+			uint16_t colour0 = pSrcBlock[0] & 0xffff;
+			uint16_t colour1 = pSrcBlock[0] >> 16;
+			colourBits = pSrcBlock[1];
+			buildDXTnColourTable(colour0, colour1, colourTable, format);
+			if (colour0 <= colour1) { isBC1Alpha = true; }
+		} else {
+			alphaBits = pSrcBlock[0] | ((size_t)pSrcBlock[1] << 32);
+			if (isBC3Format(format)) {
+				buildDXT5AlphaTable(alphaBits & 0xff, (alphaBits >> 8) & 0xff, alphaTable);
+				alphaBits >>= 16;
+			}
+
+			colourBits = pSrcBlock[3];
+			buildDXTnColourTable(pSrcBlock[2] & 0xffff, pSrcBlock[2] >> 16, colourTable, format);
+		}
+
+		for (uint32_t y = 0; y < extent.height; ++y) {
+			thread uint32_t* pDestRow = (thread uint32_t *)((thread uint8_t *)pDest + y * destRowPitch);
+			for (uint32_t x = 0; x < extent.width; ++x) {
+				uint8_t colourIndex = (colourBits >> (y * 8 + x * 2)) & 0x3;
+				float alpha;
+				if (isBC1Format(format)) {
+					alpha = (!isBC1Alpha || colourIndex != 3) ? 1.0f : 0.0f;
+				} else if (isBC2Format(format)) {
+					alpha = ((alphaBits >> (y * 16 + x * 4)) & 0xf) / 15.0f;
+				} else {	// Must be a BC3 format
+					alpha = alphaTable[(alphaBits >> (y * 12 + x * 3)) & 0x7];
+				}
+				float4 colour;
+				colour.rgb = colourTable[colourIndex];
+				if (isSRGBFormat(format)) {
+					// Convert sRGB back to linear.
+					colour.rgb = sRGBCorrect(colour.rgb);
+				}
+				colour.a = alpha;
+				pDestRow[x] = pack_float_to_unorm4x8(colour);
+			}
+		}
+	}
+)
diff --git a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
index 7f28a75..c7d1e3e 100644
--- a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
+++ b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
@@ -1,7 +1,7 @@
 /*
  * MVKEnvironment.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -44,9 +44,9 @@
 #   define MVK_CONFIG_SHADER_CONVERSION_FLIP_VERTEX_Y    1
 #endif
 
-/** Process command queue submissions on the same thread on which the submission call was made. Disabled by default. */
+/** Process command queue submissions on the same thread on which the submission call was made. Enable by default. */
 #ifndef MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS
-#   define MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS    0
+#   define MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS    1
 #endif
 
 /** Fill a Metal command buffers when each Vulkan command buffer is filled. */
@@ -58,8 +58,8 @@
  * The maximum number of Metal command buffers that can be concurrently
  * active per Vulkan queue. Default is Metal's default value of 64.
  */
-#ifndef MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_POOL
-#   define MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_POOL    64
+#ifndef MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE
+#   define MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE    64
 #endif
 
 /** Support more than 8192 occlusion queries per buffer. Enabled by default. */
@@ -77,16 +77,42 @@
 #   define MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST    1
 #endif
 
+/** The maximum amount of time, in nanoseconds, to wait for a Metal library. Default is infinite. */
+#ifndef MVK_CONFIG_METAL_COMPILE_TIMEOUT
+#   define MVK_CONFIG_METAL_COMPILE_TIMEOUT    INT64_MAX
+#endif
+
+/** Track performance. Disabled by default. */
+#ifndef MVK_CONFIG_PERFORMANCE_TRACKING
+#   define MVK_CONFIG_PERFORMANCE_TRACKING    0
+#endif
+
+/** Log performance once every this number of frames. Default is zero (never). */
+#ifndef MVK_CONFIG_PERFORMANCE_LOGGING_FRAME_COUNT
+#   define MVK_CONFIG_PERFORMANCE_LOGGING_FRAME_COUNT    0
+#endif
+
 /** Display the MoltenVK logo watermark. Disabled by default. */
 #ifndef MVK_CONFIG_DISPLAY_WATERMARK
 #   define MVK_CONFIG_DISPLAY_WATERMARK    0
 #endif
 
-/** The maximum amount of time, in nanoseconds, to wait for a Metal library. Default is infinite. */
-#ifndef MVK_CONFIG_METAL_COMPILE_TIMEOUT
-#   define MVK_CONFIG_METAL_COMPILE_TIMEOUT    INT64_MAX
+/** Advertise specialized queue families. Disabled by default. */
+#ifndef MVK_CONFIG_SPECIALIZED_QUEUE_FAMILIES
+#   define MVK_CONFIG_SPECIALIZED_QUEUE_FAMILIES    0
 #endif
 
+/** If the Vulkan app selects a high-power GPU, force the system to use it. Enabled by default. */
+#ifndef MVK_CONFIG_SWITCH_SYSTEM_GPU
+#   define MVK_CONFIG_SWITCH_SYSTEM_GPU    1
+#endif
+
+/** Support full ImageView swizzles. Disabled by default. */
+#ifndef MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE
+#   define MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE    0
+#endif
+
+
 /**
  * IOSurfaces are supported on macOS, and on iOS starting with iOS 11.
  *
diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.cpp b/MoltenVK/MoltenVK/Utility/MVKFoundation.cpp
index fab2bcc..276df6f 100644
--- a/MoltenVK/MoltenVK/Utility/MVKFoundation.cpp
+++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.cpp
@@ -1,7 +1,7 @@
 /*
  * MVKFoundation.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,45 +19,59 @@
 #include "MVKFoundation.h"
 #include "MVKLogging.h"
 
-#define CASE_RESULT(R)  case R: return strcpy(name, #R);
 
-char* mvkResultName(VkResult vkResult, char* name) {
+#define CASE_STRINGIFY(V)  case V: return #V
+
+const char* mvkVkResultName(VkResult vkResult) {
 	switch (vkResult) {
-            CASE_RESULT(VK_SUCCESS)
-            CASE_RESULT(VK_NOT_READY)
-            CASE_RESULT(VK_TIMEOUT)
-            CASE_RESULT(VK_EVENT_SET)
-            CASE_RESULT(VK_EVENT_RESET)
-            CASE_RESULT(VK_INCOMPLETE)
 
-            CASE_RESULT(VK_ERROR_OUT_OF_HOST_MEMORY)
-            CASE_RESULT(VK_ERROR_OUT_OF_DEVICE_MEMORY)
-            CASE_RESULT(VK_ERROR_INITIALIZATION_FAILED)
-            CASE_RESULT(VK_ERROR_DEVICE_LOST)
-            CASE_RESULT(VK_ERROR_MEMORY_MAP_FAILED)
-            CASE_RESULT(VK_ERROR_LAYER_NOT_PRESENT)
-            CASE_RESULT(VK_ERROR_EXTENSION_NOT_PRESENT)
-            CASE_RESULT(VK_ERROR_FEATURE_NOT_PRESENT)
-            CASE_RESULT(VK_ERROR_INCOMPATIBLE_DRIVER)
-            CASE_RESULT(VK_ERROR_TOO_MANY_OBJECTS)
-            CASE_RESULT(VK_ERROR_FORMAT_NOT_SUPPORTED)
-            CASE_RESULT(VK_ERROR_FRAGMENTED_POOL)
+			CASE_STRINGIFY(VK_SUCCESS);
+			CASE_STRINGIFY(VK_NOT_READY);
+			CASE_STRINGIFY(VK_TIMEOUT);
+			CASE_STRINGIFY(VK_EVENT_SET);
+			CASE_STRINGIFY(VK_EVENT_RESET);
+			CASE_STRINGIFY(VK_INCOMPLETE);
 
-            CASE_RESULT(VK_ERROR_SURFACE_LOST_KHR)
-            CASE_RESULT(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR)
-            CASE_RESULT(VK_SUBOPTIMAL_KHR)
-            CASE_RESULT(VK_ERROR_OUT_OF_DATE_KHR)
-            CASE_RESULT(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR)
+			CASE_STRINGIFY(VK_ERROR_OUT_OF_HOST_MEMORY);
+			CASE_STRINGIFY(VK_ERROR_OUT_OF_DEVICE_MEMORY);
+			CASE_STRINGIFY(VK_ERROR_INITIALIZATION_FAILED);
+			CASE_STRINGIFY(VK_ERROR_DEVICE_LOST);
+			CASE_STRINGIFY(VK_ERROR_MEMORY_MAP_FAILED);
+			CASE_STRINGIFY(VK_ERROR_LAYER_NOT_PRESENT);
+			CASE_STRINGIFY(VK_ERROR_EXTENSION_NOT_PRESENT);
+			CASE_STRINGIFY(VK_ERROR_FEATURE_NOT_PRESENT);
+			CASE_STRINGIFY(VK_ERROR_INCOMPATIBLE_DRIVER);
+			CASE_STRINGIFY(VK_ERROR_TOO_MANY_OBJECTS);
+			CASE_STRINGIFY(VK_ERROR_FORMAT_NOT_SUPPORTED);
+			CASE_STRINGIFY(VK_ERROR_FRAGMENTED_POOL);
 
-            CASE_RESULT(VK_ERROR_VALIDATION_FAILED_EXT)
-            CASE_RESULT(VK_ERROR_INVALID_SHADER_NV)
+			CASE_STRINGIFY(VK_ERROR_SURFACE_LOST_KHR);
+			CASE_STRINGIFY(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
+			CASE_STRINGIFY(VK_SUBOPTIMAL_KHR);
+			CASE_STRINGIFY(VK_ERROR_OUT_OF_DATE_KHR);
+			CASE_STRINGIFY(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
 
-            CASE_RESULT(VK_ERROR_OUT_OF_POOL_MEMORY)
-            CASE_RESULT(VK_ERROR_INVALID_EXTERNAL_HANDLE)
+			CASE_STRINGIFY(VK_ERROR_VALIDATION_FAILED_EXT);
+			CASE_STRINGIFY(VK_ERROR_INVALID_SHADER_NV);
 
-		default:
-			sprintf(name, "UNKNOWN_VkResult(%d)", vkResult);
-			return name;
+			CASE_STRINGIFY(VK_ERROR_OUT_OF_POOL_MEMORY);
+			CASE_STRINGIFY(VK_ERROR_INVALID_EXTERNAL_HANDLE);
+
+		default: return "VK_UNKNOWN_VK_Result";
+	}
+}
+
+const char* mvkVkComponentSwizzleName(VkComponentSwizzle swizzle) {
+	switch (swizzle) {
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_IDENTITY);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_ZERO);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_ONE);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_R);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_G);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_B);
+			CASE_STRINGIFY(VK_COMPONENT_SWIZZLE_A);
+
+		default: return "VK_UNKNOWN_VKComponentSwizzle";
 	}
 }
 
@@ -65,10 +79,8 @@
 	va_list args;
 	va_start(args, errFmt);
 
-	char vkRsltName[MVKResultNameMaxLen];
-	mvkResultName(vkErr, vkRsltName);
-
 	// Prepend the error code to the format string
+	const char* vkRsltName = mvkVkResultName(vkErr);
 	char fmtStr[strlen(vkRsltName) + strlen(errFmt) + 4];
 	sprintf(fmtStr, "%s: %s", vkRsltName, errFmt);
 
diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.h b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
index 0aa05ae..c2e8ce9 100644
--- a/MoltenVK/MoltenVK/Utility/MVKFoundation.h
+++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
@@ -1,7 +1,7 @@
 /*
  * MVKFoundation.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include "mvk_vulkan.h"
 #include "MVKLogging.h"
 #include <algorithm>
+#include <string>
 #include <simd/simd.h>
 
 
@@ -100,13 +101,33 @@
 	kMVKCommandUseDispatch,                 /**< vkCmdDispatch. */
 } MVKCommandUse;
 
-/**
- * Copies the name of the specified VkResult code to the specified string.
- *
- * Returns a pointer to that string. 
- */
-#define MVKResultNameMaxLen		64
-char* mvkResultName(VkResult vkResult, char* name);
+/** Returns the name of the result value. */
+const char* mvkVkResultName(VkResult vkResult);
+
+/** Returns the name of the component swizzle. */
+const char* mvkVkComponentSwizzleName(VkComponentSwizzle swizzle);
+
+/** Returns the Vulkan API version number as a string. */
+static inline std::string mvkGetVulkanVersionString(uint32_t vkVersion) {
+	std::string verStr;
+	verStr += std::to_string(VK_VERSION_MAJOR(vkVersion));
+	verStr += ".";
+	verStr += std::to_string(VK_VERSION_MINOR(vkVersion));
+	verStr += ".";
+	verStr += std::to_string(VK_VERSION_PATCH(vkVersion));
+	return verStr;
+}
+
+/** Returns the MoltenVK API version number as a string. */
+static inline std::string mvkGetMoltenVKVersionString(uint32_t mvkVersion) {
+	std::string verStr;
+	verStr += std::to_string(mvkVersion / 10000);
+	verStr += ".";
+	verStr += std::to_string((mvkVersion % 10000) / 100);
+	verStr += ".";
+	verStr += std::to_string(mvkVersion % 100);
+	return verStr;
+}
 
 /**
  * Notifies the app of an error code and error message, via the following methods:
@@ -260,6 +281,22 @@
 	return rslt;
 }
 
+/** Packs the four swizzle components into a single 32-bit word. */
+static inline uint32_t mvkPackSwizzle(VkComponentMapping components) {
+	return ((components.r & 0xFF) << 0) | ((components.g & 0xFF) << 8) |
+	((components.b & 0xFF) << 16) | ((components.a & 0xFF) << 24);
+}
+
+/** Unpacks a single 32-bit word containing four swizzle components. */
+static inline VkComponentMapping mvkUnpackSwizzle(uint32_t packed) {
+	VkComponentMapping components;
+	components.r = (VkComponentSwizzle)((packed >> 0) & 0xFF);
+	components.g = (VkComponentSwizzle)((packed >> 8) & 0xFF);
+	components.b = (VkComponentSwizzle)((packed >> 16) & 0xFF);
+	components.a = (VkComponentSwizzle)((packed >> 24) & 0xFF);
+	return components;
+}
+
 
 #pragma mark -
 #pragma mark Template functions
@@ -273,7 +310,7 @@
 /** Clamps the value between the lower and upper bounds, inclusive. */
 template<typename T>
 const T& mvkClamp(const T& val, const T& lower, const T& upper) {
-    return std::min(upper, std::max(val, lower));
+    return std::min(std::max(val, lower), upper);
 }
 
 /**
diff --git a/MoltenVK/MoltenVK/Utility/MVKObjectPool.h b/MoltenVK/MoltenVK/Utility/MVKObjectPool.h
index ba0d09e..732743e 100644
--- a/MoltenVK/MoltenVK/Utility/MVKObjectPool.h
+++ b/MoltenVK/MoltenVK/Utility/MVKObjectPool.h
@@ -1,7 +1,7 @@
 /*
  * MVKObjectPool.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKVector.h b/MoltenVK/MoltenVK/Utility/MVKVector.h
index c990516..df2413d 100755
--- a/MoltenVK/MoltenVK/Utility/MVKVector.h
+++ b/MoltenVK/MoltenVK/Utility/MVKVector.h
@@ -1,7 +1,7 @@
 /*

- * MVKVectorAllocator.h

+ * MVKVector.h

  *

- * Copyright (c) 2012-2018 Dr. Torsten Hans (hans@ipacs.de)

+ * Copyright (c) 2012-2019 Dr. Torsten Hans (hans@ipacs.de)

  *

  * Licensed under the Apache License, Version 2.0 (the "License");

  * you may not use this file except in compliance with the License.

@@ -23,25 +23,57 @@
 //

 #if 0

 

+template<typename T, size_t N = 0>

+using MVKVectorInline = std::vector<T>;

+

+template<typename T>

+using MVKVectorDefault = std::vector<T>;

+

 template<typename T>

 using MVKVector = std::vector<T>;

 

 #else

 

 //

-// a simple std::vector like container with a configurable extra stack space

-// this class supports just the necessary members to be compatible with MoltenVK

-// if C++17 is used, code can be simplified further

-// by default MVKVector used 8 elements from the stack before getting memory from heap

+// MVKVector.h is a sequence container that (optionally) implements a small

+// buffer optimization.

+// It behaves similarly to std::vector, except until a certain number of

+// elements are reserved, it does not use the heap.

+// Like std::vector, MVKVector is guaranteed to use contiguous memory, so if the

+// preallocated number of elements are exceeded, all elements are then in heap.

+// MVKVector supports just the necessary members to be compatible with MoltenVK

+// If C++17 will be the default in the future, code can be simplified quite

+// a bit.

+//

+// Example:

+//

+//  MVKVectorInline<int, 3> vector;

+//  vector.emplace_back( 1 );

+//  vector.emplace_back( 2 );

+//  vector.emplace_back( 3 );

+//  // adding another element now reserves memory from heap

+//  vector.emplace_back( 4 );

+//

+// If you don't need any inline storage use

+//  MVKVectorDefault<int> vector; // this is essentially the same as using

+//                                // std::vector

+//

+// Passing MVKVectorInline to a function would require to use the same template

+// parameters that have been used for declaration. To avoid this MVKVectorInline

+// is derived from MVKVector. If you want to pass MVKVectorInline to a function

+// use MVKVector.

+// Keep in mind MVKVector only supports iterating over the MVKVector, no other

+// operation is supported.

 //

 #include "MVKVectorAllocator.h"

 #include <type_traits>

 #include <initializer_list>

 #include <utility>

 

-template<class Type, class Allocator = mvk_vector_allocator_with_stack<Type, 8>> class MVKVector

+

+template<class Type> class MVKVector

 {

-  Allocator alc;

+  mvk_vector_allocator_base<Type> *alc_ptr;

 

 public:

   class iterator

@@ -52,100 +84,134 @@
   public:

     iterator() = delete;

     iterator( const size_t _index, const MVKVector &_vector ) : vector{ &_vector }, index{ _index } { }

+    iterator &operator=( const iterator &it ) = delete;

 

-    iterator &operator=( const iterator &it )

-    {

-      vector = it.vector;

-      index = it.index;

-      return *this;

-    }

+    Type *operator->() const { return &vector->alc_ptr->ptr[index]; }

+    Type &operator*()  const { return  vector->alc_ptr->ptr[index]; }

+    operator Type*( )  const { return &vector->alc_ptr->ptr[index]; }

 

-    Type *operator->() const

-    {

-      return &vector->alc.ptr[index];

-    }

+    bool operator==( const iterator &it ) const { return vector == it.vector && index == it.index; }

+    bool operator!=( const iterator &it ) const { return vector != it.vector || index != it.index; }

 

-    Type &operator*() const

-    {

-      return vector->alc.ptr[index];

-    }

+    iterator& operator++()      {                 ++index; return *this; }

+    iterator  operator++( int ) { auto t = *this; ++index; return t; }

 

-    operator Type*() const

-    {

-      return &vector->alc.ptr[index];

-    }

-

-    bool operator==( const iterator &it ) const

-    {

-      return ( vector == it.vector ) && ( index == it.index );

-    }

-

-    bool operator!=( const iterator &it ) const

-    {

-      return ( vector != it.vector ) || ( index != it.index );

-    }

-

-    iterator& operator++() { ++index; return *this; }

-

-    bool   is_valid()     const { return index < vector->alc.num_elements_used; }

+    bool   is_valid()     const { return index < vector->size(); }

     size_t get_position() const { return index; }

   };

 

-  class reverse_iterator

+public:

+  MVKVector() = delete;

+  MVKVector( mvk_vector_allocator_base<Type> *a ) : alc_ptr{ a } { }

+  virtual ~MVKVector() { }

+

+  iterator begin()    const { return iterator( 0,               *this ); }

+  iterator end()      const { return iterator( alc_ptr->size(), *this ); }

+  size_t   size()     const { return alc_ptr->size(); }

+  bool     empty()    const { return alc_ptr->size() == 0; }

+  size_t   capacity() const { return alc_ptr->get_capacity(); }

+

+  virtual const Type &operator[]( const size_t i ) const = 0;

+  virtual void push_back( const Type &t ) = 0;

+};

+

+

+template<class Type> class MVKVector<Type *>

+{

+  mvk_vector_allocator_base<Type*> *alc_ptr;

+

+public:

+  class iterator

   {

     const MVKVector *vector;

     size_t           index;

 

   public:

-    reverse_iterator() = delete;

-    reverse_iterator( const size_t _index, const MVKVector &_vector ) : vector{ &_vector }, index{ _index } { }

-    reverse_iterator &operator=( const reverse_iterator & ) = delete;

+    iterator() = delete;

+    iterator( const size_t _index, const MVKVector &_vector ) : vector{ &_vector }, index{ _index } { }

+    iterator &operator=( const iterator &it ) = delete;

 

-    Type *operator->() const

+    Type *operator->() const { return vector->alc_ptr->ptr[index]; }

+    Type &operator*()  const { return vector->alc_ptr->ptr[index]; }

+    operator Type*&()  const { return &vector->alc_ptr->ptr[index]; }

+

+    bool operator==( const iterator &it ) const { return vector == it.vector && index == it.index; }

+    bool operator!=( const iterator &it ) const { return vector != it.vector || index != it.index; }

+

+    iterator& operator++()      {                 ++index; return *this; }

+    iterator  operator++( int ) { auto t = *this; ++index; return t; }

+

+    bool   is_valid()     const { return index < vector->size(); }

+    size_t get_position() const { return index; }

+  };

+

+public:

+  MVKVector() = delete;

+  MVKVector( mvk_vector_allocator_base<Type*> *a ) : alc_ptr{ a } { }

+  virtual ~MVKVector() { }

+

+  iterator begin()    const { return iterator( 0,               *this ); }

+  iterator end()      const { return iterator( alc_ptr->size(), *this ); }

+  size_t   size()     const { return alc_ptr->size(); }

+  bool     empty()    const { return alc_ptr->size() == 0; }

+  size_t   capacity() const { return alc_ptr->get_capacity(); }

+

+  virtual Type * const &operator[]( const size_t i ) const = 0;

+  virtual void push_back( const Type *t ) = 0;

+};

+

+

+// this is the actual implementation of MVKVector

+template<class Type, typename Allocator = mvk_vector_allocator_default<Type>> class MVKVectorImpl : public MVKVector<Type>

+{

+  friend class MVKVectorImpl;

+

+  Allocator  alc;

+  

+public:

+  class iterator

+  {

+    const MVKVectorImpl *vector;

+    size_t               index;

+

+  public:

+    iterator() = delete;

+    iterator( const size_t _index, const MVKVectorImpl &_vector ) : vector{ &_vector }, index{ _index } { }

+

+    iterator &operator=( const iterator &it )

     {

-      return &vector->alc.ptr[index];

+      vector = it.vector;

+      index  = it.index;

+      return *this;

     }

 

-    Type &operator*() const

-    {

-      return vector->alc.ptr[index];

-    }

+    Type *operator->() { return &vector->alc.ptr[index]; }

+    Type &operator*()  { return  vector->alc.ptr[index]; }

+    operator Type*()   { return &vector->alc.ptr[index]; }

 

-    operator Type*() const

-    {

-      return &vector->alc.ptr[index];

-    }

-    

-    bool operator==( const reverse_iterator &it ) const

-    {

-      return vector == it.vector && index == it.index;

-    }

+    bool operator==( const iterator &it ) const { return vector == it.vector && index == it.index; }

+    bool operator!=( const iterator &it ) const { return vector != it.vector || index != it.index; }

 

-    bool operator!=( const reverse_iterator &it ) const

-    {

-      return vector != it.vector || index != it.index;

-    }

+    iterator& operator++()      {                 ++index; return *this; }

+    iterator  operator++( int ) { auto t = *this; ++index; return t; }

 

-    reverse_iterator& operator++() { --index; return *this; }

-

-    bool   is_valid()     const { return index < vector->alc.num_elements_used; }

+    bool   is_valid()     const { return index < vector->alc.size(); }

     size_t get_position() const { return index; }

   };

 

 private:

+  // this is the growth strategy -> adjust to your needs

   size_t vector_GetNextCapacity() const

   {

     constexpr auto ELEMENTS_FOR_64_BYTES = 64 / sizeof( Type );

     constexpr auto MINIMUM_CAPACITY = ELEMENTS_FOR_64_BYTES > 4 ? ELEMENTS_FOR_64_BYTES : 4;

     const auto current_capacity = capacity();

-    //if( current_capacity < 256 )

-    //  return MINIMUM_CAPACITY + 2 * current_capacity;

     return MINIMUM_CAPACITY + ( 3 * current_capacity ) / 2;

   }

 

   void vector_Allocate( const size_t s )

   {

-    const auto new_reserved_size = tm_max( s, alc.num_elements_used );

+    const auto new_reserved_size = tm_max( s, size() );

 

     alc.allocate( new_reserved_size );

   }

@@ -156,11 +222,11 @@
   }

 

 public:

-  MVKVector()

+  MVKVectorImpl() : MVKVector<Type>{ &alc }

   {

   }

 

-  MVKVector( const size_t n, const Type t )

+  MVKVectorImpl( const size_t n, const Type t ) : MVKVector<Type>{ &alc }

   {

     if( n > 0 )

     {

@@ -175,7 +241,7 @@
     }

   }

 

-  MVKVector( const MVKVector &a )

+  MVKVectorImpl( const MVKVectorImpl &a ) : MVKVector<Type>{ &alc }

   {

     const size_t n = a.size();

 

@@ -192,11 +258,29 @@
     }

   }

 

-  MVKVector( MVKVector &&a ) : alc{ std::move( a.alc ) }

+  template<typename U>

+  MVKVectorImpl( const U &a ) : MVKVector<Type>{ &alc }

+  {

+    const size_t n = a.size();

+

+    if( n > 0 )

+    {

+      alc.allocate( n );

+

+      for( size_t i = 0; i < n; ++i )

+      {

+        alc.construct( &alc.ptr[i], a[i] );

+      }

+

+      alc.num_elements_used = n;

+    }

+  }

+

+  MVKVectorImpl( MVKVectorImpl &&a ) : MVKVector<Type>{ &alc }, alc{ std::move( a.alc ) }

   {

   }

 

-  MVKVector( std::initializer_list<Type> vector )

+  MVKVectorImpl( std::initializer_list<Type> vector ) : MVKVector<Type>{ &alc }

   {

     if( vector.size() > capacity() )

     {

@@ -211,15 +295,18 @@
     }

   }

 

-  ~MVKVector()

+  ~MVKVectorImpl()

   {

   }

 

-  MVKVector& operator=( const MVKVector &a )

+  template<typename U>

+  MVKVectorImpl& operator=( const U &a )

   {

-    if( this != &a )

+    static_assert( std::is_base_of<MVKVector<Type>, U>::value, "argument is not of type MVKVector" );

+

+    if( this != reinterpret_cast<const MVKVector<Type>*>( &a ) )

     {

-      const auto n = a.alc.num_elements_used;

+      const auto n = a.size();

 

       if( alc.num_elements_used == n )

       {

@@ -241,7 +328,7 @@
 

         for( size_t i = 0; i < n; ++i )

         {

-          alc.construct( &alc.ptr[i], a.alc.ptr[i] );

+          alc.construct( &alc.ptr[i], a[i] );

         }

 

         alc.num_elements_used = n;

@@ -251,37 +338,37 @@
     return *this;

   }

 

-  MVKVector& operator=( MVKVector &&a )

+  MVKVectorImpl& operator=( MVKVectorImpl &&a )

   {

     alc.swap( a.alc );

     return *this;

   }

 

-  bool operator==( const MVKVector &a ) const

+  bool operator==( const MVKVectorImpl &a ) const

   {

     if( alc.num_elements_used != a.alc.num_elements_used )

       return false;

     for( size_t i = 0; i < alc.num_elements_used; ++i )

     {

-      if( alc.ptr[i] != a.alc.ptr[i] )

+      if( alc[i] != a.alc[i] )

         return false;

     }

     return true;

   }

 

-  bool operator!=( const MVKVector &a ) const

+  bool operator!=( const MVKVectorImpl &a ) const

   {

     if( alc.num_elements_used != a.alc.num_elements_used )

       return true;

     for( size_t i = 0; i < alc.num_elements_used; ++i )

     {

-      if( alc.ptr[i] != a.alc.ptr[i] )

+      if( alc.ptr[i] != a.alc[i] )

         return true;

     }

     return false;

   }

 

-  void swap( MVKVector &a )

+  void swap( MVKVectorImpl &a )

   {

     alc.swap( a.alc );

   }

@@ -298,8 +385,6 @@
 

   iterator         begin()  const { return iterator( 0, *this ); }

   iterator         end()    const { return iterator( alc.num_elements_used, *this ); }

-  reverse_iterator rbegin() const { return reverse_iterator( alc.num_elements_used - 1, *this ); }

-  reverse_iterator rend()   const { return reverse_iterator( size_t( -1 ), *this ); }

   size_t           size()   const { return alc.num_elements_used; }

   bool             empty()  const { return alc.num_elements_used == 0; }

 

@@ -308,7 +393,7 @@
     return alc.ptr[i];

   }

 

-  const Type &operator[]( const size_t i ) const

+  const Type &operator[]( const size_t i ) const override

   {

     return alc.ptr[i];

   }

@@ -393,7 +478,7 @@
   void assign( InputIterator first, InputIterator last )

   {

     clear();

-    

+

     while( first != last )

     {

       emplace_back( *first );

@@ -493,7 +578,7 @@
     }

   }

 

-  void push_back( const Type &t )

+  void push_back( const Type &t ) override

   {

     if( alc.num_elements_used == capacity() )

       vector_ReAllocate( vector_GetNextCapacity() );

@@ -524,10 +609,377 @@
   }

 };

 

+// specialization for pointer types

+template<class Type, typename Allocator> class MVKVectorImpl<Type*, Allocator> : public MVKVector<Type*>

+{

+  friend class MVKVectorImpl;

+

+  Allocator  alc;

+

+public:

+  class iterator

+  {

+    MVKVectorImpl *vector;

+    size_t         index;

+

+  public:

+    iterator() = delete;

+    iterator( const size_t _index, MVKVectorImpl &_vector ) : vector{ &_vector }, index{ _index } { }

+

+    iterator &operator=( const iterator &it )

+    {

+      vector = it.vector;

+      index = it.index;

+      return *this;

+    }

+

+    Type *&operator*() { return vector->alc[index]; }

+

+    bool operator==( const iterator &it ) const { return vector == it.vector && index == it.index; }

+    bool operator!=( const iterator &it ) const { return vector != it.vector || index != it.index; }

+

+    iterator& operator++() { ++index; return *this; }

+    iterator  operator++( int ) { auto t = *this; ++index; return t; }

+

+    bool   is_valid()     const { return index < vector->alc.size(); }

+    size_t get_position() const { return index; }

+  };

+

+private:

+  // this is the growth strategy -> adjust to your needs

+  size_t vector_GetNextCapacity() const

+  {

+    constexpr auto ELEMENTS_FOR_64_BYTES = 64 / sizeof( Type );

+    constexpr auto MINIMUM_CAPACITY = ELEMENTS_FOR_64_BYTES > 4 ? ELEMENTS_FOR_64_BYTES : 4;

+    const auto current_capacity = capacity();

+    return MINIMUM_CAPACITY + ( 3 * current_capacity ) / 2;

+  }

+

+  void vector_Allocate( const size_t s )

+  {

+    const auto new_reserved_size = tm_max( s, size() );

+

+    alc.allocate( new_reserved_size );

+  }

+

+  void vector_ReAllocate( const size_t s )

+  {

+    alc.re_allocate( s );

+  }

+

+public:

+  MVKVectorImpl() : MVKVector<Type*>{ &alc }

+  {

+  }

+

+  MVKVectorImpl( const size_t n, const Type *t ) : MVKVector<Type*>{ &alc }

+  {

+    if ( n > 0 )

+    {

+      alc.allocate( n );

+

+      for ( size_t i = 0; i < n; ++i )

+      {

+        alc.ptr[i] = t;

+      }

+

+      alc.num_elements_used = n;

+    }

+  }

+

+  MVKVectorImpl( const MVKVectorImpl &a ) : MVKVector<Type*>{ &alc }

+  {

+    const size_t n = a.size();

+

+    if ( n > 0 )

+    {

+      alc.allocate( n );

+

+      for ( size_t i = 0; i < n; ++i )

+      {

+        alc.ptr[i] = a.alc.ptr[i];

+      }

+

+      alc.num_elements_used = n;

+    }

+  }

+

+  MVKVectorImpl( MVKVectorImpl &&a ) : MVKVector<Type*>{ &alc }, alc{ std::move( a.alc ) }

+  {

+  }

+

+  MVKVectorImpl( std::initializer_list<Type*> vector ) : MVKVector<Type*>{ &alc }

+  {

+    if ( vector.size() > capacity() )

+    {

+      vector_Allocate( vector.size() );

+    }

+

+    // std::initializer_list does not yet support std::move, we use it anyway but it has no effect

+    for ( auto element : vector )

+    {

+      alc.ptr[alc.num_elements_used] = element;

+      ++alc.num_elements_used;

+    }

+  }

+

+  ~MVKVectorImpl()

+  {

+  }

+

+  template<typename U>

+  MVKVectorImpl& operator=( const U &a )

+  {

+    static_assert( std::is_base_of<MVKVector<U>, U>::value, "argument is not of type MVKVector" );

+

+    if ( this != reinterpret_cast< const MVKVector<Type>* >( &a ) )

+    {

+      const auto n = a.size();

+

+      if ( alc.num_elements_used == n )

+      {

+        for ( size_t i = 0; i < n; ++i )

+        {

+          alc.ptr[i] = a.alc.ptr[i];

+        }

+      }

+      else

+      {

+        if ( n > capacity() )

+        {

+          vector_ReAllocate( n );

+        }

+

+        for ( size_t i = 0; i < n; ++i )

+        {

+          alc.ptr[i] = a[i];

+        }

+

+        alc.num_elements_used = n;

+      }

+    }

+

+    return *this;

+  }

+

+  MVKVectorImpl& operator=( MVKVectorImpl &&a )

+  {

+    alc.swap( a.alc );

+    return *this;

+  }

+

+  bool operator==( const MVKVectorImpl &a ) const

+  {

+    if ( alc.num_elements_used != a.alc.num_elements_used )

+      return false;

+    for ( size_t i = 0; i < alc.num_elements_used; ++i )

+    {

+      if ( alc[i] != a.alc[i] )

+        return false;

+    }

+    return true;

+  }

+

+  bool operator!=( const MVKVectorImpl &a ) const

+  {

+    if ( alc.num_elements_used != a.alc.num_elements_used )

+      return true;

+    for ( size_t i = 0; i < alc.num_elements_used; ++i )

+    {

+      if ( alc.ptr[i] != a.alc[i] )

+        return true;

+    }

+    return false;

+  }

+

+  void swap( MVKVectorImpl &a )

+  {

+    alc.swap( a.alc );

+  }

+

+  void clear()

+  {

+    alc.num_elements_used = 0;

+  }

+

+  void reset()

+  {

+    alc.deallocate();

+  }

+

+  iterator begin()        { return iterator( 0, *this ); }

+  iterator end()          { return iterator( alc.num_elements_used, *this ); }

+  size_t   size()   const { return alc.num_elements_used; }

+  bool     empty()  const { return alc.num_elements_used == 0; }

+

+  Type *at( const size_t i ) const

+  {

+    return alc.ptr[i];

+  }

+

+  Type * const &operator[]( const size_t i ) const override

+  {

+    return alc.ptr[i];

+  }

+

+  Type *&operator[]( const size_t i )

+  {

+    return alc.ptr[i];

+  }

+

+  const Type * const *data() const

+  {

+    return &alc.ptr[0];

+  }

+

+  Type **data()

+  {

+    return &alc.ptr[0];

+  }

+

+  size_t capacity() const

+  {

+    return alc.get_capacity();

+  }

+

+  const Type *back() const

+  {

+    return alc.ptr[alc.num_elements_used - 1];

+  }

+

+  Type *back()

+  {

+    return alc.ptr[alc.num_elements_used - 1];

+  }

+

+  void pop_back()

+  {

+    if ( alc.num_elements_used > 0 )

+    {

+      --alc.num_elements_used;

+    }

+  }

+

+  void reserve( const size_t new_size )

+  {

+    if ( new_size > capacity() )

+    {

+      vector_ReAllocate( new_size );

+    }

+  }

+

+  void assign( const size_t new_size, const Type *t )

+  {

+    if ( new_size <= capacity() )

+    {

+      clear();

+    }

+    else

+    {

+      vector_Allocate( new_size );

+    }

+

+    for ( size_t i = 0; i < new_size; ++i )

+    {

+      alc.ptr[i] = const_cast< Type* >( t );

+    }

+

+    alc.num_elements_used = new_size;

+  }

+

+  void resize( const size_t new_size )

+  {

+    if ( new_size == alc.num_elements_used )

+    {

+      return;

+    }

+

+    if ( new_size == 0 )

+    {

+      clear();

+      return;

+    }

+

+    if ( new_size > alc.num_elements_used )

+    {

+      if ( new_size > capacity() )

+      {

+        vector_ReAllocate( new_size );

+      }

+

+      while ( alc.num_elements_used < new_size )

+      {

+        alc.ptr[alc.num_elements_used] = nullptr;

+        ++alc.num_elements_used;

+      }

+    }

+    else

+    {

+      alc.num_elements_used = new_size;

+    }

+  }

+

+  // trims the capacity of the MVKVector to the number of used elements

+  void shrink_to_fit()

+  {

+    alc.shrink_to_fit();

+  }

+

+  void erase( const iterator it )

+  {

+    if ( it.is_valid() )

+    {

+      --alc.num_elements_used;

+

+      for ( size_t i = it.get_position(); i < alc.num_elements_used; ++i )

+      {

+        alc.ptr[i] = alc.ptr[i + 1];

+      }

+    }

+  }

+

+  // adds t before position it and automatically resizes vector if necessary

+  void insert( const iterator it, const Type *t )

+  {

+    if ( !it.is_valid() || alc.num_elements_used == 0 )

+    {

+      push_back( t );

+    }

+    else

+    {

+      if ( alc.num_elements_used == capacity() )

+        vector_ReAllocate( vector_GetNextCapacity() );

+

+      // move the remaining elements

+      const size_t it_position = it.get_position();

+      for ( size_t i = alc.num_elements_used; i > it_position; --i )

+      {

+        alc.ptr[i] = alc.ptr[i - 1];

+      }

+

+      alc.ptr[it_position] = const_cast< Type* >( t );

+      ++alc.num_elements_used;

+    }

+  }

+

+  void push_back( const Type *t ) override

+  {

+    if ( alc.num_elements_used == capacity() )

+      vector_ReAllocate( vector_GetNextCapacity() );

+

+    alc.ptr[alc.num_elements_used] = const_cast< Type* >( t );

+    ++alc.num_elements_used;

+  }

+};

+

 

 template<typename Type>

-using MVKVector128 = MVKVector<Type, mvk_vector_allocator_with_stack<Type, 128>>;

+using MVKVectorDefault = MVKVectorImpl<Type, mvk_vector_allocator_default<Type>>;

+

+template<typename Type, size_t N = 8>

+using MVKVectorInline  = MVKVectorImpl<Type, mvk_vector_allocator_with_stack<Type, N>>;

 

 

 #endif

 

+

diff --git a/MoltenVK/MoltenVK/Utility/MVKVectorAllocator.h b/MoltenVK/MoltenVK/Utility/MVKVectorAllocator.h
index 442e0ac..a5c320a 100755
--- a/MoltenVK/MoltenVK/Utility/MVKVectorAllocator.h
+++ b/MoltenVK/MoltenVK/Utility/MVKVectorAllocator.h
@@ -1,7 +1,7 @@
 /*

  * MVKVectorAllocator.h

  *

- * Copyright (c) 2012-2018 Dr. Torsten Hans (hans@ipacs.de)

+ * Copyright (c) 2012-2019 Dr. Torsten Hans (hans@ipacs.de)

  *

  * Licensed under the Apache License, Version 2.0 (the "License");

  * you may not use this file except in compliance with the License.

@@ -37,16 +37,42 @@
 

 //////////////////////////////////////////////////////////////////////////////////////////

 //

-// mvk_vector_allocator_default -> malloc based allocator for MVKVector

+// mvk_vector_allocator_base -> base class so we can use MVKVector with template parameter

 //

 //////////////////////////////////////////////////////////////////////////////////////////

-template <typename T>

-class mvk_vector_allocator_default final

+template<typename T>

+class mvk_vector_allocator_base

 {

 public:

   T      *ptr;

   size_t  num_elements_used;

 

+public:

+  mvk_vector_allocator_base()                                           : ptr{ nullptr }, num_elements_used{ 0 }                  { }

+  mvk_vector_allocator_base( T *_ptr, const size_t _num_elements_used ) : ptr{ _ptr },    num_elements_used{ _num_elements_used } { }

+  virtual ~mvk_vector_allocator_base() { }

+

+  const T &operator[]( const size_t i ) const { return ptr[i]; }

+  T       &operator[]( const size_t i )       { return ptr[i]; }

+

+  size_t size() const { return num_elements_used; }

+

+  virtual size_t get_capacity() const = 0;

+  virtual void   allocate( const size_t num_elements_to_reserve ) = 0;

+  virtual void   re_allocate( const size_t num_elements_to_reserve ) = 0;

+  virtual void   shrink_to_fit() = 0;

+  virtual void   deallocate() = 0;

+};

+

+

+//////////////////////////////////////////////////////////////////////////////////////////

+//

+// mvk_vector_allocator_default -> malloc based allocator for MVKVector

+//

+//////////////////////////////////////////////////////////////////////////////////////////

+template <typename T>

+class mvk_vector_allocator_default final : public mvk_vector_allocator_base<T>

+{

 private:

   size_t  num_elements_reserved;

 

@@ -77,38 +103,38 @@
   template<class S> typename std::enable_if< !std::is_trivially_destructible<S>::value >::type

     destruct_all()

   {

-    for( size_t i = 0; i < num_elements_used; ++i )

+    for( size_t i = 0; i < mvk_vector_allocator_base<S>::num_elements_used; ++i )

     {

-      ptr[i].~S();

+      mvk_vector_allocator_base<S>::ptr[i].~S();

     }

 

-    num_elements_used = 0;

+    mvk_vector_allocator_base<S>::num_elements_used = 0;

   }

 

   template<class S> typename std::enable_if< std::is_trivially_destructible<S>::value >::type

     destruct_all()

   {

-    num_elements_used = 0;

+    mvk_vector_allocator_base<T>::num_elements_used = 0;

   }

 

 public:

-  constexpr mvk_vector_allocator_default() : ptr{ nullptr }, num_elements_used{ 0 }, num_elements_reserved{ 0 }

+  constexpr mvk_vector_allocator_default() : mvk_vector_allocator_base<T>{}, num_elements_reserved{ 0 }

   {

   }

 

-  mvk_vector_allocator_default( mvk_vector_allocator_default &&a ) : ptr{ a.ptr }, num_elements_used{ a.num_elements_used }, num_elements_reserved{ a.num_elements_reserved }

+  mvk_vector_allocator_default( mvk_vector_allocator_default &&a ) : mvk_vector_allocator_base<T>{ a.ptr, a.num_elements_used }, num_elements_reserved{ a.num_elements_reserved }

   {

-    a.ptr = nullptr;

-    a.num_elements_used = 0;

+    a.ptr                   = nullptr;

+    a.num_elements_used     = 0;

     a.num_elements_reserved = 0;

   }

 

-  ~mvk_vector_allocator_default()

+  virtual ~mvk_vector_allocator_default()

   {

     deallocate();

   }

 

-  size_t get_capacity() const

+  size_t get_capacity() const override

   {

     return num_elements_reserved;

   }

@@ -119,25 +145,25 @@
     const auto copy_num_elements_used     = a.num_elements_used;

     const auto copy_num_elements_reserved = a.num_elements_reserved;

 

-    a.ptr                   = ptr;

-    a.num_elements_used     = num_elements_used;

+    a.ptr                   = mvk_vector_allocator_base<T>::ptr;

+    a.num_elements_used     = mvk_vector_allocator_base<T>::num_elements_used;

     a.num_elements_reserved = num_elements_reserved;

 

-    ptr                   = copy_ptr;

-    num_elements_used     = copy_num_elements_used;

+    mvk_vector_allocator_base<T>::ptr                = copy_ptr;

+    mvk_vector_allocator_base<T>::num_elements_used  = copy_num_elements_used;

     num_elements_reserved = copy_num_elements_reserved;

   }

 

-  void allocate( const size_t num_elements_to_reserve )

+  void allocate( const size_t num_elements_to_reserve ) override

   {

     deallocate();

 

-    ptr                   = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

-    num_elements_used     = 0;

+    mvk_vector_allocator_base<T>::ptr                = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

+    mvk_vector_allocator_base<T>::num_elements_used  = 0;

     num_elements_reserved = num_elements_to_reserve;

   }

 

-  void re_allocate( const size_t num_elements_to_reserve )

+  void re_allocate( const size_t num_elements_to_reserve ) override

   {

     //if constexpr( std::is_trivially_copyable<T>::value )

     //{

@@ -147,53 +173,53 @@
     {

       auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

 

-      for( size_t i = 0; i < num_elements_used; ++i )

+      for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

       {

-        construct( &new_ptr[i], std::move( ptr[i] ) );

-        destruct( &ptr[i] );

+        construct( &new_ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+        destruct( &mvk_vector_allocator_base<T>::ptr[i] );

       }

 

       //if ( ptr != nullptr )

       {

-        mvk_memory_allocator::free( ptr );

+        mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

       }

 

-      ptr = new_ptr;

+      mvk_vector_allocator_base<T>::ptr = new_ptr;

     }

 

     num_elements_reserved = num_elements_to_reserve;

   }

 

-  void shrink_to_fit()

+  void shrink_to_fit() override

   {

-    if( num_elements_used == 0 )

+    if( mvk_vector_allocator_base<T>::num_elements_used == 0 )

     {

       deallocate();

     }

     else

     {

-      auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_used * sizeof( T ) ) );

+      auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( mvk_vector_allocator_base<T>::num_elements_used * sizeof( T ) ) );

 

-      for( size_t i = 0; i < num_elements_used; ++i )

+      for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

       {

-        construct( &new_ptr[i], std::move( ptr[i] ) );

-        destruct( &ptr[i] );

+        construct( &new_ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+        destruct( &mvk_vector_allocator_base<T>::ptr[i] );

       }

 

-      mvk_memory_allocator::free( ptr );

+      mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

 

-      ptr = new_ptr;

-      num_elements_reserved = num_elements_used;

+      mvk_vector_allocator_base<T>::ptr = new_ptr;

+      num_elements_reserved = mvk_vector_allocator_base<T>::num_elements_used;

     }

   }

 

-  void deallocate()

+  void deallocate() override

   {

     destruct_all<T>();

 

-    mvk_memory_allocator::free( ptr );

+    mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

 

-    ptr = nullptr;

+    mvk_vector_allocator_base<T>::ptr = nullptr;

     num_elements_reserved = 0;

   }

 };

@@ -201,16 +227,12 @@
 

 //////////////////////////////////////////////////////////////////////////////////////////

 //

-// mvk_vector_allocator_with_stack -> malloc based MVKVector allocator with stack storage

+// mvk_vector_allocator_with_stack -> malloc based MVKVector allocator with preallocated storage

 //

 //////////////////////////////////////////////////////////////////////////////////////////

 template <typename T, int N>

-class mvk_vector_allocator_with_stack

+class mvk_vector_allocator_with_stack final : public mvk_vector_allocator_base<T>

 {

-public:

-  T      *ptr;

-  size_t  num_elements_used;

-

 private:

   //size_t  num_elements_reserved; // uhh, num_elements_reserved is mapped onto the stack elements, let the fun begin

   alignas( alignof( T ) ) unsigned char   elements_stack[N * sizeof( T )];

@@ -219,10 +241,9 @@
 

   void set_num_elements_reserved( const size_t num_elements_reserved )

   {

-    *reinterpret_cast< size_t* >( &elements_stack[0] ) = num_elements_reserved;

+    *reinterpret_cast<size_t*>( &elements_stack[0] ) = num_elements_reserved;

   }

 

-

 public:

   //

   // faster element construction and destruction using type traits

@@ -253,18 +274,18 @@
   template<class S> typename std::enable_if< !std::is_trivially_destructible<S>::value >::type

     destruct_all()

   {

-    for( size_t i = 0; i < num_elements_used; ++i )

+    for( size_t i = 0; i < mvk_vector_allocator_base<S>::num_elements_used; ++i )

     {

-      ptr[i].~S();

+      mvk_vector_allocator_base<S>::ptr[i].~S();

     }

 

-    num_elements_used = 0;

+    mvk_vector_allocator_base<S>::num_elements_used = 0;

   }

 

   template<class S> typename std::enable_if< std::is_trivially_destructible<S>::value >::type

     destruct_all()

   {

-    num_elements_used = 0;

+    mvk_vector_allocator_base<S>::num_elements_used = 0;

   }

 

   template<class S> typename std::enable_if< !std::is_trivially_destructible<S>::value >::type

@@ -272,19 +293,19 @@
   {

     T stack_copy[N];

 

-    for( size_t i = 0; i < num_elements_used; ++i )

+    for( size_t i = 0; i < mvk_vector_allocator_base<S>::num_elements_used; ++i )

     {

-      construct( &stack_copy[i], std::move( ptr[i] ) );

-      destruct( &ptr[i] );

+      construct( &stack_copy[i], std::move( S::ptr[i] ) );

+      destruct( &mvk_vector_allocator_base<S>::ptr[i] );

     }

 

     for( size_t i = 0; i < a.num_elements_used; ++i )

     {

-      construct( &ptr[i], std::move( a.ptr[i] ) );

-      destruct( &ptr[i] );

+      construct( &mvk_vector_allocator_base<S>::ptr[i], std::move( a.ptr[i] ) );

+      destruct( &mvk_vector_allocator_base<S>::ptr[i] );

     }

 

-    for( size_t i = 0; i < num_elements_used; ++i )

+    for( size_t i = 0; i < mvk_vector_allocator_base<S>::num_elements_used; ++i )

     {

       construct( &a.ptr[i], std::move( stack_copy[i] ) );

       destruct( &stack_copy[i] );

@@ -304,26 +325,26 @@
   }

 

 public:

-  mvk_vector_allocator_with_stack() : ptr{ reinterpret_cast< T* >( &elements_stack[0] ) }, num_elements_used{ 0 }

+  mvk_vector_allocator_with_stack() : mvk_vector_allocator_base<T>{ reinterpret_cast<T*>( &elements_stack[0] ), 0 }

   {

   }

 

-  mvk_vector_allocator_with_stack( mvk_vector_allocator_with_stack &&a ) : num_elements_used{ a.num_elements_used }

+  mvk_vector_allocator_with_stack( mvk_vector_allocator_with_stack &&a ) : mvk_vector_allocator_base<T>{ nullptr, a.num_elements_used }

   {

     // is a heap based -> steal ptr from a

     if( !a.get_data_on_stack() )

     {

-      ptr = a.ptr;

+      mvk_vector_allocator_base<T>::ptr = a.ptr;

       set_num_elements_reserved( a.get_capacity() );

 

       a.ptr = a.get_default_ptr();

     }

     else

     {

-      ptr = get_default_ptr();

+      mvk_vector_allocator_base<T>::ptr = get_default_ptr();

       for( size_t i = 0; i < a.num_elements_used; ++i )

       {

-        construct( &ptr[i], std::move( a.ptr[i] ) );

+        construct( &mvk_vector_allocator_base<T>::ptr[i], std::move( a.ptr[i] ) );

         destruct( &a.ptr[i] );

       }

     }

@@ -336,9 +357,9 @@
     deallocate();

   }

 

-  size_t get_capacity() const

+  size_t get_capacity() const override

   {

-    return get_data_on_stack() ? N : *reinterpret_cast< const size_t* >( &elements_stack[0] );

+    return get_data_on_stack() ? N : *reinterpret_cast<const size_t*>( &elements_stack[0] );

   }

 

   constexpr T *get_default_ptr() const

@@ -348,7 +369,7 @@
 

   bool get_data_on_stack() const

   {

-    return ptr == get_default_ptr();

+    return mvk_vector_allocator_base<T>::ptr == get_default_ptr();

   }

 

   void swap( mvk_vector_allocator_with_stack &a )

@@ -356,9 +377,9 @@
     // both allocators on heap -> easy case

     if( !get_data_on_stack() && !a.get_data_on_stack() )

     {

-      auto copy_ptr = ptr;

+      auto copy_ptr = mvk_vector_allocator_base<T>::ptr;

       auto copy_num_elements_reserved = get_capacity();

-      ptr = a.ptr;

+      mvk_vector_allocator_base<T>::ptr = a.ptr;

       set_num_elements_reserved( a.get_capacity() );

       a.ptr = copy_ptr;

       a.set_num_elements_reserved( copy_num_elements_reserved );

@@ -374,24 +395,24 @@
       auto copy_num_elements_reserved = a.get_capacity();

 

       a.ptr = a.get_default_ptr();

-      for( size_t i = 0; i < num_elements_used; ++i )

+      for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

       {

-        construct( &a.ptr[i], std::move( ptr[i] ) );

-        destruct( &ptr[i] );

+        construct( &a.ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+        destruct( &mvk_vector_allocator_base<T>::ptr[i] );

       }

 

-      ptr = copy_ptr;

+      mvk_vector_allocator_base<T>::ptr = copy_ptr;

       set_num_elements_reserved( copy_num_elements_reserved );

     }

     else if( !get_data_on_stack() && a.get_data_on_stack() )

     {

-      auto copy_ptr = ptr;

+      auto copy_ptr = mvk_vector_allocator_base<T>::ptr;

       auto copy_num_elements_reserved = get_capacity();

 

-      ptr = get_default_ptr();

+      mvk_vector_allocator_base<T>::ptr = get_default_ptr();

       for( size_t i = 0; i < a.num_elements_used; ++i )

       {

-        construct( &ptr[i], std::move( a.ptr[i] ) );

+        construct( &mvk_vector_allocator_base<T>::ptr[i], std::move( a.ptr[i] ) );

         destruct( &a.ptr[i] );

       }

 

@@ -399,15 +420,15 @@
       a.set_num_elements_reserved( copy_num_elements_reserved );

     }

 

-    auto copy_num_elements_used = num_elements_used;

-    num_elements_used = a.num_elements_used;

+    auto copy_num_elements_used = mvk_vector_allocator_base<T>::num_elements_used;

+    mvk_vector_allocator_base<T>::num_elements_used = a.num_elements_used;

     a.num_elements_used = copy_num_elements_used;

   }

 

   //

   // allocates rounded up to the defined alignment the number of bytes / if the system cannot allocate the specified amount of memory then a null block is returned

   //

-  void allocate( const size_t num_elements_to_reserve )

+  void allocate( const size_t num_elements_to_reserve ) override

   {

     deallocate();

 

@@ -417,8 +438,8 @@
       return;

     }

 

-    ptr               = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

-    num_elements_used = 0;

+    mvk_vector_allocator_base<T>::ptr               = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

+    mvk_vector_allocator_base<T>::num_elements_used = 0;

     set_num_elements_reserved( num_elements_to_reserve );

   }

 

@@ -427,18 +448,18 @@
   {

     auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( num_elements_to_reserve * sizeof( T ) ) );

 

-    for( size_t i = 0; i < num_elements_used; ++i )

+    for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

     {

-      construct( &new_ptr[i], std::move( ptr[i] ) );

-      destruct( &ptr[i] );

+      construct( &new_ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+      destruct( &mvk_vector_allocator_base<T>::ptr[i] );

     }

 

-    if( ptr != get_default_ptr() )

+    if( mvk_vector_allocator_base<T>::ptr != get_default_ptr() )

     {

-      mvk_memory_allocator::free( ptr );

+      mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

     }

 

-    ptr = new_ptr;

+    mvk_vector_allocator_base<T>::ptr = new_ptr;

     set_num_elements_reserved( num_elements_to_reserve );

   }

 

@@ -460,7 +481,7 @@
   //  set_num_elements_reserved( num_elements_to_reserve );

   //}

 

-  void re_allocate( const size_t num_elements_to_reserve )

+  void re_allocate( const size_t num_elements_to_reserve ) override

   {

     //TM_ASSERT( num_elements_to_reserve > get_capacity() );

 

@@ -470,56 +491,56 @@
     }

   }

 

-  void shrink_to_fit()

+  void shrink_to_fit() override

   {

     // nothing to do if data is on stack already

     if( get_data_on_stack() )

       return;

 

     // move elements to stack space

-    if( num_elements_used <= N )

+    if( mvk_vector_allocator_base<T>::num_elements_used <= N )

     {

-      const auto num_elements_reserved = get_capacity();

+      //const auto num_elements_reserved = get_capacity();

 

       auto *stack_ptr = get_default_ptr();

-      for( size_t i = 0; i < num_elements_used; ++i )

+      for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

       {

-        construct( &stack_ptr[i], std::move( ptr[i] ) );

-        destruct( &ptr[i] );

+        construct( &stack_ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+        destruct( &mvk_vector_allocator_base<T>::ptr[i] );

       }

 

-      mvk_memory_allocator::free( ptr );

+      mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

 

-      ptr = stack_ptr;

+      mvk_vector_allocator_base<T>::ptr = stack_ptr;

     }

     else

     {

-      auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( ptr, num_elements_used * sizeof( T ) ) );

+      auto *new_ptr = reinterpret_cast< T* >( mvk_memory_allocator::alloc( mvk_vector_allocator_base<T>::num_elements_used * sizeof( T ) ) );

 

-      for( size_t i = 0; i < num_elements_used; ++i )

+      for( size_t i = 0; i < mvk_vector_allocator_base<T>::num_elements_used; ++i )

       {

-        construct( &new_ptr[i], std::move( ptr[i] ) );

-        destruct( &ptr[i] );

+        construct( &new_ptr[i], std::move( mvk_vector_allocator_base<T>::ptr[i] ) );

+        destruct( &mvk_vector_allocator_base<T>::ptr[i] );

       }

 

-      mvk_memory_allocator::free( ptr );

+      mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

 

-      ptr = new_ptr;

-      set_num_elements_reserved( num_elements_used );

+      mvk_vector_allocator_base<T>::ptr = new_ptr;

+      set_num_elements_reserved( mvk_vector_allocator_base<T>::num_elements_used );

     }

   }

 

-  void deallocate()

+  void deallocate() override

   {

     destruct_all<T>();

 

     if( !get_data_on_stack() )

     {

-      mvk_memory_allocator::free( ptr );

+      mvk_memory_allocator::free( mvk_vector_allocator_base<T>::ptr );

     }

 

-    ptr = get_default_ptr();

-    num_elements_used = 0;

+    mvk_vector_allocator_base<T>::ptr = get_default_ptr();

+    mvk_vector_allocator_base<T>::num_elements_used = 0;

   }

 };

 

diff --git a/MoltenVK/MoltenVK/Utility/MVKWatermark.h b/MoltenVK/MoltenVK/Utility/MVKWatermark.h
index 2b20a44..6836c03 100644
--- a/MoltenVK/MoltenVK/Utility/MVKWatermark.h
+++ b/MoltenVK/MoltenVK/Utility/MVKWatermark.h
@@ -1,7 +1,7 @@
 /*
  * MVKWatermark.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKWatermark.mm b/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
index 2ea403c..71eb755 100644
--- a/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
+++ b/MoltenVK/MoltenVK/Utility/MVKWatermark.mm
@@ -1,7 +1,7 @@
 /*
  * MVKWatermark.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKWatermarkShaderSource.h b/MoltenVK/MoltenVK/Utility/MVKWatermarkShaderSource.h
index 31029e5..f1b140b 100644
--- a/MoltenVK/MoltenVK/Utility/MVKWatermarkShaderSource.h
+++ b/MoltenVK/MoltenVK/Utility/MVKWatermarkShaderSource.h
@@ -1,7 +1,7 @@
 /*
  * MVKWatermarkShaderSource.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Utility/MVKWatermarkTextureContent.h b/MoltenVK/MoltenVK/Utility/MVKWatermarkTextureContent.h
index 2a9282a..7c2ac3e 100644
--- a/MoltenVK/MoltenVK/Utility/MVKWatermarkTextureContent.h
+++ b/MoltenVK/MoltenVK/Utility/MVKWatermarkTextureContent.h
@@ -1,7 +1,7 @@
 /*
  * MVKWatermarkTextureContent.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
index 1f00b31..9157553 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
@@ -1,7 +1,7 @@
 /*
  * mvk_datatypes.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -454,14 +454,14 @@
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_ASTC_12x12_UNORM_BLOCK, MTLPixelFormatASTC_12x12_LDR, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 12, 12, 16, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_ASTC_12x12_SRGB_BLOCK, MTLPixelFormatASTC_12x12_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 12, 12, 16, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
 
-    // Extension VK_IMG_format_pvrtc
+	// Extension VK_IMG_format_pvrtc
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_2BPP, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_4BPP, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_4BPP, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_2BPP_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_4BPP_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
-	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, MTLPixelFormatPVRTC_RGBA_4BPP_sRGB, MTLPixelFormatInvalid, 8.0, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_COMPRESSED_FEATS, MVK_FMT_NO_FEATS ),
+	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 8, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 	MVK_MAKE_FMT_STRUCT( VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 4, 4, 8, MTLVertexFormatInvalid, MTLVertexFormatInvalid, kMTLFmtNA, kMTLFmtNA, kMVKFormatCompressed, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ),
 
     // Future extension VK_KHX_color_conversion and Vulkan 1.1.
@@ -763,6 +763,24 @@
 	}
 }
 
+MVK_PUBLIC_SYMBOL bool mvkMTLPixelFormatIsPVRTCFormat(MTLPixelFormat mtlFormat) {
+	switch (mtlFormat) {
+#if MVK_IOS
+		case MTLPixelFormatPVRTC_RGBA_2BPP:
+		case MTLPixelFormatPVRTC_RGBA_2BPP_sRGB:
+		case MTLPixelFormatPVRTC_RGBA_4BPP:
+		case MTLPixelFormatPVRTC_RGBA_4BPP_sRGB:
+		case MTLPixelFormatPVRTC_RGB_2BPP:
+		case MTLPixelFormatPVRTC_RGB_2BPP_sRGB:
+		case MTLPixelFormatPVRTC_RGB_4BPP:
+		case MTLPixelFormatPVRTC_RGB_4BPP_sRGB:
+			return true;
+#endif
+		default:
+			return false;
+	}
+}
+
 MVK_PUBLIC_SYMBOL MTLTextureType mvkMTLTextureTypeFromVkImageType(VkImageType vkImageType,
 																  uint32_t arraySize,
 																  bool isMultisample) {
diff --git a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
index f756b4d..db81fec 100644
--- a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
@@ -1,7 +1,7 @@
 /*
  * vk_mvk_moltenvk.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -92,30 +92,20 @@
 }
 
 MVK_PUBLIC_SYMBOL void vkGetVersionStringsMVK(
-    char* pMoltenVersionStringBuffer,
-    uint32_t moltenVersionStringBufferLength,
-    char* pVulkanVersionStringBuffer,
-    uint32_t vulkanVersionStringBufferLength) {
+	char*										pMoltenVersionStringBuffer,
+	uint32_t									moltenVersionStringBufferLength,
+	char*										pVulkanVersionStringBuffer,
+	uint32_t									vulkanVersionStringBufferLength) {
 
-    size_t len;
+	size_t len;
 
-    string mvkVer;
-    mvkVer += to_string(MVK_VERSION / 10000);
-    mvkVer += ".";
-    mvkVer += to_string((MVK_VERSION % 10000) / 100);
-    mvkVer += ".";
-    mvkVer += to_string(MVK_VERSION % 100);
-    len = mvkVer.copy(pMoltenVersionStringBuffer, moltenVersionStringBufferLength - 1);
-    pMoltenVersionStringBuffer[len] = 0;    // terminator
+	string mvkVer = mvkGetMoltenVKVersionString(MVK_VERSION);
+	len = mvkVer.copy(pMoltenVersionStringBuffer, moltenVersionStringBufferLength - 1);
+	pMoltenVersionStringBuffer[len] = 0;    // terminator
 
-    string vkVer;
-    vkVer += to_string(VK_VERSION_MAJOR(MVK_VULKAN_API_VERSION));
-    vkVer += ".";
-    vkVer += to_string(VK_VERSION_MINOR(MVK_VULKAN_API_VERSION));
-    vkVer += ".";
-    vkVer += to_string(VK_VERSION_PATCH(MVK_VULKAN_API_VERSION));
-    len = vkVer.copy(pVulkanVersionStringBuffer, vulkanVersionStringBufferLength - 1);
-    pVulkanVersionStringBuffer[len] = 0;    // terminator
+	string vkVer = mvkGetVulkanVersionString(MVK_VULKAN_API_VERSION);
+	len = vkVer.copy(pVulkanVersionStringBuffer, vulkanVersionStringBufferLength - 1);
+	pVulkanVersionStringBuffer[len] = 0;    // terminator
 }
 
 MVK_PUBLIC_SYMBOL void vkGetMTLDeviceMVK(
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index 2d00950..01a8926 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -1,7 +1,7 @@
 /*
  * vulkan.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
index 1811c9c..0ad5c67 100644
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
+++ b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
@@ -1,7 +1,7 @@
 /*
  * GLSLConversion.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm
index ca1f46f..4bfb6cc 100644
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm
+++ b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm
@@ -1,7 +1,7 @@
 /*
  * GLSLConversion.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp
index 7745f85..f04cb48 100644
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp
+++ b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp
@@ -1,7 +1,7 @@
 /*
  * GLSLToSPIRVConverter.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,9 +20,9 @@
 #include "MVKCommonEnvironment.h"
 #include "SPIRVToMSLConverter.h"
 #include "MVKStrings.h"
-#include "GlslangToSpv.h"
+#include "../glslang/SPIRV/GlslangToSpv.h"
 #include "../glslang/SPIRV/disassemble.h"
-#include "doc.h"
+#include "../glslang/SPIRV/doc.h"
 #include <sstream>
 
 using namespace std;
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
index 78779fa..48f2ef1 100644
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
+++ b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
@@ -1,7 +1,7 @@
 /*
  * GLSLToSPIRVConverter.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h
index e9aacc8..39f741f 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h
@@ -1,7 +1,7 @@
 /*
  * FileSupport.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm
index e95414e..052dcf5 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm
@@ -1,7 +1,7 @@
 /*
  * FileSupport.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
index 890f649..5550e26 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
@@ -1,7 +1,7 @@
 /*
  * SPIRVConversion.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
index a566a80..a37c400 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
@@ -1,7 +1,7 @@
 /*
  * SPIRVConversion.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
index 1190d83..1be172e 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
@@ -1,7 +1,7 @@
 /*
  * SPIRVToMSLConverter.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,6 +45,7 @@
 	if (auxBufferIndex != other.auxBufferIndex) { return false; }
     if (!!shouldFlipVertexY != !!other.shouldFlipVertexY) { return false; }
     if (!!isRenderingPoints != !!other.isRenderingPoints) { return false; }
+	if (!!shouldSwizzleTextureSamples != !!other.shouldSwizzleTextureSamples) { return false; }
 	if (entryPointName != other.entryPointName) { return false; }
     return true;
 }
@@ -237,7 +238,8 @@
 		mslOpts.aux_buffer_index = context.options.auxBufferIndex;
 		mslOpts.enable_point_size_builtin = context.options.isRenderingPoints;
 		mslOpts.disable_rasterization = context.options.isRasterizationDisabled;
-		mslOpts.swizzle_texture_samples = true;
+		mslOpts.swizzle_texture_samples = context.options.shouldSwizzleTextureSamples;
+		mslOpts.pad_fragment_output_components = true;
 		pMSLCompiler->set_msl_options(mslOpts);
 
 		auto scOpts = pMSLCompiler->get_common_options();
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
index 07bcb2e..941018c 100644
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
+++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
@@ -1,7 +1,7 @@
 /*
  * SPIRVToMSLConverter.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
 #ifndef __SPIRVToMSLConverter_h_
 #define __SPIRVToMSLConverter_h_ 1
 
-#include "spirv.hpp"
+#include "../SPIRV-Cross/spirv.hpp"
 #include <string>
 #include <vector>
 #include <unordered_map>
@@ -40,6 +40,7 @@
 		uint32_t auxBufferIndex = 0;
 		bool shouldFlipVertexY = true;
 		bool isRenderingPoints = false;
+		bool shouldSwizzleTextureSamples = false;
 
 		bool isRasterizationDisabled = false;
 		bool needsAuxBuffer = false;
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.h b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.h
index aba3d40..eb7cb1b 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.h
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.h
@@ -1,7 +1,7 @@
 /*
  * DirectorySupport.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,10 +29,12 @@
 	 * or absolute path, and calls the processFile(std::string filePath) member function
 	 * on the fileProcessor for each file in the directory. If the isRecursive parameter
 	 * is true, the iteration will include all files in all sub-directories as well.
+	 *
 	 * The processFile(std::string filePath) member function on the fileProcessor should
-	 * return true to cause the processing of any further files to halt, and this function
-	 * to return, or should return false to allow further files to be iterated.
-	 * Returns false if the directory could not be found or iterated. Returns true otherwise.
+	 * return whether that file was successfully processed.
+	 *
+	 * Returns false if the directory could not be found or iterated, or if an error
+	 * occurs with the conversion of any file. Returns true otherwise.
 	 */
 	template <typename FileProcessor>
 	bool iterateDirectory(const std::string& dirPath,
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.mm b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.mm
index 6f521ff..a3aff3b 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.mm
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/DirectorySupport.mm
@@ -1,7 +1,7 @@
 /*
  * DirectorySupport.mm
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,9 +27,9 @@
 
 template <typename FileProcessor>
 bool mvk::iterateDirectory(const string& dirPath,
-							  FileProcessor& fileProcessor,
-							  bool isRecursive,
-							  string& errMsg) {
+						   FileProcessor& fileProcessor,
+						   bool isRecursive,
+						   string& errMsg) {
 	NSString* nsAbsDirPath = @(absolutePath(dirPath).data());
 	NSFileManager* fileMgr = NSFileManager.defaultManager;
 	BOOL isDir = false;
@@ -43,14 +43,15 @@
 		return false;
 	}
 
+	bool success = true;
 	NSDirectoryEnumerator* dirEnum = [fileMgr enumeratorAtPath: nsAbsDirPath];
 	NSString* filePath;
 	while ((filePath = dirEnum.nextObject)) {
 		if ( !isRecursive ) { [dirEnum skipDescendants]; }
 		NSString* absFilePath = [nsAbsDirPath stringByAppendingPathComponent: filePath];
-		if(fileProcessor.processFile(absFilePath.UTF8String)) { return true; }
+		if( !fileProcessor.processFile(absFilePath.UTF8String) ) { success = false; }
 	}
-	return true;
+	return success;
 }
 
 /** Concrete template implementation to allow MoltenVKShaderConverterTool to iterate the files in a directory. */
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
index f99f4f7..61287ab 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.cpp
@@ -1,7 +1,7 @@
 /*
  * MoltenVKShaderConverterTool.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -67,12 +67,12 @@
 
 	string pathExtn = pathExtension(absPath);
 	if (_shouldReadGLSL && isGLSLFileExtension(pathExtn)) {
-		convertGLSL(absPath, emptyPath, emptyPath, kMVKShaderStageAuto);
+		return convertGLSL(absPath, emptyPath, emptyPath, kMVKShaderStageAuto);
 	} else if (_shouldReadSPIRV && isSPIRVFileExtension(pathExtn)) {
-		convertSPIRV(absPath, emptyPath);
+		return convertSPIRV(absPath, emptyPath);
 	}
 
-	return false;
+	return true;
 }
 
 // Read GLSL code from a GLSL file, convert to SPIR-V, and optionally MSL,
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.h b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.h
index 13ba626..424a277 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.h
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/MoltenVKShaderConverterTool.h
@@ -1,7 +1,7 @@
 /*
  * MoltenVKShaderConverterTool.h
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -38,7 +38,9 @@
 		/**
 		 * Called automatically during the conversion of all the files in a directory. 
 		 * Processes the specified file (which can contain either GLSL or SPIR-V code.
-		 * Always returns false.
+		 *
+		 * Returns false if the file is of the right type to be converted, but failed
+		 * to be converted correctly. Returns true otherwise.
 		 */
 		bool processFile(std::string filePath);
 
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/main.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/main.cpp
index b79cc18..971b15f 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/main.cpp
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/main.cpp
@@ -1,7 +1,7 @@
 /*
  * main.cpp
  *
- * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
+ * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.