Merge pull request #1490 from billhollings/strip-promoted-static-vulkan-symbols

Optionally hide additional static Vulkan linkage symbols.
diff --git a/Common/MVKCommonEnvironment.h b/Common/MVKCommonEnvironment.h
index b82c2b2..1b22d33 100644
--- a/Common/MVKCommonEnvironment.h
+++ b/Common/MVKCommonEnvironment.h
@@ -100,6 +100,10 @@
 /** Directive to identify public symbols. */
 #define MVK_PUBLIC_SYMBOL        	__attribute__((visibility("default")))
 
+
+/** Directive to make a public alias of another symbol. */
+#define MVK_PUBLIC_ALIAS(ALIAS, TARGET)   asm(".globl _" #ALIAS "\n\t_" #ALIAS " = _" #TARGET)
+
 /**
  * Directives to hide public symbols from the Vulkan API, to avoid library linking
  * conflicts when bound to a Vulkan Loader that also exports identical symbols.
@@ -109,13 +113,12 @@
 #endif
 #if MVK_HIDE_VULKAN_SYMBOLS
 #	define MVK_PUBLIC_VULKAN_SYMBOL
+#	define MVK_PUBLIC_VULKAN_ALIAS(ALIAS, TARGET)
 #else
 #	define MVK_PUBLIC_VULKAN_SYMBOL		MVK_PUBLIC_SYMBOL
+#	define MVK_PUBLIC_VULKAN_ALIAS(ALIAS, TARGET)	MVK_PUBLIC_ALIAS(ALIAS, TARGET)
 #endif
 
-/** Directive to make a public alias of another symbol. */
-#define MVK_PUBLIC_ALIAS(ALIAS, TARGET)   asm(".globl _" #ALIAS "\n\t_" #ALIAS " = _" #TARGET)
-
 
 #ifdef __cplusplus
 }
diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
index eaa6990..999555e 100644
--- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
+++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
@@ -55,7 +55,7 @@
 #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            32
+#define VK_MVK_MOLTENVK_SPEC_VERSION            33
 #define VK_MVK_MOLTENVK_EXTENSION_NAME          "VK_MVK_moltenvk"
 
 /** Identifies the level of logging MoltenVK should be limited to outputting. */
