Add wrapping for using external vulkan images as textures

This change adds platform-dependent services that handle creating
semaphores and importing image memory. Then, we use them to wrap a
texture from an outside source, and release a signal semaphore back
when we're done with it. This will be used to allow chrome to render
dawn on Vulkan platforms.

Bug: chromium:976495
Change-Id: I9f07eaf436e10aa6bd88cffdc74fd23834d62ee0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/8340
Commit-Queue: Idan Raiter <idanr@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index aed63b1..4375a36 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -362,6 +362,7 @@
       "src/dawn_native/vulkan/ComputePipelineVk.h",
       "src/dawn_native/vulkan/DeviceVk.cpp",
       "src/dawn_native/vulkan/DeviceVk.h",
+      "src/dawn_native/vulkan/ExternalHandle.h",
       "src/dawn_native/vulkan/FencedDeleter.cpp",
       "src/dawn_native/vulkan/FencedDeleter.h",
       "src/dawn_native/vulkan/Forward.h",
@@ -395,7 +396,21 @@
       "src/dawn_native/vulkan/VulkanFunctions.h",
       "src/dawn_native/vulkan/VulkanInfo.cpp",
       "src/dawn_native/vulkan/VulkanInfo.h",
+      "src/dawn_native/vulkan/external_memory/MemoryService.h",
+      "src/dawn_native/vulkan/external_semaphore/SemaphoreService.h",
     ]
+
+    if (is_linux) {
+      sources += [
+        "src/dawn_native/vulkan/external_memory/MemoryServiceOpaqueFD.cpp",
+        "src/dawn_native/vulkan/external_semaphore/SemaphoreServiceOpaqueFD.cpp",
+      ]
+    } else {
+      sources += [
+        "src/dawn_native/vulkan/external_memory/MemoryServiceNull.cpp",
+        "src/dawn_native/vulkan/external_semaphore/SemaphoreServiceNull.cpp",
+      ]
+    }
   }
 }
 
@@ -667,8 +682,9 @@
   }
 }
 
-test("dawn_end2end_tests") {
+source_set("dawn_end2end_tests_sources") {
   configs += [ "${dawn_root}/src/common:dawn_internal" ]
+  testonly = true
 
   deps = [
     ":dawn_utils",
@@ -681,7 +697,6 @@
   ]
 
   sources = [
-    "src/tests/DawnTest.cpp",
     "src/tests/DawnTest.h",
     "src/tests/end2end/BasicTests.cpp",
     "src/tests/end2end/BindGroupTests.cpp",
@@ -729,6 +744,59 @@
 
     libs += [ "IOSurface.framework" ]
   }
+}
+
+source_set("dawn_white_box_tests_sources") {
+  configs += [ "${dawn_root}/src/common:dawn_internal" ]
+  testonly = true
+
+  deps = [
+    ":dawn_utils",
+    ":libdawn_native",
+    ":libdawn_native_sources",
+    ":libdawn_wire",
+    "${dawn_root}/src/common",
+    "${dawn_root}/src/dawn:libdawn",
+    "third_party:glfw",
+    "third_party:gmock_and_gtest",
+  ]
+
+  sources = [
+    "src/tests/DawnTest.h",
+  ]
+
+  if (dawn_enable_vulkan) {
+    deps += [ "third_party:vulkan_headers" ]
+
+    if (is_linux) {
+      sources += [ "src/tests/white_box/VulkanImageWrappingTests.cpp" ]
+    }
+  }
+
+  libs = []
+}
+
+test("dawn_end2end_tests") {
+  configs += [ "${dawn_root}/src/common:dawn_internal" ]
+
+  deps = [
+    ":dawn_end2end_tests_sources",
+    ":dawn_utils",
+    ":dawn_white_box_tests_sources",
+    ":libdawn_native",
+    ":libdawn_wire",
+    "${dawn_root}/src/common",
+    "${dawn_root}/src/dawn:libdawn",
+    "third_party:glfw",
+    "third_party:gmock_and_gtest",
+  ]
+
+  sources = [
+    "src/tests/DawnTest.cpp",
+    "src/tests/DawnTest.h",
+  ]
+
+  libs = []
 
   # When building inside Chromium, use their gtest main function because it is
   # needed to run in swarming correctly.