Fix entry function pointer queries.

vkGetInstanceProcAddr must return NULL when the instance parameter is
NULL, except for a few global functions.

vkGetDeviceProcAddr must return NULL for any non-device-level functions.

Fixes dEQP-VK.api.version_check.entry_points

Bug b/116336664

Change-Id: I446edb0b8c4b94938e0ab77913c8ad391d490f4f
Reviewed-on: https://swiftshader-review.googlesource.com/c/22688
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index b7a51cb..2d4a302 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -19,218 +19,263 @@
 
 namespace vk
 {
-#define MAKE_VULKAN_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
-	static const std::unordered_map <std::string, PFN_vkVoidFunction> func_ptrs =
-	{
-		MAKE_VULKAN_ENTRY(vkCreateInstance),
-		MAKE_VULKAN_ENTRY(vkDestroyInstance),
-		MAKE_VULKAN_ENTRY(vkEnumeratePhysicalDevices),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFeatures),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFormatProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceMemoryProperties),
-		MAKE_VULKAN_ENTRY(vkGetInstanceProcAddr),
-		MAKE_VULKAN_ENTRY(vkGetDeviceProcAddr),
-		MAKE_VULKAN_ENTRY(vkCreateDevice),
-		MAKE_VULKAN_ENTRY(vkDestroyDevice),
-		MAKE_VULKAN_ENTRY(vkEnumerateInstanceExtensionProperties),
-		MAKE_VULKAN_ENTRY(vkEnumerateDeviceExtensionProperties),
-		MAKE_VULKAN_ENTRY(vkEnumerateInstanceLayerProperties),
-		MAKE_VULKAN_ENTRY(vkEnumerateDeviceLayerProperties),
-		MAKE_VULKAN_ENTRY(vkGetDeviceQueue),
-		MAKE_VULKAN_ENTRY(vkQueueSubmit),
-		MAKE_VULKAN_ENTRY(vkQueueWaitIdle),
-		MAKE_VULKAN_ENTRY(vkDeviceWaitIdle),
-		MAKE_VULKAN_ENTRY(vkAllocateMemory),
-		MAKE_VULKAN_ENTRY(vkFreeMemory),
-		MAKE_VULKAN_ENTRY(vkMapMemory),
-		MAKE_VULKAN_ENTRY(vkUnmapMemory),
-		MAKE_VULKAN_ENTRY(vkFlushMappedMemoryRanges),
-		MAKE_VULKAN_ENTRY(vkInvalidateMappedMemoryRanges),
-		MAKE_VULKAN_ENTRY(vkGetDeviceMemoryCommitment),
-		MAKE_VULKAN_ENTRY(vkBindBufferMemory),
-		MAKE_VULKAN_ENTRY(vkBindImageMemory),
-		MAKE_VULKAN_ENTRY(vkGetBufferMemoryRequirements),
-		MAKE_VULKAN_ENTRY(vkGetImageMemoryRequirements),
-		MAKE_VULKAN_ENTRY(vkGetImageSparseMemoryRequirements),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
-		MAKE_VULKAN_ENTRY(vkQueueBindSparse),
-		MAKE_VULKAN_ENTRY(vkCreateFence),
-		MAKE_VULKAN_ENTRY(vkDestroyFence),
-		MAKE_VULKAN_ENTRY(vkResetFences),
-		MAKE_VULKAN_ENTRY(vkGetFenceStatus),
-		MAKE_VULKAN_ENTRY(vkWaitForFences),
-		MAKE_VULKAN_ENTRY(vkCreateSemaphore),
-		MAKE_VULKAN_ENTRY(vkDestroySemaphore),
-		MAKE_VULKAN_ENTRY(vkCreateEvent),
-		MAKE_VULKAN_ENTRY(vkDestroyEvent),
-		MAKE_VULKAN_ENTRY(vkGetEventStatus),
-		MAKE_VULKAN_ENTRY(vkSetEvent),
-		MAKE_VULKAN_ENTRY(vkResetEvent),
-		MAKE_VULKAN_ENTRY(vkCreateQueryPool),
-		MAKE_VULKAN_ENTRY(vkDestroyQueryPool),
-		MAKE_VULKAN_ENTRY(vkGetQueryPoolResults),
-		MAKE_VULKAN_ENTRY(vkCreateBuffer),
-		MAKE_VULKAN_ENTRY(vkDestroyBuffer),
-		MAKE_VULKAN_ENTRY(vkCreateBufferView),
-		MAKE_VULKAN_ENTRY(vkDestroyBufferView),
-		MAKE_VULKAN_ENTRY(vkCreateImage),
-		MAKE_VULKAN_ENTRY(vkDestroyImage),
-		MAKE_VULKAN_ENTRY(vkGetImageSubresourceLayout),
-		MAKE_VULKAN_ENTRY(vkCreateImageView),
-		MAKE_VULKAN_ENTRY(vkDestroyImageView),
-		MAKE_VULKAN_ENTRY(vkCreateShaderModule),
-		MAKE_VULKAN_ENTRY(vkDestroyShaderModule),
-		MAKE_VULKAN_ENTRY(vkCreatePipelineCache),
-		MAKE_VULKAN_ENTRY(vkDestroyPipelineCache),
-		MAKE_VULKAN_ENTRY(vkGetPipelineCacheData),
-		MAKE_VULKAN_ENTRY(vkMergePipelineCaches),
-		MAKE_VULKAN_ENTRY(vkCreateGraphicsPipelines),
-		MAKE_VULKAN_ENTRY(vkCreateComputePipelines),
-		MAKE_VULKAN_ENTRY(vkDestroyPipeline),
-		MAKE_VULKAN_ENTRY(vkCreatePipelineLayout),
-		MAKE_VULKAN_ENTRY(vkDestroyPipelineLayout),
-		MAKE_VULKAN_ENTRY(vkCreateSampler),
-		MAKE_VULKAN_ENTRY(vkDestroySampler),
-		MAKE_VULKAN_ENTRY(vkCreateDescriptorSetLayout),
-		MAKE_VULKAN_ENTRY(vkDestroyDescriptorSetLayout),
-		MAKE_VULKAN_ENTRY(vkCreateDescriptorPool),
-		MAKE_VULKAN_ENTRY(vkDestroyDescriptorPool),
-		MAKE_VULKAN_ENTRY(vkResetDescriptorPool),
-		MAKE_VULKAN_ENTRY(vkAllocateDescriptorSets),
-		MAKE_VULKAN_ENTRY(vkFreeDescriptorSets),
-		MAKE_VULKAN_ENTRY(vkUpdateDescriptorSets),
-		MAKE_VULKAN_ENTRY(vkCreateFramebuffer),
-		MAKE_VULKAN_ENTRY(vkDestroyFramebuffer),
-		MAKE_VULKAN_ENTRY(vkCreateRenderPass),
-		MAKE_VULKAN_ENTRY(vkDestroyRenderPass),
-		MAKE_VULKAN_ENTRY(vkGetRenderAreaGranularity),
-		MAKE_VULKAN_ENTRY(vkCreateCommandPool),
-		MAKE_VULKAN_ENTRY(vkDestroyCommandPool),
-		MAKE_VULKAN_ENTRY(vkResetCommandPool),
-		MAKE_VULKAN_ENTRY(vkAllocateCommandBuffers),
-		MAKE_VULKAN_ENTRY(vkFreeCommandBuffers),
-		MAKE_VULKAN_ENTRY(vkBeginCommandBuffer),
-		MAKE_VULKAN_ENTRY(vkEndCommandBuffer),
-		MAKE_VULKAN_ENTRY(vkResetCommandBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdBindPipeline),
-		MAKE_VULKAN_ENTRY(vkCmdSetViewport),
-		MAKE_VULKAN_ENTRY(vkCmdSetScissor),
-		MAKE_VULKAN_ENTRY(vkCmdSetLineWidth),
-		MAKE_VULKAN_ENTRY(vkCmdSetDepthBias),
-		MAKE_VULKAN_ENTRY(vkCmdSetBlendConstants),
-		MAKE_VULKAN_ENTRY(vkCmdSetDepthBounds),
-		MAKE_VULKAN_ENTRY(vkCmdSetStencilCompareMask),
-		MAKE_VULKAN_ENTRY(vkCmdSetStencilWriteMask),
-		MAKE_VULKAN_ENTRY(vkCmdSetStencilReference),
-		MAKE_VULKAN_ENTRY(vkCmdBindDescriptorSets),
-		MAKE_VULKAN_ENTRY(vkCmdBindIndexBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdBindVertexBuffers),
-		MAKE_VULKAN_ENTRY(vkCmdDraw),
-		MAKE_VULKAN_ENTRY(vkCmdDrawIndexed),
-		MAKE_VULKAN_ENTRY(vkCmdDrawIndirect),
-		MAKE_VULKAN_ENTRY(vkCmdDrawIndexedIndirect),
-		MAKE_VULKAN_ENTRY(vkCmdDispatch),
-		MAKE_VULKAN_ENTRY(vkCmdDispatchIndirect),
-		MAKE_VULKAN_ENTRY(vkCmdCopyBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdCopyImage),
-		MAKE_VULKAN_ENTRY(vkCmdBlitImage),
-		MAKE_VULKAN_ENTRY(vkCmdCopyBufferToImage),
-		MAKE_VULKAN_ENTRY(vkCmdCopyImageToBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdUpdateBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdFillBuffer),
-		MAKE_VULKAN_ENTRY(vkCmdClearColorImage),
-		MAKE_VULKAN_ENTRY(vkCmdClearDepthStencilImage),
-		MAKE_VULKAN_ENTRY(vkCmdClearAttachments),
-		MAKE_VULKAN_ENTRY(vkCmdResolveImage),
-		MAKE_VULKAN_ENTRY(vkCmdSetEvent),
-		MAKE_VULKAN_ENTRY(vkCmdResetEvent),
-		MAKE_VULKAN_ENTRY(vkCmdWaitEvents),
-		MAKE_VULKAN_ENTRY(vkCmdPipelineBarrier),
-		MAKE_VULKAN_ENTRY(vkCmdBeginQuery),
-		MAKE_VULKAN_ENTRY(vkCmdEndQuery),
-		MAKE_VULKAN_ENTRY(vkCmdResetQueryPool),
-		MAKE_VULKAN_ENTRY(vkCmdWriteTimestamp),
-		MAKE_VULKAN_ENTRY(vkCmdCopyQueryPoolResults),
-		MAKE_VULKAN_ENTRY(vkCmdPushConstants),
-		MAKE_VULKAN_ENTRY(vkCmdBeginRenderPass),
-		MAKE_VULKAN_ENTRY(vkCmdNextSubpass),
-		MAKE_VULKAN_ENTRY(vkCmdEndRenderPass),
-		MAKE_VULKAN_ENTRY(vkCmdExecuteCommands),
-		MAKE_VULKAN_ENTRY(vkEnumerateInstanceVersion),
-		MAKE_VULKAN_ENTRY(vkBindBufferMemory2),
-		MAKE_VULKAN_ENTRY(vkBindImageMemory2),
-		MAKE_VULKAN_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
-		MAKE_VULKAN_ENTRY(vkCmdSetDeviceMask),
-		MAKE_VULKAN_ENTRY(vkCmdDispatchBase),
-		MAKE_VULKAN_ENTRY(vkEnumeratePhysicalDeviceGroups),
-		MAKE_VULKAN_ENTRY(vkGetImageMemoryRequirements2),
-		MAKE_VULKAN_ENTRY(vkGetBufferMemoryRequirements2),
-		MAKE_VULKAN_ENTRY(vkGetImageSparseMemoryRequirements2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFeatures2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceProperties2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFormatProperties2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
-		MAKE_VULKAN_ENTRY(vkTrimCommandPool),
-		MAKE_VULKAN_ENTRY(vkGetDeviceQueue2),
-		MAKE_VULKAN_ENTRY(vkCreateSamplerYcbcrConversion),
-		MAKE_VULKAN_ENTRY(vkDestroySamplerYcbcrConversion),
-		MAKE_VULKAN_ENTRY(vkCreateDescriptorUpdateTemplate),
-		MAKE_VULKAN_ENTRY(vkDestroyDescriptorUpdateTemplate),
-		MAKE_VULKAN_ENTRY(vkUpdateDescriptorSetWithTemplate),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
-		MAKE_VULKAN_ENTRY(vkGetDescriptorSetLayoutSupport),
-		// VK_KHR_bind_memory2
-		MAKE_VULKAN_ENTRY(vkBindBufferMemory2KHR),
-		MAKE_VULKAN_ENTRY(vkBindImageMemory2KHR),
-		// VK_KHR_descriptor_update_template
-		MAKE_VULKAN_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
-		MAKE_VULKAN_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
-		MAKE_VULKAN_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
-		// VK_KHR_device_group
-		MAKE_VULKAN_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
-		MAKE_VULKAN_ENTRY(vkCmdSetDeviceMaskKHR),
-		MAKE_VULKAN_ENTRY(vkCmdDispatchBaseKHR),
-		// VK_KHR_device_group_creation
-		MAKE_VULKAN_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
-		// VK_KHR_external_fence_capabilities
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
-		// VK_KHR_external_memory_capabilities
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
-		// VK_KHR_external_semaphore_capabilities
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
-		// VK_KHR_get_memory_requirements2
-		MAKE_VULKAN_ENTRY(vkGetImageMemoryRequirements2KHR),
-		MAKE_VULKAN_ENTRY(vkGetBufferMemoryRequirements2KHR),
-		MAKE_VULKAN_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
-		// VK_KHR_get_physical_device_properties2
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceProperties2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
-		MAKE_VULKAN_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
-		// VK_KHR_maintenance1
-		MAKE_VULKAN_ENTRY(vkTrimCommandPoolKHR),
-		// VK_KHR_maintenance3
-		MAKE_VULKAN_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
-		// VK_KHR_sampler_ycbcr_conversion
-		MAKE_VULKAN_ENTRY(vkCreateSamplerYcbcrConversionKHR),
-		MAKE_VULKAN_ENTRY(vkDestroySamplerYcbcrConversionKHR),
-	};
-#undef MAKE_VULKAN_ENTRY
 
