Export Vulkan API entry functions.

This enables running the unit tests without manually querying each entry
function. The compiler generates a .lib file for us which load the .dll
file and retrieves the entry functions.

Also fix project dependencies and DLL path.

Bug b/116336664

Change-Id: I4cbd80bd071a20058b034db8fb12e31f9af2e081
Reviewed-on: https://swiftshader-review.googlesource.com/c/22489
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Corentin Wallez <cwallez@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/swiftshader_icd.def b/src/Vulkan/swiftshader_icd.def
index 2b4f9c7..86ab4ce 100644
--- a/src/Vulkan/swiftshader_icd.def
+++ b/src/Vulkan/swiftshader_icd.def
@@ -1,3 +1,209 @@
-LIBRARY vk_swiftshader.dll
-EXPORTS
-	vk_icdGetInstanceProcAddr
+LIBRARY vk_swiftshader

+EXPORTS

+	; Mandatory ICD entry function

+	vk_icdGetInstanceProcAddr

+

+	; 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

diff --git a/tests/GLESUnitTests/unittests.cpp b/tests/GLESUnitTests/unittests.cpp
index e51bf99..a1ea0b6 100644
--- a/tests/GLESUnitTests/unittests.cpp
+++ b/tests/GLESUnitTests/unittests.cpp
@@ -353,22 +353,22 @@
 {
 	Initialize(3, false);
 
-	GLfloat zero_float = 0;

-	GLuint renderbuffer;

-	glGenRenderbuffers(1, &renderbuffer);

-	GLuint framebuffer;

-	glGenFramebuffers(1, &framebuffer);

-

-	glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());

-	glRenderbufferStorage(GL_RENDERBUFFER, GL_R8I, 43, 27);

-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());

-	glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);

-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());

-	glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);

-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());

-	glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());

+	GLfloat zero_float = 0;
+	GLuint renderbuffer;
+	glGenRenderbuffers(1, &renderbuffer);
+	GLuint framebuffer;
+	glGenFramebuffers(1, &framebuffer);
+
+	glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
+	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	glRenderbufferStorage(GL_RENDERBUFFER, GL_R8I, 43, 27);
+	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
+	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
+	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
 	glClearBufferfv(GL_DEPTH, 0, &zero_float);
 	EXPECT_GLENUM_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, glGetError());
 
diff --git a/tests/VulkanUnitTests/VulkanUnitTests.vcxproj b/tests/VulkanUnitTests/VulkanUnitTests.vcxproj
index ff72789..7ef53e9 100644
--- a/tests/VulkanUnitTests/VulkanUnitTests.vcxproj
+++ b/tests/VulkanUnitTests/VulkanUnitTests.vcxproj
@@ -102,11 +102,8 @@
     <ClCompile Include="unittests.cpp" />

   </ItemGroup>

   <ItemGroup>

-    <ProjectReference Include="..\..\src\OpenGL\libEGL\libEGL.vcxproj">

-      <Project>{e746fca9-64c3-433e-85e8-9a5a67ab7ed6}</Project>

-    </ProjectReference>

-    <ProjectReference Include="..\..\src\OpenGL\libGLESv2\libGLESv2.vcxproj">

-      <Project>{b5871a7a-968c-42e3-a33b-981e6f448e78}</Project>

+    <ProjectReference Include="..\..\src\Vulkan\vulkan.vcxproj">

+      <Project>{e1c34b66-c942-4b9a-b8c3-9a12625650d3}</Project>

     </ProjectReference>

   </ItemGroup>

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

diff --git a/tests/VulkanUnitTests/unittests.cpp b/tests/VulkanUnitTests/unittests.cpp
index cbe1fb2..cf4e8e9 100644
--- a/tests/VulkanUnitTests/unittests.cpp
+++ b/tests/VulkanUnitTests/unittests.cpp
@@ -1,4 +1,4 @@
-// Copyright 2017 The SwiftShader Authors. All Rights Reserved.

+// 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.

@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and

 // limitations under the License.

 

-// OpenGL ES unit tests that provide coverage for functionality not tested by

+// Vulkan unit tests that provide coverage for functionality not tested by

 // the dEQP test suite. Also used as a smoke test.

 

 #include "gtest/gtest.h"

@@ -39,16 +39,12 @@
 

 		#if defined(_WIN64)

 			#if defined(NDEBUG)

-				libVulkanName = "..\\..\\..\\vulkan\\x64\\Release\\vk_swiftshader.dll";

+				libVulkanName = "../../out/Release_x64/vk_swiftshader.dll";

 			#else