@@ -1113,11 +1113,8 @@
  * In that case, this function will set *pMetalFeaturesSize to the size that MoltenVK expects
  * MVKPhysicalDeviceMetalFeatures to be.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkPhysicalDevice object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceMetalFeaturesMVK(
 	VkPhysicalDevice                            physicalDevice,
@@ -1146,11 +1143,8 @@
  * pPerf to NULL. In that case, this function will set *pPerfSize to the size that MoltenVK
  * expects MVKPerformanceStatistics to be.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkDevice object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceStatisticsMVK(
 	VkDevice                                    device,
@@ -1177,11 +1171,8 @@
  * source code or MSL compiled code. Workgroup size is determined automatically
  * if you're using SPIR-V.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkShaderModule object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR void VKAPI_CALL vkSetWorkgroupSizeMVK(
     VkShaderModule                              shaderModule,
@@ -1194,11 +1185,8 @@
 /**
  * Returns, in the pMTLDevice pointer, the MTLDevice used by the VkPhysicalDevice.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkPhysicalDevice object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLDeviceMVK(
     VkPhysicalDevice                           physicalDevice,
@@ -1214,11 +1202,8 @@
  *
  * Returns VK_SUCCESS.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkImage object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkSetMTLTextureMVK(
     VkImage                                     image,
@@ -1227,11 +1212,8 @@
 /**
  * Returns, in the pMTLTexture pointer, the MTLTexture currently underlaying the VkImage.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkImage object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLTextureMVK(
     VkImage                                     image,
@@ -1240,11 +1222,8 @@
 /**
 * Returns, in the pMTLBuffer pointer, the MTLBuffer currently underlaying the VkBuffer.
 *
-* This function is not supported by the Vulkan SDK Loader and Layers framework.
-* The VkBuffer object you provide here must have been retrieved directly from
-* MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
-* objects are often changed by layers, and passing them from one layer to another,
-* or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
 */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLBufferMVK(
     VkBuffer                                    buffer,
@@ -1253,11 +1232,8 @@
 /**
 * Returns, in the pMTLCommandQueue pointer, the MTLCommandQueue currently underlaying the VkQueue.
 *
-* This function is not supported by the Vulkan SDK Loader and Layers framework.
-* The VkQueue object you provide here must have been retrieved directly from
-* MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
-* objects are often changed by layers, and passing them from one layer to another,
-* or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
 */
 VKAPI_ATTR void VKAPI_CALL vkGetMTLCommandQueueMVK(
     VkQueue                                     queue,
@@ -1289,11 +1265,8 @@
  *   - VK_ERROR_FEATURE_NOT_PRESENT if IOSurfaces are not supported on the platform.
  *   - VK_ERROR_INITIALIZATION_FAILED if ioSurface is specified and is not compatible with this VkImage.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkImage object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR VkResult VKAPI_CALL vkUseIOSurfaceMVK(
     VkImage                                     image,
@@ -1304,11 +1277,8 @@
  * as set by the useIOSurfaceMVK() function, or returns null if the VkImage is not using
  * an IOSurface, or if the platform does not support IOSurfaces.
  *
- * This function is not supported by the Vulkan SDK Loader and Layers framework.
- * The VkImage object you provide here must have been retrieved directly from
- * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan
- * objects are often changed by layers, and passing them from one layer to another,
- * or from a layer directly to MoltenVK, will result in undefined behaviour.
+ * This function is not supported by the Vulkan SDK Loader and Layers framework
+ * and is unavailable when using the Vulkan SDK Loader and Layers framework.
  */
 VKAPI_ATTR void VKAPI_CALL vkGetIOSurfaceMVK(
     VkImage                                     image,
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
index 5654cb1..c1882e2 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
@@ -386,7 +386,10 @@
 	}
 }
 
-#define ADD_ENTRY_POINT(func, api, ext1, ext2, isDev)	_entryPoints[""#func] = { (PFN_vkVoidFunction)&func, api, ext1,  ext2,  isDev }
+#define ADD_ENTRY_POINT_MAP(name, func, api, ext1, ext2, isDev)	\
+	_entryPoints[""#name] = { (PFN_vkVoidFunction)&func, api, ext1,  ext2,  isDev }
+
+#define ADD_ENTRY_POINT(func, api, ext1, ext2, isDev)	ADD_ENTRY_POINT_MAP(func, func, api, ext1, ext2, isDev)
 
 #define ADD_INST_ENTRY_POINT(func)						ADD_ENTRY_POINT(func, VK_API_VERSION_1_0, nullptr, nullptr, false)
 #define ADD_DVC_ENTRY_POINT(func)						ADD_ENTRY_POINT(func, VK_API_VERSION_1_0, nullptr, nullptr, true)
@@ -394,11 +397,21 @@
 #define ADD_INST_1_1_ENTRY_POINT(func)					ADD_ENTRY_POINT(func, VK_API_VERSION_1_1, nullptr, nullptr, false)
 #define ADD_DVC_1_1_ENTRY_POINT(func)					ADD_ENTRY_POINT(func, VK_API_VERSION_1_1, nullptr, nullptr, true)
 
-#define ADD_INST_EXT_ENTRY_POINT(func, EXT)			ADD_ENTRY_POINT(func, 0, VK_ ##EXT ##_EXTENSION_NAME, nullptr, false)
-#define ADD_DVC_EXT_ENTRY_POINT(func, EXT)			ADD_ENTRY_POINT(func, 0, VK_ ##EXT ##_EXTENSION_NAME, nullptr, true)
+// Adds both the 1.1 function and the promoted extension function.
+#define ADD_INST_1_1_PROMOTED_ENTRY_POINT(func, EXT)	\
+	ADD_INST_1_1_ENTRY_POINT(func);	\
+	ADD_ENTRY_POINT_MAP(func##KHR, func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, false)
 
-#define ADD_INST_EXT2_ENTRY_POINT(func, EXT1, EXT2)	ADD_ENTRY_POINT(func, 0, VK_ ##EXT1 ##_EXTENSION_NAME, VK_ ##EXT2 ##_EXTENSION_NAME, false)
-#define ADD_DVC_EXT2_ENTRY_POINT(func, EXT1, EXT2)	ADD_ENTRY_POINT(func, 0, VK_ ##EXT1 ##_EXTENSION_NAME, VK_ ##EXT2 ##_EXTENSION_NAME, true)
+// Adds both the 1.1 function and the promoted extension function.
+#define ADD_DVC_1_1_PROMOTED_ENTRY_POINT(func, EXT)	\
+	ADD_DVC_1_1_ENTRY_POINT(func);	\
+	ADD_ENTRY_POINT_MAP(func##KHR, func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, true)
+
+#define ADD_INST_EXT_ENTRY_POINT(func, EXT)				ADD_ENTRY_POINT(func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, false)
+#define ADD_DVC_EXT_ENTRY_POINT(func, EXT)				ADD_ENTRY_POINT(func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, true)
+
+#define ADD_INST_EXT2_ENTRY_POINT(func, EXT1, EXT2)		ADD_ENTRY_POINT(func, 0, VK_##EXT1##_EXTENSION_NAME, VK_##EXT2##_EXTENSION_NAME, false)
+#define ADD_DVC_EXT2_ENTRY_POINT(func, EXT1, EXT2)		ADD_ENTRY_POINT(func, 0, VK_##EXT1##_EXTENSION_NAME, VK_##EXT2##_EXTENSION_NAME, true)
 
 // Initializes the function pointer map.
 void MVKInstance::initProcAddrs() {
@@ -418,17 +431,17 @@
 	ADD_INST_ENTRY_POINT(vkEnumerateDeviceLayerProperties);
 	ADD_INST_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties);
 
-	ADD_INST_1_1_ENTRY_POINT(vkEnumeratePhysicalDeviceGroups);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceFeatures2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalFenceProperties);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferProperties);
-	ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphoreProperties);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkEnumeratePhysicalDeviceGroups, KHR_DEVICE_GROUP_CREATION);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceFeatures2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalFenceProperties, KHR_EXTERNAL_FENCE_CAPABILITIES);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferProperties, KHR_EXTERNAL_MEMORY_CAPABILITIES);
+	ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphoreProperties, KHR_EXTERNAL_SEMAPHORE_CAPABILITIES);
 
 	// Device functions:
 	ADD_DVC_ENTRY_POINT(vkGetDeviceProcAddr);