-	PFN_vkVoidFunction GetProcAddr(const char* pName)
+#define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
+static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers =
+{
+	MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
+	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
+	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
+	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
+};
+#undef MAKE_VULKAN_GLOBAL_ENTRY
+
+#define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
+static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers =
+{
+	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
+	// VK_KHR_device_group_creation
+	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
+	// VK_KHR_external_fence_capabilities
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
+	// VK_KHR_external_memory_capabilities
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
+	// VK_KHR_external_semaphore_capabilities
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
+	// VK_KHR_get_physical_device_properties2
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
+};
+#undef MAKE_VULKAN_GLOBAL_ENTRY
+
+#define MAKE_VULKAN_DEVICE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
+static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers =
+{
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
+	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
+	MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
+	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
+	MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
+	MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
+	MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
+	MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
+	MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
+	MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
+	MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
+	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
+	MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
+	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
+	// VK_KHR_descriptor_update_template
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
+	// VK_KHR_device_group
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
+	// VK_KHR_maintenance1
+	MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
+	// VK_KHR_sampler_ycbcr_conversion
+	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
+	// VK_KHR_bind_memory2
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
+	// VK_KHR_get_memory_requirements2
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
+	// VK_KHR_maintenance3
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
+};
+#undef MAKE_VULKAN_DEVICE_ENTRY
+
+PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName)
+{
+	auto globalFunction = globalFunctionPointers.find(std::string(pName));
+	if(globalFunction != globalFunctionPointers.end())
 	{
-		auto pFunc = func_ptrs.find(std::string(pName));
-		return (pFunc == func_ptrs.end()) ? nullptr : pFunc->second;
+		return globalFunction->second;
 	}
+
+	if(instance != VK_NULL_HANDLE)
+	{
+		auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
+		if(instanceFunction != instanceFunctionPointers.end())
+		{
+			return instanceFunction->second;
+		}
+
+		auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
+		if(deviceFunction != deviceFunctionPointers.end())
+		{
+			return deviceFunction->second;
+		}
+	}
+
+	return nullptr;
+}
+
+PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName)
+{
+	auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
+	if(deviceFunction != deviceFunctionPointers.end())
+	{
+		return deviceFunction->second;
+	}
+
+	return nullptr;
+}
+
 }