-				libVulkanName = "..\\..\\..\\vulkan\\x64\\Debug\\vk_swiftshader.dll";

+				libVulkanName = "../../out/Debug_x64/vk_swiftshader.dll";

 			#endif

-		#elif defined(_WIN32)

-			#if defined(NDEBUG)

-				libVulkanName = "..\\..\\..\\vulkan\\Win32\\Release\\vk_swiftshader.dll";

-			#else

-				libVulkanName = "..\\..\\..\\vulkan\\Win32\\Debug\\vk_swiftshader.dll";

-			#endif

+		#else

+			#error Unimplemented platform

 		#endif

 

 		#if defined(_WIN32)

@@ -282,48 +278,36 @@
 

 TEST_F(SwiftShaderVulkanTest, Version)

 {

-	if(vk_icdGetInstanceProcAddr)

+	const VkInstanceCreateInfo createInfo =

 	{

-		auto vkCreateInstance = (PFN_vkCreateInstance)vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateInstance");

-		EXPECT_NE(vkCreateInstance, nullptr);

+		VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType

+		nullptr, // pNext

+		0,       // flags

+		nullptr, // pApplicationInfo

+		0,       // enabledLayerCount

+		nullptr, // ppEnabledLayerNames

+		0,       // enabledExtensionCount

+		nullptr, // ppEnabledExtensionNames

+	};

+	VkInstance instance;

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

+	EXPECT_EQ(result, VK_SUCCESS);

 

-		const VkInstanceCreateInfo createInfo = 

-		{

-				VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType

-				nullptr, // pNext

-				0, // flags

-				nullptr, // pApplicationInfo

-				0, // enabledLayerCount

-				nullptr, // ppEnabledLayerNames

-				0, // enabledExtensionCount

-				nullptr, // ppEnabledExtensionNames

-		};

-		VkInstance instance;

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

-		EXPECT_EQ(result, VK_SUCCESS);

+	uint32_t pPhysicalDeviceCount = 0;

+	result = vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, nullptr);

+	EXPECT_EQ(result, VK_SUCCESS);

+	EXPECT_EQ(pPhysicalDeviceCount, 1);

 

-		auto vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumeratePhysicalDevices");

-		EXPECT_NE(vkEnumeratePhysicalDevices, nullptr);

+	VkPhysicalDevice pPhysicalDevice = VK_NULL_HANDLE;

+	result = vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, &pPhysicalDevice);

+	EXPECT_EQ(result, VK_SUCCESS);

+	EXPECT_NE(pPhysicalDevice, (VkPhysicalDevice)VK_NULL_HANDLE);

 

-		uint32_t pPhysicalDeviceCount = 0;

-		result = vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, nullptr);

-		EXPECT_EQ(result, VK_SUCCESS);

-		EXPECT_EQ(pPhysicalDeviceCount, 1);

+	VkPhysicalDeviceProperties physicalDeviceProperties;

+	vkGetPhysicalDeviceProperties(pPhysicalDevice, &physicalDeviceProperties);

+	EXPECT_EQ(physicalDeviceProperties.apiVersion, VK_API_VERSION_1_1);

+	EXPECT_EQ(physicalDeviceProperties.deviceID, 0xC0DE);

+	EXPECT_EQ(physicalDeviceProperties.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);

 

-		VkPhysicalDevice pPhysicalDevice = VK_NULL_HANDLE;

-		result = vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, &pPhysicalDevice);

-		EXPECT_EQ(result, VK_SUCCESS);

-		EXPECT_NE(pPhysicalDevice, (VkPhysicalDevice)VK_NULL_HANDLE);

-

-		auto vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkGetPhysicalDeviceProperties");

-		EXPECT_NE(vkEnumeratePhysicalDevices, nullptr);

-

-		VkPhysicalDeviceProperties physicalDeviceProperties;

-		vkGetPhysicalDeviceProperties(pPhysicalDevice, &physicalDeviceProperties);

-		EXPECT_EQ(physicalDeviceProperties.apiVersion, VK_API_VERSION_1_1);

-		EXPECT_EQ(physicalDeviceProperties.deviceID, 0xC0DE);

-		EXPECT_EQ(physicalDeviceProperties.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);

-

-		EXPECT_EQ(strncmp(physicalDeviceProperties.deviceName, "SwiftShader Device", VK_MAX_PHYSICAL_DEVICE_NAME_SIZE), 0);

-	}

+	EXPECT_EQ(strncmp(physicalDeviceProperties.deviceName, "SwiftShader Device", VK_MAX_PHYSICAL_DEVICE_NAME_SIZE), 0);

 }