Export Vulkan API entry functions

This enables running tests and applications directly against the driver
without the use of a loader.

Bug: b/148240133
Change-Id: I7c906ed72a6bd5465a50381d3e91e18383bb23e1
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28370
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32a13c6..73cf966 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2130,9 +2130,11 @@
     )
 
     if(WIN32)
+        set(VULKAN_API_LIBRARY_NAME "vulkan-1.dll")
         set_property(TARGET vk_swiftshader APPEND
                      PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_WIN32_KHR")
     elseif(LINUX)
+        set(VULKAN_API_LIBRARY_NAME "libvulkan.so.1")
         if(X11)
             set_property(TARGET vk_swiftshader APPEND
                         PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XLIB_KHR")
@@ -2142,8 +2144,11 @@
                         PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XCB_KHR")
         endif()
     elseif(APPLE)
+        set(VULKAN_API_LIBRARY_NAME "libvulkan.dylib")
         set_property(TARGET vk_swiftshader APPEND
                      PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_MACOS_MVK")
+    else()
+        message(FATAL_ERROR "Platform does not support Vulkan yet")
     endif()
 
     set_shared_library_export_map(vk_swiftshader ${SOURCE_DIR}/Vulkan)
@@ -2157,10 +2162,9 @@
     add_custom_command(
         TARGET vk_swiftshader
         POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:vk_swiftshader>/translator
-        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> $<TARGET_FILE_DIR:vk_swiftshader>/translator/${LIB_PREFIX}Vulkan_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
+        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/${VULKAN_API_LIBRARY_NAME}
     )
 
     # The vk_swiftshader_icd.json manifest file will point to ICD_LIBRARY_PATH.
@@ -2175,11 +2179,12 @@
     endif()
     configure_file(
         "${VULKAN_DIR}/vk_swiftshader_icd.json.tmpl"
-        "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/vk_swiftshader_icd.json")
-endif(SWIFTSHADER_BUILD_VULKAN)
+        "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/vk_swiftshader_icd.json"
+    )
+endif()
 
 ###########################################################
-# Sample programs
+# Sample programs and tests
 ###########################################################
 
 if(SWIFTSHADER_BUILD_SAMPLES)
diff --git a/src/Vulkan/vk_swiftshader.lds b/src/Vulkan/vk_swiftshader.lds
index 075cda2..ae3c49f 100644
--- a/src/Vulkan/vk_swiftshader.lds
+++ b/src/Vulkan/vk_swiftshader.lds
@@ -1,11 +1,220 @@
 {
 global:
-	vkGetInstanceProcAddr;
-
 	# Loader-ICD interface functions
 	vk_icdGetInstanceProcAddr;
 	vk_icdNegotiateLoaderICDInterfaceVersion;
 
+	# Optional Vulkan API entry functions
+	vkCreateInstance;
+	vkDestroyInstance;
+	vkEnumeratePhysicalDevices;
+	vkGetPhysicalDeviceFeatures;
+	vkGetPhysicalDeviceFormatProperties;
+	vkGetPhysicalDeviceImageFormatProperties;
+	vkGetPhysicalDeviceProperties;
+	vkGetPhysicalDeviceQueueFamilyProperties;
+	vkGetPhysicalDeviceMemoryProperties;
+	vkGetInstanceProcAddr;
+	vkGetDeviceProcAddr;
+	vkCreateDevice;
+	vkDestroyDevice;
+	vkEnumerateInstanceExtensionProperties;
+	vkEnumerateDeviceExtensionProperties;
+	vkEnumerateInstanceLayerProperties;
+	vkEnumerateDeviceLayerProperties;
+	vkGetDeviceQueue;
+	vkQueueSubmit;
+	vkQueueWaitIdle;
+	vkDeviceWaitIdle;
+	vkAllocateMemory;
+	vkFreeMemory;
+	vkMapMemory;
+	vkUnmapMemory;
+	vkFlushMappedMemoryRanges;
+	vkInvalidateMappedMemoryRanges;
+	vkGetDeviceMemoryCommitment;
+	vkBindBufferMemory;
+	vkBindImageMemory;
+	vkGetBufferMemoryRequirements;
+	vkGetImageMemoryRequirements;
+	vkGetImageSparseMemoryRequirements;
+	vkGetPhysicalDeviceSparseImageFormatProperties;
+	vkQueueBindSparse;
+	vkCreateFence;
+	vkDestroyFence;
+	vkResetFences;
+	vkGetFenceStatus;
+	vkWaitForFences;
+	vkCreateSemaphore;
+	vkDestroySemaphore;
+	vkCreateEvent;
+	vkDestroyEvent;
+	vkGetEventStatus;
+	vkSetEvent;
+	vkResetEvent;
+	vkCreateQueryPool;
+	vkDestroyQueryPool;
+	vkGetQueryPoolResults;
+	vkCreateBuffer;
+	vkDestroyBuffer;
+	vkCreateBufferView;
+	vkDestroyBufferView;
+	vkCreateImage;
+	vkDestroyImage;
+	vkGetImageSubresourceLayout;
+	vkCreateImageView;
+	vkDestroyImageView;
+	vkCreateShaderModule;
+	vkDestroyShaderModule;
+	vkCreatePipelineCache;
+	vkDestroyPipelineCache;
+	vkGetPipelineCacheData;
+	vkMergePipelineCaches;
+	vkCreateGraphicsPipelines;
+	vkCreateComputePipelines;
+	vkDestroyPipeline;
+	vkCreatePipelineLayout;
+	vkDestroyPipelineLayout;
+	vkCreateSampler;
+	vkDestroySampler;
+	vkCreateDescriptorSetLayout;
+	vkDestroyDescriptorSetLayout;
+	vkCreateDescriptorPool;
+	vkDestroyDescriptorPool;
+	vkResetDescriptorPool;
+	vkAllocateDescriptorSets;
+	vkFreeDescriptorSets;
+	vkUpdateDescriptorSets;
+	vkCreateFramebuffer;
+	vkDestroyFramebuffer;
+	vkCreateRenderPass;
+	vkDestroyRenderPass;
+	vkGetRenderAreaGranularity;
+	vkCreateCommandPool;
+	vkDestroyCommandPool;
+	vkResetCommandPool;
+	vkAllocateCommandBuffers;
+	vkFreeCommandBuffers;
+	vkBeginCommandBuffer;
+	vkEndCommandBuffer;
+	vkResetCommandBuffer;
+	vkCmdBindPipeline;
+	vkCmdSetViewport;
+	vkCmdSetScissor;
+	vkCmdSetLineWidth;
+	vkCmdSetDepthBias;
+	vkCmdSetBlendConstants;
+	vkCmdSetDepthBounds;
+	vkCmdSetStencilCompareMask;
+	vkCmdSetStencilWriteMask;
+	vkCmdSetStencilReference;
+	vkCmdBindDescriptorSets;
+	vkCmdBindIndexBuffer;
+	vkCmdBindVertexBuffers;
+	vkCmdDraw;
+	vkCmdDrawIndexed;
+	vkCmdDrawIndirect;
+	vkCmdDrawIndexedIndirect;
+	vkCmdDispatch;
+	vkCmdDispatchIndirect;
+	vkCmdCopyBuffer;
+	vkCmdCopyImage;
+	vkCmdBlitImage;
+	vkCmdCopyBufferToImage;
+	vkCmdCopyImageToBuffer;
+	vkCmdUpdateBuffer;
+	vkCmdFillBuffer;
+	vkCmdClearColorImage;
+	vkCmdClearDepthStencilImage;
+	vkCmdClearAttachments;
+	vkCmdResolveImage;
+	vkCmdSetEvent;
+	vkCmdResetEvent;
+	vkCmdWaitEvents;
+	vkCmdPipelineBarrier;
+	vkCmdBeginQuery;
+	vkCmdEndQuery;
+	vkCmdResetQueryPool;
+	vkCmdWriteTimestamp;
+	vkCmdCopyQueryPoolResults;
+	vkCmdPushConstants;
+	vkCmdBeginRenderPass;
+	vkCmdNextSubpass;
+	vkCmdEndRenderPass;
+	vkCmdExecuteCommands;
+	vkEnumerateInstanceVersion;
+	vkBindBufferMemory2;
+	vkBindImageMemory2;
+	vkGetDeviceGroupPeerMemoryFeatures;
+	vkCmdSetDeviceMask;
+	vkCmdDispatchBase;
+	vkEnumeratePhysicalDeviceGroups;
+	vkGetImageMemoryRequirements2;
+	vkGetBufferMemoryRequirements2;
+	vkGetImageSparseMemoryRequirements2;
+	vkGetPhysicalDeviceFeatures2;
+	vkGetPhysicalDeviceProperties2;
+	vkGetPhysicalDeviceFormatProperties2;
+	vkGetPhysicalDeviceImageFormatProperties2;
+	vkGetPhysicalDeviceQueueFamilyProperties2;
+	vkGetPhysicalDeviceMemoryProperties2;
+	vkGetPhysicalDeviceSparseImageFormatProperties2;
+	vkTrimCommandPool;
+	vkGetDeviceQueue2;
+	vkCreateSamplerYcbcrConversion;
+	vkDestroySamplerYcbcrConversion;
+	vkCreateDescriptorUpdateTemplate;
+	vkDestroyDescriptorUpdateTemplate;
+	vkUpdateDescriptorSetWithTemplate;
+	vkGetPhysicalDeviceExternalBufferProperties;
+	vkGetPhysicalDeviceExternalFenceProperties;
+	vkGetPhysicalDeviceExternalSemaphoreProperties;
+	vkGetDescriptorSetLayoutSupport;
+	# VK_KHR_bind_memory2;
+	vkBindBufferMemory2KHR;
+	vkBindImageMemory2KHR;
+	# VK_KHR_descriptor_update_template;
+	vkCreateDescriptorUpdateTemplateKHR;
+	vkDestroyDescriptorUpdateTemplateKHR;
+	vkUpdateDescriptorSetWithTemplateKHR;
+	# VK_KHR_device_group;
+	vkGetDeviceGroupPeerMemoryFeaturesKHR;
+	vkCmdSetDeviceMaskKHR;
+	vkCmdDispatchBaseKHR;
+	# VK_KHR_device_group_creation;
+	vkEnumeratePhysicalDeviceGroupsKHR;
+	# VK_KHR_external_fence_capabilities;
+	vkGetPhysicalDeviceExternalFencePropertiesKHR;
+	# VK_KHR_external_memory_capabilities;
+	vkGetPhysicalDeviceExternalBufferPropertiesKHR;
+	# VK_KHR_external_semaphore_capabilities;
+	vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
+	# VK_KHR_get_memory_requirements2;
+	vkGetImageMemoryRequirements2KHR;
+	vkGetBufferMemoryRequirements2KHR;
+	vkGetImageSparseMemoryRequirements2KHR;
+	# VK_KHR_get_physical_device_properties2;
+	vkGetPhysicalDeviceFeatures2KHR;
+	vkGetPhysicalDeviceProperties2KHR;
+	vkGetPhysicalDeviceFormatProperties2KHR;
+	vkGetPhysicalDeviceImageFormatProperties2KHR;
+	vkGetPhysicalDeviceQueueFamilyProperties2KHR;
+	vkGetPhysicalDeviceMemoryProperties2KHR;
+	vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
+	# VK_KHR_maintenance1;
+	vkTrimCommandPoolKHR;
+	# VK_KHR_maintenance3;
+	vkGetDescriptorSetLayoutSupportKHR;
+	# VK_KHR_sampler_ycbcr_conversion;
+	vkCreateSamplerYcbcrConversionKHR;
+	vkDestroySamplerYcbcrConversionKHR;
+	# VK_KHR_surface;
+	vkDestroySurfaceKHR;
+	vkGetPhysicalDeviceSurfaceSupportKHR;
+	vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
+	vkGetPhysicalDeviceSurfaceFormatsKHR;
+	vkGetPhysicalDeviceSurfacePresentModesKHR;
+
 	# Type-strings and type-infos required by sanitizers
 	_ZTS*;
 	_ZTI*;