diff --git a/src/Vulkan/VkGetProcAddress.h b/src/Vulkan/VkGetProcAddress.h
index c8bfc35..2d5ba5f 100644
--- a/src/Vulkan/VkGetProcAddress.h
+++ b/src/Vulkan/VkGetProcAddress.h
@@ -19,7 +19,8 @@
 
 namespace vk
 {
-	PFN_vkVoidFunction GetProcAddr(const char* pName);
+PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName);
+PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName);
 }
 
 #endif // VK_UTILS_HPP_
\ No newline at end of file
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 21466db..57716be 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -45,7 +45,9 @@
 {
 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(VkInstance instance, const char* pName)
 {
-	return vk::GetProcAddr(pName);
+	TRACE("(VkInstance instance = 0x%X, const char* pName = 0x%X)", instance, pName);
+
+	return vk::GetInstanceProcAddr(instance, pName);
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
@@ -186,13 +188,15 @@
 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* pName)
 {
 	TRACE("(VkInstance instance = 0x%X, const char* pName = 0x%X)", instance, pName);
-	return vk::GetProcAddr(pName);
+
+	return vk::GetInstanceProcAddr(instance, pName);
 }
 
 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* pName)
 {
 	TRACE("(VkDevice device = 0x%X, const char* pName = 0x%X)", device, pName);
-	return vk::GetProcAddr(pName);
+
+	return vk::GetDeviceProcAddr(device, pName);
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice)
diff --git a/tests/VulkanUnitTests/unittests.cpp b/tests/VulkanUnitTests/unittests.cpp
index cf4e8e9..dfde2f8 100644
--- a/tests/VulkanUnitTests/unittests.cpp
+++ b/tests/VulkanUnitTests/unittests.cpp
@@ -58,218 +58,21 @@
 	vk_icdGetInstanceProcAddrPtr vk_icdGetInstanceProcAddr = nullptr;

 };

 

