Initial cmake support for vulkan target

Change-Id: I34b47a5327055f804951793d9a8a58f771d9b792
Bug: b/116336664
Reviewed-on: https://swiftshader-review.googlesource.com/20988
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9576681..aa05ee2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,7 @@
 endif()
 option(BUILD_GLESv2 "Build the OpenGL ES 2 library" 1)
 option(BUILD_GLES_CM "Build the OpenGL ES 1.1 library" 1)
+option(BUILD_VULKAN "Build the Vulkan library" 1)
 
 option(USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" 1)
 
@@ -161,6 +162,7 @@
 set(SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)
 set(OPENGL_DIR ${SOURCE_DIR}/OpenGL)
 set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
+set(VULKAN_DIR ${SOURCE_DIR}/Vulkan)
 if(SWIFTSHADER_LLVM_VERSION EQUAL 3)
     set(LLVM_DIR ${CMAKE_SOURCE_DIR}/third_party/LLVM)
 else()
@@ -1767,6 +1769,12 @@
     ${COMMON_INCLUDE_DIR}
 )
 
+set(VULKAN_INCLUDE_DIR
+    ${VULKAN_DIR}
+    ${COMMON_INCLUDE_DIR}
+)
+
+
 ###########################################################
 # File Lists
 ###########################################################
@@ -1864,6 +1872,12 @@
 )
 list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
 
+file(GLOB_RECURSE VULKAN_LIST
+    ${VULKAN_DIR}/*.cpp
+    ${VULKAN_DIR}/*.h
+    ${CMAKE_SOURCE_DIR}/include/vulkan/*.h}
+)
+
 ###########################################################
 # Append OS specific files to lists
 ###########################################################
@@ -2037,6 +2051,26 @@
     )
 endif()
 
+if(BUILD_VULKAN)
+    add_library(libvk_swiftshader SHARED ${VULKAN_LIST})
+    set_target_properties(libvk_swiftshader PROPERTIES
+        INCLUDE_DIRECTORIES "${VULKAN_INCLUDE_DIR}"
+        FOLDER "Vulkan"
+        COMPILE_DEFINITIONS "NO_SANITIZE_FUNCTION=;"
+        PREFIX ""
+    )
+    set_shared_library_export_map(libvk_swiftshader ${SOURCE_DIR}/Vulkan)
+    target_link_libraries(libvk_swiftshader ${OS_LIBS})
+    add_custom_command(
+        TARGET libvk_swiftshader
+        POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libvk_swiftshader>/translator
+        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libvk_swiftshader> $<TARGET_FILE_DIR:libvk_swiftshader>/translator/${LIB_PREFIX}Vulkan_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
+        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
+        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libvk_swiftshader> ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
+    )
+endif()
+
 ###########################################################
 # Sample programs
 ###########################################################
diff --git a/src/Vulkan/VkDebug.cpp b/src/Vulkan/VkDebug.cpp
index b09abb6..b82ef80 100644
--- a/src/Vulkan/VkDebug.cpp
+++ b/src/Vulkan/VkDebug.cpp
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "vkdebug.hpp"
+#include "VkDebug.hpp"
 
 #include <stdarg.h>
 
@@ -35,4 +35,4 @@
 		}
 	}
 }
-}
\ No newline at end of file
+}
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index ff86d67..2e15309 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -15,7 +15,7 @@
 #include "VkDebug.hpp"
 #include "VkGetProcAddress.h"
 #include <vulkan/vulkan.h>
-#include <string>
+#include <cstring>
 
 extern "C"
 {
@@ -1280,4 +1280,4 @@
 	UNIMPLEMENTED();
 }
 
-}
\ No newline at end of file
+}
diff --git a/src/Vulkan/libvk_swiftshader.lds b/src/Vulkan/libvk_swiftshader.lds
new file mode 100644
index 0000000..3de3bc5
--- /dev/null
+++ b/src/Vulkan/libvk_swiftshader.lds
@@ -0,0 +1,13 @@
+{
+global:
+	# Loader-ICD interface functions
+	vk_icdGetInstanceProcAddr;
+
+	# Type-strings and type-infos required by sanitizers
+	_ZTS*;
+	_ZTI*;
+
+local:
+	*;
+};
+
diff --git a/src/Vulkan/main.cpp b/src/Vulkan/main.cpp
index cdcbf39..80b6ee0 100644
--- a/src/Vulkan/main.cpp
+++ b/src/Vulkan/main.cpp
@@ -14,10 +14,10 @@
 
 // main.cpp: DLL entry point.
 
+#if defined(_WIN32)
 #include "resource.h"
 #include <windows.h>
 
-#if defined(_WIN32)
 #ifdef DEBUGGER_WAIT_DIALOG
 static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
@@ -75,4 +75,4 @@
 
 	return TRUE;
 }
-#endif
\ No newline at end of file
+#endif