CMakeLists: Add CMake rules for Vulkan debugger

`ENABLE_VULKAN_DEBUGGER` is the new option to enable building of the Vulkan debugger, which defaults to off.

`cppdap` is a new library that implements the debugger protocol.

Added a stub .cpp file to try and detect any build systems that are recursively globbing into the new src/Vulkan/Debug directory.

Actual debugger implementation will come in future changes.

Bug: b/145351270
Change-Id: I48619f1d8352c0525c8adbaa4bc3f2373a237d61
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38890
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 28ff2af..61f8090 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -106,8 +106,10 @@
 option(REACTOR_EMIT_PRINT_LOCATION "Emit printing of location info for JIT functions" 0)
 option(REACTOR_VERIFY_LLVM_IR "Check reactor-generated LLVM IR is valid even in release builds" 0)
 option(LESS_DEBUG_INFO "Generate less debug info to reduce file size" 0)
+option(ENABLE_VULKAN_DEBUGGER "Enable vulkan debugger support" 0)
 
 set(BUILD_MARL ${BUILD_VULKAN})
+set(BUILD_CPPDAP ${BUILD_VULKAN} AND ${ENABLE_VULKAN_DEBUGGER})
 
 set(DEFAULT_REACTOR_BACKEND "LLVM")
 
@@ -271,16 +273,20 @@
 set(OPENGL_DIR ${SOURCE_DIR}/OpenGL)
 set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
 set(VULKAN_DIR ${SOURCE_DIR}/Vulkan)
