Vulkan API (GetProcAddr only)

This patch contains an empty Vulkan shell with only GetProcAddr implemented

Initial version of the VulkanAPI, empty and unimplemented.
Successfully builds vk_swiftshader.dll for all platforms/configuration in Visual Studio.

To test using dEQP:
- Edit environment variables
	- Define VK_ICD_FILENAMES to <SwiftShader's source directory>\src\Vulkan\vk_swiftshader_icd.json
- If the location of vk_swiftshader.dll you're using is different than the one specified in
  src\Vulkan\vk_swiftshader_icd.json, modify it to point to the vk_swiftshader.dll file you want to use

Bug b/116336664

Change-Id: I560b53c3e4340b9c5ccd244a6693ff2f9f994a6f
Reviewed-on: https://swiftshader-review.googlesource.com/20788
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
new file mode 100644
index 0000000..ea5f8c8
--- /dev/null
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -0,0 +1,235 @@
+// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
+//
+// 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 "VkGetProcAddress.h"
+
+#include <unordered_map>
+
+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)
+	{
+		auto pFunc = func_ptrs.find(std::string(pName));
+		return (pFunc == func_ptrs.end()) ? nullptr : pFunc->second;
+	}
+}