@@ -554,34 +567,23 @@
 	ADD_DVC_ENTRY_POINT(vkCmdExecuteCommands);
 
 	ADD_DVC_1_1_ENTRY_POINT(vkGetDeviceQueue2);
-	ADD_DVC_1_1_ENTRY_POINT(vkBindBufferMemory2);
-	ADD_DVC_1_1_ENTRY_POINT(vkBindImageMemory2);
-	ADD_DVC_1_1_ENTRY_POINT(vkGetBufferMemoryRequirements2);
-	ADD_DVC_1_1_ENTRY_POINT(vkGetImageMemoryRequirements2);
-	ADD_DVC_1_1_ENTRY_POINT(vkGetImageSparseMemoryRequirements2);
-	ADD_DVC_1_1_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeatures);
-	ADD_DVC_1_1_ENTRY_POINT(vkCreateDescriptorUpdateTemplate);
-	ADD_DVC_1_1_ENTRY_POINT(vkDestroyDescriptorUpdateTemplate);
-	ADD_DVC_1_1_ENTRY_POINT(vkUpdateDescriptorSetWithTemplate);
-	ADD_DVC_1_1_ENTRY_POINT(vkGetDescriptorSetLayoutSupport);
-	ADD_DVC_1_1_ENTRY_POINT(vkCreateSamplerYcbcrConversion);
-	ADD_DVC_1_1_ENTRY_POINT(vkDestroySamplerYcbcrConversion);
-	ADD_DVC_1_1_ENTRY_POINT(vkTrimCommandPool);
-	ADD_DVC_1_1_ENTRY_POINT(vkCmdSetDeviceMask);
-	ADD_DVC_1_1_ENTRY_POINT(vkCmdDispatchBase);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkBindBufferMemory2, KHR_BIND_MEMORY_2);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkBindImageMemory2, KHR_BIND_MEMORY_2);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetBufferMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetImageMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetImageSparseMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeatures, KHR_DEVICE_GROUP);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCreateDescriptorUpdateTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkDestroyDescriptorUpdateTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkUpdateDescriptorSetWithTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetDescriptorSetLayoutSupport, KHR_MAINTENANCE3);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCreateSamplerYcbcrConversion, KHR_SAMPLER_YCBCR_CONVERSION);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkDestroySamplerYcbcrConversion, KHR_SAMPLER_YCBCR_CONVERSION);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkTrimCommandPool, KHR_MAINTENANCE1);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCmdSetDeviceMask, KHR_DEVICE_GROUP);
+	ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCmdDispatchBase, KHR_DEVICE_GROUP);
 
 	// Instance extension functions:
-	ADD_INST_EXT_ENTRY_POINT(vkEnumeratePhysicalDeviceGroupsKHR, KHR_DEVICE_GROUP_CREATION);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalFencePropertiesKHR, KHR_EXTERNAL_FENCE_CAPABILITIES);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferPropertiesKHR, KHR_EXTERNAL_MEMORY_CAPABILITIES);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, KHR_EXTERNAL_SEMAPHORE_CAPABILITIES);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFeatures2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
-	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2);
 	ADD_INST_EXT_ENTRY_POINT(vkDestroySurfaceKHR, KHR_SURFACE);
 	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSurfaceSupportKHR, KHR_SURFACE);
 	ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, KHR_SURFACE);
@@ -626,27 +628,12 @@
     ADD_INST_EXT_ENTRY_POINT(vkGetMTLCommandQueueMVK, MVK_MOLTENVK);
 
 	// Device extension functions:
-	ADD_DVC_EXT_ENTRY_POINT(vkBindBufferMemory2KHR, KHR_BIND_MEMORY_2);
-	ADD_DVC_EXT_ENTRY_POINT(vkBindImageMemory2KHR, KHR_BIND_MEMORY_2);
 	ADD_DVC_EXT_ENTRY_POINT(vkCreateRenderPass2KHR, KHR_CREATE_RENDERPASS_2);
 	ADD_DVC_EXT_ENTRY_POINT(vkCmdBeginRenderPass2KHR, KHR_CREATE_RENDERPASS_2);
 	ADD_DVC_EXT_ENTRY_POINT(vkCmdNextSubpass2KHR, KHR_CREATE_RENDERPASS_2);
 	ADD_DVC_EXT_ENTRY_POINT(vkCmdEndRenderPass2KHR, KHR_CREATE_RENDERPASS_2);