-TEST_F(SwiftShaderVulkanTest, API_Check)

+TEST_F(SwiftShaderVulkanTest, ICD_Check)

 {

 	if(vk_icdGetInstanceProcAddr)

 	{

-		#define API_CHECK(function) auto function = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, #function); \

-		                            EXPECT_NE(function, nullptr);

+		auto createInstance = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateInstance");

+		EXPECT_NE(createInstance, nullptr);

 

-		API_CHECK(vkCreateInstance);

-		API_CHECK(vkDestroyInstance);

-		API_CHECK(vkEnumeratePhysicalDevices);

-		API_CHECK(vkGetPhysicalDeviceFeatures);

-		API_CHECK(vkGetPhysicalDeviceFormatProperties);

-		API_CHECK(vkGetPhysicalDeviceImageFormatProperties);

-		API_CHECK(vkGetPhysicalDeviceProperties);

-		API_CHECK(vkGetPhysicalDeviceQueueFamilyProperties);

-		API_CHECK(vkGetPhysicalDeviceMemoryProperties);

-		API_CHECK(vkGetInstanceProcAddr);

-		API_CHECK(vkGetDeviceProcAddr);

-		API_CHECK(vkCreateDevice);

-		API_CHECK(vkDestroyDevice);

-		API_CHECK(vkEnumerateInstanceExtensionProperties);

-		API_CHECK(vkEnumerateDeviceExtensionProperties);

-		API_CHECK(vkEnumerateInstanceLayerProperties);

-		API_CHECK(vkEnumerateDeviceLayerProperties);

-		API_CHECK(vkGetDeviceQueue);

-		API_CHECK(vkQueueSubmit);

-		API_CHECK(vkQueueWaitIdle);

-		API_CHECK(vkDeviceWaitIdle);

-		API_CHECK(vkAllocateMemory);

-		API_CHECK(vkFreeMemory);

-		API_CHECK(vkMapMemory);

-		API_CHECK(vkUnmapMemory);

-		API_CHECK(vkFlushMappedMemoryRanges);

-		API_CHECK(vkInvalidateMappedMemoryRanges);

-		API_CHECK(vkGetDeviceMemoryCommitment);

-		API_CHECK(vkBindBufferMemory);

-		API_CHECK(vkBindImageMemory);

-		API_CHECK(vkGetBufferMemoryRequirements);

-		API_CHECK(vkGetImageMemoryRequirements);

-		API_CHECK(vkGetImageSparseMemoryRequirements);

-		API_CHECK(vkGetPhysicalDeviceSparseImageFormatProperties);

-		API_CHECK(vkQueueBindSparse);

-		API_CHECK(vkCreateFence);

-		API_CHECK(vkDestroyFence);

-		API_CHECK(vkResetFences);

-		API_CHECK(vkGetFenceStatus);

-		API_CHECK(vkWaitForFences);

-		API_CHECK(vkCreateSemaphore);

-		API_CHECK(vkDestroySemaphore);

-		API_CHECK(vkCreateEvent);

-		API_CHECK(vkDestroyEvent);

-		API_CHECK(vkGetEventStatus);

-		API_CHECK(vkSetEvent);

-		API_CHECK(vkResetEvent);

-		API_CHECK(vkCreateQueryPool);

-		API_CHECK(vkDestroyQueryPool);

-		API_CHECK(vkGetQueryPoolResults);

-		API_CHECK(vkCreateBuffer);

-		API_CHECK(vkDestroyBuffer);

-		API_CHECK(vkCreateBufferView);

-		API_CHECK(vkDestroyBufferView);

-		API_CHECK(vkCreateImage);

-		API_CHECK(vkDestroyImage);

-		API_CHECK(vkGetImageSubresourceLayout);

-		API_CHECK(vkCreateImageView);

-		API_CHECK(vkDestroyImageView);

-		API_CHECK(vkCreateShaderModule);

-		API_CHECK(vkDestroyShaderModule);

-		API_CHECK(vkCreatePipelineCache);

-		API_CHECK(vkDestroyPipelineCache);

-		API_CHECK(vkGetPipelineCacheData);

-		API_CHECK(vkMergePipelineCaches);

-		API_CHECK(vkCreateGraphicsPipelines);

-		API_CHECK(vkCreateComputePipelines);

-		API_CHECK(vkDestroyPipeline);

-		API_CHECK(vkCreatePipelineLayout);

-		API_CHECK(vkDestroyPipelineLayout);

-		API_CHECK(vkCreateSampler);

-		API_CHECK(vkDestroySampler);

-		API_CHECK(vkCreateDescriptorSetLayout);

-		API_CHECK(vkDestroyDescriptorSetLayout);

-		API_CHECK(vkCreateDescriptorPool);

-		API_CHECK(vkDestroyDescriptorPool);

-		API_CHECK(vkResetDescriptorPool);

-		API_CHECK(vkAllocateDescriptorSets);

-		API_CHECK(vkFreeDescriptorSets);

-		API_CHECK(vkUpdateDescriptorSets);

-		API_CHECK(vkCreateFramebuffer);

-		API_CHECK(vkDestroyFramebuffer);

-		API_CHECK(vkCreateRenderPass);

-		API_CHECK(vkDestroyRenderPass);

-		API_CHECK(vkGetRenderAreaGranularity);

-		API_CHECK(vkCreateCommandPool);

-		API_CHECK(vkDestroyCommandPool);

-		API_CHECK(vkResetCommandPool);

-		API_CHECK(vkAllocateCommandBuffers);

-		API_CHECK(vkFreeCommandBuffers);

-		API_CHECK(vkBeginCommandBuffer);

-		API_CHECK(vkEndCommandBuffer);

-		API_CHECK(vkResetCommandBuffer);

-		API_CHECK(vkCmdBindPipeline);

-		API_CHECK(vkCmdSetViewport);

-		API_CHECK(vkCmdSetScissor);

-		API_CHECK(vkCmdSetLineWidth);

-		API_CHECK(vkCmdSetDepthBias);

-		API_CHECK(vkCmdSetBlendConstants);

-		API_CHECK(vkCmdSetDepthBounds);

-		API_CHECK(vkCmdSetStencilCompareMask);

-		API_CHECK(vkCmdSetStencilWriteMask);

-		API_CHECK(vkCmdSetStencilReference);

-		API_CHECK(vkCmdBindDescriptorSets);

-		API_CHECK(vkCmdBindIndexBuffer);

-		API_CHECK(vkCmdBindVertexBuffers);

-		API_CHECK(vkCmdDraw);

-		API_CHECK(vkCmdDrawIndexed);

-		API_CHECK(vkCmdDrawIndirect);

-		API_CHECK(vkCmdDrawIndexedIndirect);

-		API_CHECK(vkCmdDispatch);

-		API_CHECK(vkCmdDispatchIndirect);

-		API_CHECK(vkCmdCopyBuffer);

-		API_CHECK(vkCmdCopyImage);

-		API_CHECK(vkCmdBlitImage);

-		API_CHECK(vkCmdCopyBufferToImage);

-		API_CHECK(vkCmdCopyImageToBuffer);

-		API_CHECK(vkCmdUpdateBuffer);

-		API_CHECK(vkCmdFillBuffer);

-		API_CHECK(vkCmdClearColorImage);

-		API_CHECK(vkCmdClearDepthStencilImage);

-		API_CHECK(vkCmdClearAttachments);

-		API_CHECK(vkCmdResolveImage);

-		API_CHECK(vkCmdSetEvent);

-		API_CHECK(vkCmdResetEvent);

-		API_CHECK(vkCmdWaitEvents);

-		API_CHECK(vkCmdPipelineBarrier);

-		API_CHECK(vkCmdBeginQuery);

-		API_CHECK(vkCmdEndQuery);

-		API_CHECK(vkCmdResetQueryPool);

-		API_CHECK(vkCmdWriteTimestamp);

-		API_CHECK(vkCmdCopyQueryPoolResults);

-		API_CHECK(vkCmdPushConstants);

-		API_CHECK(vkCmdBeginRenderPass);

-		API_CHECK(vkCmdNextSubpass);

-		API_CHECK(vkCmdEndRenderPass);

-		API_CHECK(vkCmdExecuteCommands);

-		API_CHECK(vkEnumerateInstanceVersion);

-		API_CHECK(vkBindBufferMemory2);

-		API_CHECK(vkBindImageMemory2);

-		API_CHECK(vkGetDeviceGroupPeerMemoryFeatures);

-		API_CHECK(vkCmdSetDeviceMask);

-		API_CHECK(vkCmdDispatchBase);

-		API_CHECK(vkEnumeratePhysicalDeviceGroups);

-		API_CHECK(vkGetImageMemoryRequirements2);

-		API_CHECK(vkGetBufferMemoryRequirements2);

-		API_CHECK(vkGetImageSparseMemoryRequirements2);

-		API_CHECK(vkGetPhysicalDeviceFeatures2);

-		API_CHECK(vkGetPhysicalDeviceProperties2);

-		API_CHECK(vkGetPhysicalDeviceFormatProperties2);

-		API_CHECK(vkGetPhysicalDeviceImageFormatProperties2);

-		API_CHECK(vkGetPhysicalDeviceQueueFamilyProperties2);

-		API_CHECK(vkGetPhysicalDeviceMemoryProperties2);

-		API_CHECK(vkGetPhysicalDeviceSparseImageFormatProperties2);

-		API_CHECK(vkTrimCommandPool);

-		API_CHECK(vkGetDeviceQueue2);

-		API_CHECK(vkCreateSamplerYcbcrConversion);

-		API_CHECK(vkDestroySamplerYcbcrConversion);

-		API_CHECK(vkCreateDescriptorUpdateTemplate);

-		API_CHECK(vkDestroyDescriptorUpdateTemplate);

-		API_CHECK(vkUpdateDescriptorSetWithTemplate);

-		API_CHECK(vkGetPhysicalDeviceExternalBufferProperties);

-		API_CHECK(vkGetPhysicalDeviceExternalFenceProperties);

-		API_CHECK(vkGetPhysicalDeviceExternalSemaphoreProperties);

-		API_CHECK(vkGetDescriptorSetLayoutSupport);

-		// VK_KHR_bind_memory2

-		API_CHECK(vkBindBufferMemory2KHR);

-		API_CHECK(vkBindImageMemory2KHR);

-		// VK_KHR_descriptor_update_template

-		API_CHECK(vkCreateDescriptorUpdateTemplateKHR);

-		API_CHECK(vkDestroyDescriptorUpdateTemplateKHR);

-		API_CHECK(vkUpdateDescriptorSetWithTemplateKHR);

-		// VK_KHR_device_group

-		API_CHECK(vkGetDeviceGroupPeerMemoryFeaturesKHR);

-		API_CHECK(vkCmdSetDeviceMaskKHR);

-		API_CHECK(vkCmdDispatchBaseKHR);

-		// VK_KHR_device_group_creation

-		API_CHECK(vkEnumeratePhysicalDeviceGroupsKHR);

-		// VK_KHR_external_fence_capabilities

-		API_CHECK(vkGetPhysicalDeviceExternalFencePropertiesKHR);

-		// VK_KHR_external_memory_capabilities

-		API_CHECK(vkGetPhysicalDeviceExternalBufferPropertiesKHR);

-		// VK_KHR_external_semaphore_capabilities

-		API_CHECK(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR);

-		// VK_KHR_get_memory_requirements2

-		API_CHECK(vkGetImageMemoryRequirements2KHR);

-		API_CHECK(vkGetBufferMemoryRequirements2KHR);

-		API_CHECK(vkGetImageSparseMemoryRequirements2KHR);

-		// VK_KHR_get_physical_device_properties2

-		API_CHECK(vkGetPhysicalDeviceFeatures2KHR);

-		API_CHECK(vkGetPhysicalDeviceProperties2KHR);

-		API_CHECK(vkGetPhysicalDeviceFormatProperties2KHR);

-		API_CHECK(vkGetPhysicalDeviceImageFormatProperties2KHR);

-		API_CHECK(vkGetPhysicalDeviceQueueFamilyProperties2KHR);

-		API_CHECK(vkGetPhysicalDeviceMemoryProperties2KHR);

-		API_CHECK(vkGetPhysicalDeviceSparseImageFormatProperties2KHR);

-		// VK_KHR_maintenance1

-		API_CHECK(vkTrimCommandPoolKHR);

-		// VK_KHR_maintenance3

-		API_CHECK(vkGetDescriptorSetLayoutSupportKHR);

-		// VK_KHR_sampler_ycbcr_conversion

-		API_CHECK(vkCreateSamplerYcbcrConversionKHR);

-		API_CHECK(vkDestroySamplerYcbcrConversionKHR);

+		auto enumerateInstanceExtensionProperties = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceExtensionProperties");

+		EXPECT_NE(enumerateInstanceExtensionProperties, nullptr);

 

-		#undef API_CHECK

+		auto enumerateInstanceLayerProperties = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceLayerProperties");

+		EXPECT_NE(enumerateInstanceLayerProperties, nullptr);

+

+		auto enumerateInstanceVersion = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceVersion");

+		EXPECT_NE(enumerateInstanceVersion, nullptr);

 

 		auto bad_function = vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "bad_function");

 		EXPECT_EQ(bad_function, nullptr);

@@ -278,6 +81,10 @@
 

 TEST_F(SwiftShaderVulkanTest, Version)

 {

+	uint32_t apiVersion = 0;

+	VkResult result = vkEnumerateInstanceVersion(&apiVersion);

+	EXPECT_EQ(apiVersion, VK_API_VERSION_1_1);

+

 	const VkInstanceCreateInfo createInfo =

 	{

 		VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType

@@ -289,8 +96,8 @@
 		0,       // enabledExtensionCount

 		nullptr, // ppEnabledExtensionNames

 	};

-	VkInstance instance;

-	VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);

+	VkInstance instance = VK_NULL_HANDLE;

+	result = vkCreateInstance(&createInfo, nullptr, &instance);

 	EXPECT_EQ(result, VK_SUCCESS);

 

 	uint32_t pPhysicalDeviceCount = 0;