-set(LLVM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/llvm-7.0/llvm)
-set(LLVM_CONFIG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/llvm-7.0/configs)
-set(LIBBACKTRACE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace/src)
-set(LIBBACKTRACE_CONFIG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace/config)
-set(LIBBACKTRACE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace/src)
-set(MARL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/marl/include)
-set(SUBZERO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/subzero)
-set(SUBZERO_LLVM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/llvm-subzero)
+set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party)
+set(LLVM_DIR ${THIRD_PARTY_DIR}/llvm-7.0/llvm)
+set(LLVM_CONFIG_DIR ${THIRD_PARTY_DIR}/llvm-7.0/configs)
+set(LIBBACKTRACE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
+set(LIBBACKTRACE_CONFIG_DIR ${THIRD_PARTY_DIR}/libbacktrace/config)
+set(LIBBACKTRACE_INCLUDE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
+set(MARL_INCLUDE_DIR ${THIRD_PARTY_DIR}/marl/include)
+set(CPPDAP_DIR ${THIRD_PARTY_DIR}/cppdap)
+set(CPPDAP_INCLUDE_DIR ${CPPDAP_DIR}/include)
+set(JSON_INCLUDE_DIR ${THIRD_PARTY_DIR}/json/include)
+set(SUBZERO_DIR ${THIRD_PARTY_DIR}/subzero)
+set(SUBZERO_LLVM_DIR ${THIRD_PARTY_DIR}/llvm-subzero)
 set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
-set(HELLO2_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_SDK/Examples/Beginner/01_HelloAPI/OGLES2)
+set(HELLO2_DIR ${THIRD_PARTY_DIR}/PowerVR_SDK/Examples/Beginner/01_HelloAPI/OGLES2)
 
 ###########################################################
 # Compile flags
@@ -1610,6 +1616,7 @@
 set(VULKAN_INCLUDE_DIR
     ${COMMON_INCLUDE_DIR}
     ${MARL_INCLUDE_DIR}
+    ${CPPDAP_INCLUDE_DIR}
 )
 
 ###########################################################
@@ -1742,7 +1749,7 @@
 )
 list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
 
-file(GLOB_RECURSE VULKAN_LIST
+file(GLOB VULKAN_LIST
     ${VULKAN_DIR}/*.cpp
     ${VULKAN_DIR}/*.h
     ${VULKAN_DIR}/*.hpp
@@ -1775,7 +1782,17 @@
     ${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan/*.h}
 )
 
-if (LINUX OR ANDROID)
+if(ENABLE_VULKAN_DEBUGGER)
+    file(GLOB_RECURSE VULKAN_DEBUG_LIST
+        ${VULKAN_DIR}/Debug/*.cpp
+        ${VULKAN_DIR}/Debug/*.h
+        ${VULKAN_DIR}/Debug/*.hpp
+    )
+    list(APPEND VULKAN_LIST ${VULKAN_DEBUG_LIST})
+    list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_VK_DEBUGGER")
+endif(ENABLE_VULKAN_DEBUGGER)
+
+if(LINUX OR ANDROID)
     list(APPEND VULKAN_LIST
         ${SOURCE_DIR}/System/Linux/MemFd.cpp
 	${SOURCE_DIR}/System/Linux/MemFd.hpp)
@@ -2027,13 +2044,19 @@
 endif()
 
 if(BUILD_MARL)
+    set(MARL_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
     add_subdirectory(third_party/marl)
 endif(BUILD_MARL)
 
+if(BUILD_CPPDAP)
+    set(CPPDAP_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
+    add_subdirectory(${CPPDAP_DIR})
+endif(BUILD_CPPDAP)
+
 if(BUILD_VULKAN)
     if (NOT TARGET SPIRV-Tools)
         # This variable is also used by SPIRV-Tools to locate SPIRV-Headers
-        set(SPIRV-Headers_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/SPIRV-Headers")
+        set(SPIRV-Headers_SOURCE_DIR "${THIRD_PARTY_DIR}/SPIRV-Headers")
         list(APPEND VULKAN_INCLUDE_DIR "${SPIRV-Headers_SOURCE_DIR}/include")
 
         add_subdirectory(third_party/SPIRV-Tools)
@@ -2066,7 +2089,13 @@
     endif()
 
     set_shared_library_export_map(vk_swiftshader ${SOURCE_DIR}/Vulkan)
-    target_link_libraries(vk_swiftshader ${Reactor} marl ${OS_LIBS} SPIRV-Tools SPIRV-Tools-opt)
+
+    set(VK_SWIFTSHADER_LIBS ${Reactor} marl ${OS_LIBS} SPIRV-Tools SPIRV-Tools-opt)
+    if(ENABLE_VULKAN_DEBUGGER)
+        list(APPEND VK_SWIFTSHADER_LIBS cppdap)
+    endif(ENABLE_VULKAN_DEBUGGER)
+    target_link_libraries(vk_swiftshader ${VK_SWIFTSHADER_LIBS})
+
     add_custom_command(
         TARGET vk_swiftshader
         POST_BUILD
@@ -2136,12 +2165,12 @@
 if(BUILD_TESTS)
     set(REACTOR_UNIT_TESTS_LIST
         ${SOURCE_DIR}/Reactor/ReactorUnitTests.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
+        ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
     )
 
     set(REACTOR_UNIT_TESTS_INCLUDE_DIR
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/
+        ${THIRD_PARTY_DIR}/googletest/googletest/include
+        ${THIRD_PARTY_DIR}/googletest/googletest/
     )
 
     add_executable(ReactorUnitTests ${REACTOR_UNIT_TESTS_LIST})
@@ -2162,13 +2191,13 @@
     set(GLES_UNITTESTS_LIST
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/GLESUnitTests/main.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/GLESUnitTests/unittests.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
+        ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
     )
 
     set(GLES_UNITTESTS_INCLUDE_DIR
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/
+        ${THIRD_PARTY_DIR}/googletest/googletest/include/
+        ${THIRD_PARTY_DIR}/googletest/googlemock/include/
+        ${THIRD_PARTY_DIR}/googletest/googletest/
         ${CMAKE_CURRENT_SOURCE_DIR}/include/
     )
 
@@ -2191,13 +2220,13 @@
     set(MATH_UNITTESTS_LIST
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/MathUnitTests/main.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/MathUnitTests/unittests.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
+        ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
     )
 
     set(MATH_UNITTESTS_INCLUDE_DIR
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/
+        ${THIRD_PARTY_DIR}/googletest/googletest/include/
+        ${THIRD_PARTY_DIR}/googletest/googlemock/include/
+        ${THIRD_PARTY_DIR}/googletest/googletest/
         ${CMAKE_CURRENT_SOURCE_DIR}/src/
     )
 
@@ -2219,14 +2248,14 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/VulkanUnitTests/Driver.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/VulkanUnitTests/main.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/tests/VulkanUnitTests/unittests.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
+        ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
     )
 
     set(VK_UNITTESTS_INCLUDE_DIR
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/SPIRV-Tools/include
+        ${THIRD_PARTY_DIR}/googletest/googletest/include/
+        ${THIRD_PARTY_DIR}/googletest/googlemock/include/
+        ${THIRD_PARTY_DIR}/googletest/googletest/
+        ${THIRD_PARTY_DIR}/SPIRV-Tools/include
         ${CMAKE_CURRENT_SOURCE_DIR}/include/
     )
 
diff --git a/src/Vulkan/Debug/Debug.cpp b/src/Vulkan/Debug/Debug.cpp
new file mode 100644
index 0000000..4976fba
--- /dev/null
+++ b/src/Vulkan/Debug/Debug.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 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.
+
+#ifndef ENABLE_VK_DEBUGGER
+#error "Source files in {SwiftShader}/src/Vulkan/Debug should not be built unless ENABLE_VK_DEBUGGER is defined"
+#endif // ENABLE_VK_DEBUGGER