-	ADD_DVC_EXT_ENTRY_POINT(vkCreateDescriptorUpdateTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
-	ADD_DVC_EXT_ENTRY_POINT(vkDestroyDescriptorUpdateTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
-	ADD_DVC_EXT_ENTRY_POINT(vkUpdateDescriptorSetWithTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
-	ADD_DVC_EXT_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeaturesKHR, KHR_DEVICE_GROUP);
-	ADD_DVC_EXT_ENTRY_POINT(vkCmdSetDeviceMaskKHR, KHR_DEVICE_GROUP);
-	ADD_DVC_EXT_ENTRY_POINT(vkCmdDispatchBaseKHR, KHR_DEVICE_GROUP);
-	ADD_DVC_EXT_ENTRY_POINT(vkGetBufferMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2);
-	ADD_DVC_EXT_ENTRY_POINT(vkGetImageMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2);
-	ADD_DVC_EXT_ENTRY_POINT(vkGetImageSparseMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2);
-	ADD_DVC_EXT_ENTRY_POINT(vkTrimCommandPoolKHR, KHR_MAINTENANCE1);
-	ADD_DVC_EXT_ENTRY_POINT(vkGetDescriptorSetLayoutSupportKHR, KHR_MAINTENANCE3);
 	ADD_DVC_EXT_ENTRY_POINT(vkCmdPushDescriptorSetKHR, KHR_PUSH_DESCRIPTOR);
 	ADD_DVC_EXT2_ENTRY_POINT(vkCmdPushDescriptorSetWithTemplateKHR, KHR_PUSH_DESCRIPTOR, KHR_DESCRIPTOR_UPDATE_TEMPLATE);
-	ADD_DVC_EXT_ENTRY_POINT(vkCreateSamplerYcbcrConversionKHR, KHR_SAMPLER_YCBCR_CONVERSION);
-	ADD_DVC_EXT_ENTRY_POINT(vkDestroySamplerYcbcrConversionKHR, KHR_SAMPLER_YCBCR_CONVERSION);
 	ADD_DVC_EXT_ENTRY_POINT(vkCreateSwapchainKHR, KHR_SWAPCHAIN);
 	ADD_DVC_EXT_ENTRY_POINT(vkDestroySwapchainKHR, KHR_SWAPCHAIN);
 	ADD_DVC_EXT_ENTRY_POINT(vkGetSwapchainImagesKHR, KHR_SWAPCHAIN);
diff --git a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
index 6afdd21..001acb1 100644
--- a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
@@ -69,7 +69,7 @@
 	return rslt;
 }
 
-MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceMetalFeaturesMVK(
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPhysicalDeviceMetalFeaturesMVK(
 	VkPhysicalDevice                            physicalDevice,
 	MVKPhysicalDeviceMetalFeatures*             pMetalFeatures,
 	size_t*                                     pMetalFeaturesSize) {
@@ -78,7 +78,7 @@
 	return mvkCopy(pMetalFeatures, mvkPD->getMetalFeatures(), pMetalFeaturesSize);
 }
 
-MVK_PUBLIC_SYMBOL VkResult vkGetPerformanceStatisticsMVK(
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPerformanceStatisticsMVK(
 	VkDevice                                    device,
 	MVKPerformanceStatistics*            		pPerf,
 	size_t*                                     pPerfSize) {
@@ -105,7 +105,7 @@
 	pVulkanVersionStringBuffer[len] = 0;    // terminator
 }
 
-MVK_PUBLIC_SYMBOL void vkGetMTLDeviceMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLDeviceMVK(
     VkPhysicalDevice                           physicalDevice,
     id<MTLDevice>*                             pMTLDevice) {
 
@@ -113,7 +113,7 @@
     *pMTLDevice = mvkPD->getMTLDevice();
 }
 
-MVK_PUBLIC_SYMBOL VkResult vkSetMTLTextureMVK(
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkSetMTLTextureMVK(
     VkImage                                     image,
     id<MTLTexture>                              mtlTexture) {
 
@@ -121,7 +121,7 @@
     return mvkImg->setMTLTexture(0, mtlTexture);
 }
 
-MVK_PUBLIC_SYMBOL void vkGetMTLTextureMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLTextureMVK(
     VkImage                                     image,
     id<MTLTexture>*                             pMTLTexture) {
 
@@ -129,7 +129,7 @@
     *pMTLTexture = mvkImg->getMTLTexture(0);
 }
 
-MVK_PUBLIC_SYMBOL void vkGetMTLBufferMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLBufferMVK(
     VkBuffer                                    buffer,
     id<MTLBuffer>*                              pMTLBuffer) {
 
@@ -137,7 +137,7 @@
     *pMTLBuffer = mvkBuffer->getMTLBuffer();
 }
 
-MVK_PUBLIC_SYMBOL void vkGetMTLCommandQueueMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLCommandQueueMVK(
     VkQueue                                     queue,
     id<MTLCommandQueue>*                        pMTLCommandQueue) {
 
@@ -145,7 +145,7 @@
     *pMTLCommandQueue = mvkQueue->getMTLCommandQueue();
 }
 
-MVK_PUBLIC_SYMBOL VkResult vkUseIOSurfaceMVK(
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkUseIOSurfaceMVK(
     VkImage                                     image,
     IOSurfaceRef                                ioSurface) {
 
@@ -153,7 +153,7 @@
     return mvkImg->useIOSurface(ioSurface);
 }
 
-MVK_PUBLIC_SYMBOL void vkGetIOSurfaceMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkGetIOSurfaceMVK(
     VkImage                                     image,
     IOSurfaceRef*                               pIOSurface) {
 
@@ -161,7 +161,7 @@
     *pIOSurface = mvkImg->getIOSurface();
 }
 
-MVK_PUBLIC_SYMBOL void vkSetWorkgroupSizeMVK(
+MVK_PUBLIC_VULKAN_SYMBOL void vkSetWorkgroupSizeMVK(
     VkShaderModule                              shaderModule,
     uint32_t                                    x,
     uint32_t                                    y,
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index 56b5a1c..5498e9d 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -162,7 +162,7 @@
 	}
 
 // Define an extension call as an alias of a core call
-#define MVK_PUBLIC_CORE_ALIAS(vkf)	MVK_PUBLIC_ALIAS(vkf##KHR, vkf)
+#define MVK_PUBLIC_VULKAN_CORE_ALIAS(vkf)	MVK_PUBLIC_VULKAN_ALIAS(vkf##KHR, vkf)
 
 
 #pragma mark -
@@ -2321,8 +2321,8 @@
 #pragma mark -
 #pragma mark VK_KHR_bind_memory2 extension
 
-MVK_PUBLIC_CORE_ALIAS(vkBindBufferMemory2);
-MVK_PUBLIC_CORE_ALIAS(vkBindImageMemory2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindBufferMemory2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindImageMemory2);
 
 
 #pragma mark -
@@ -2377,73 +2377,73 @@
 #pragma mark -
 #pragma mark VK_KHR_descriptor_update_template extension
 
-MVK_PUBLIC_CORE_ALIAS(vkCreateDescriptorUpdateTemplate);
-MVK_PUBLIC_CORE_ALIAS(vkDestroyDescriptorUpdateTemplate);
-MVK_PUBLIC_CORE_ALIAS(vkUpdateDescriptorSetWithTemplate);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCreateDescriptorUpdateTemplate);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkDestroyDescriptorUpdateTemplate);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkUpdateDescriptorSetWithTemplate);
 
 
 #pragma mark -
 #pragma mark VK_KHR_device_group extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetDeviceGroupPeerMemoryFeatures);
-MVK_PUBLIC_CORE_ALIAS(vkCmdSetDeviceMask);
-MVK_PUBLIC_CORE_ALIAS(vkCmdDispatchBase);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetDeviceGroupPeerMemoryFeatures);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdSetDeviceMask);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdDispatchBase);
 
 
 #pragma mark -
 #pragma mark VK_KHR_device_group_creation extension
 
-MVK_PUBLIC_CORE_ALIAS(vkEnumeratePhysicalDeviceGroups);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkEnumeratePhysicalDeviceGroups);
 
 
 #pragma mark -
 #pragma mark VK_KHR_external_fence_capabilities extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalFenceProperties);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalFenceProperties);
 
 
 #pragma mark -
 #pragma mark VK_KHR_external_memory_capabilities extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalBufferProperties);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalBufferProperties);
 
 
 #pragma mark -
 #pragma mark VK_KHR_external_semaphore_capabilities extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalSemaphoreProperties);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalSemaphoreProperties);
 
 
 #pragma mark -
 #pragma mark VK_KHR_get_memory_requirements2 extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetBufferMemoryRequirements2);
-MVK_PUBLIC_CORE_ALIAS(vkGetImageMemoryRequirements2);
-MVK_PUBLIC_CORE_ALIAS(vkGetImageSparseMemoryRequirements2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetBufferMemoryRequirements2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetImageMemoryRequirements2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetImageSparseMemoryRequirements2);
 
 
 #pragma mark -
 #pragma mark VK_KHR_get_physical_device_properties2 extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceFeatures2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceProperties2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceFormatProperties2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceImageFormatProperties2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceQueueFamilyProperties2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceMemoryProperties2);
-MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceSparseImageFormatProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceFeatures2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceFormatProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceImageFormatProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceQueueFamilyProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceMemoryProperties2);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceSparseImageFormatProperties2);
 
 
 #pragma mark -
 #pragma mark VK_KHR_maintenance1 extension
 
-MVK_PUBLIC_CORE_ALIAS(vkTrimCommandPool);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkTrimCommandPool);
 
 
 #pragma mark -
 #pragma mark VK_KHR_maintenance3 extension
 
-MVK_PUBLIC_CORE_ALIAS(vkGetDescriptorSetLayoutSupport);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetDescriptorSetLayoutSupport);
 
 
 #pragma mark -
@@ -2478,8 +2478,8 @@
 #pragma mark -
 #pragma mark VK_KHR_sampler_ycbcr_conversion extension
 
-MVK_PUBLIC_CORE_ALIAS(vkCreateSamplerYcbcrConversion);
-MVK_PUBLIC_CORE_ALIAS(vkDestroySamplerYcbcrConversion);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCreateSamplerYcbcrConversion);
+MVK_PUBLIC_VULKAN_CORE_ALIAS(vkDestroySamplerYcbcrConversion);
 
 
 #pragma mark -