Reland "Move gn setup for vulkan library/headers into their own third_party directory."

This reverts commit 2c2a119f945eedaced4bf081347a53f05cf0c39c.

Reason for revert: Relanding with fixes

Original change's description:
> Revert "Move gn setup for vulkan library/headers into their own third_party directory."
> 
> This reverts commit 477094250cd55a38d4d796ab6c50eb57bdba65e1.
> 
> Reason for revert:
> I think we know this broke the MoltenVK bots.  It also appears to have broken the Fuchsia roll: https://logs.chromium.org/v/?s=fuchsia%2Fbuildbucket%2Fcr-buildbucket.appspot.com%2F8945885190914943680%2F%2B%2Fsteps%2Fbuild%2F0%2Fsteps%2Fbuild_fuchsia%2F0%2Fsteps%2Fgn_gen%2F0%2Fstdout
> 
> Original change's description:
> > Move gn setup for vulkan library/headers into their own third_party directory.
> > 
> > Bug: skia:
> > Change-Id: I4605f0d962271efb77bf3c17f1b0daaaddfb51c8
> > Reviewed-on: https://skia-review.googlesource.com/128540
> > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > Reviewed-by: Mike Klein <mtklein@google.com>
> > Reviewed-by: Ben Wagner <bungeman@google.com>
> 
> TBR=egdaniel@google.com,mtklein@google.com,bungeman@google.com
> 
> Change-Id: I6e41d98e39883eff34424a2f352b0c8adec178db
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:
> Reviewed-on: https://skia-review.googlesource.com/129444
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Mike Klein <mtklein@google.com>

Bug: skia:
Change-Id: I26b4b1f7196dd1bd8bf2e7641ef741c90c742c81
Reviewed-on: https://skia-review.googlesource.com/129445
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 65b7399..4b907e1 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -43,9 +43,6 @@
   skia_enable_spirv_validation = is_skia_dev_build && is_debug
   skia_enable_tools = is_skia_dev_build
   skia_enable_vulkan_debug_layers = is_skia_dev_build && is_debug
-  skia_vulkan_header = ""
-  skia_vulkan_sdk = getenv("VULKAN_SDK")
-  skia_moltenvk_path = ""
   skia_qt_path = getenv("QT_PATH")
   skia_compile_processors = false
   skia_generate_workarounds = false
@@ -71,7 +68,8 @@
   } else if (is_fuchsia) {
     skia_use_vulkan = fuchsia_use_vulkan
   } else {
-    skia_use_vulkan = skia_vulkan_sdk != "" || skia_moltenvk_path != ""
+    skia_use_vulkan = (defined(skia_vulkan_sdk) && skia_vulkan_sdk != "") ||
+                      (defined(skia_moltenvk_path) && skia_moltenvk_path != "")
   }
 
   if (is_ios) {
@@ -79,17 +77,6 @@
     skia_ios_profile = "Google Development"
   }
 }
-declare_args() {
-  skia_tools_vulkan_header_dir = ""
-  if (skia_use_vulkan) {
-    # When buliding on Android we get the header via the NDK so no need for any extra path.
-    if (is_fuchsia) {
-      skia_tools_vulkan_header_dir = "$fuchsia_vulkan_sdk/include"
-    } else if (is_linux || is_win) {
-      skia_tools_vulkan_header_dir = "$skia_vulkan_sdk/include"
-    }
-  }
-}
 
 if (defined(skia_settings)) {
   import(skia_settings)
@@ -130,9 +117,6 @@
 # Skia public API, generally provided by :skia.
 config("skia_public") {
   include_dirs = skia_public_includes
-  if (skia_tools_vulkan_header_dir != "") {
-    include_dirs += [ skia_tools_vulkan_header_dir ]
-  }
   defines = []
   if (is_component_build) {
     defines += [ "SKIA_DLL" ]
@@ -224,32 +208,6 @@
   defines = [ "SKIA_IMPLEMENTATION=1" ]
 }
 
-config("moltenvk") {
-  if (is_ios) {
-    moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/iOS"
-  } else {
-    moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/macOS"
-  }
-  cflags = [
-    "-F$moltenvk_framework_path",
-    "-isystem$skia_moltenvk_path/MoltenVK/include",  # for <vulkan/vulkan.h>
-  ]
-  ldflags = [ "-F$moltenvk_framework_path" ]
-  libs = [
-    "MoltenVK.framework",
-    "Metal.framework",
-    "IOSurface.framework",
-    "QuartzCore.framework",
-    "Foundation.framework",
-  ]
-  if (is_ios) {
-    libs += [ "UIKit.framework" ]
-  } else {
-    libs += [ "IOKit.framework" ]
-  }
-  defines = [ "SK_MOLTENVK" ]
-}
-
 skia_library_configs = [
   ":skia_public",
   ":skia_private",
@@ -401,6 +359,7 @@
                              "*",
                              [
                                "public_defines",
+                               "public_deps",
                                "deps",
                                "libs",
                                "sources",
@@ -622,6 +581,7 @@
   }
   public_defines = []
   public_configs = []
+  public_deps = []
 
   sources = skia_gpu_sources + skia_sksl_sources + skia_gpu_processor_outputs
 
@@ -657,22 +617,17 @@
   }
 
   if (skia_use_vulkan) {
-    public_defines += [ "SK_VULKAN" ]
+    # TODO: We should make this deps be //third_party/vulkan and then update clients to have a
+    # //third_party/vulkan directory in their trees so they can set up the vulkan library however
+    # they want. For example this would allow us to remove the fuchsia specific vulkan code in our
+    # vulkan files.
+    public_deps += [ "third_party/vulkan" ]
     sources += skia_vk_sources
     if (skia_enable_vulkan_debug_layers) {
       public_defines += [ "SK_ENABLE_VK_LAYERS" ]
     }
-    if (skia_vulkan_header != "") {
-      public_defines += [ "SK_VULKAN_HEADER=\"$skia_vulkan_header\"" ]
-    } else if (skia_moltenvk_path != "") {
-      public_defines += [ "SK_VULKAN_HEADER=<MoltenVK/mvk_vulkan.h>" ]
-    } else if (is_skia_dev_build) {
-      public_defines += [ "SK_VULKAN_HEADER=\"GrVulkanDefines.h\"" ]
-    }
-    if (skia_moltenvk_path != "") {
-      public_configs += [ ":moltenvk" ]
-    }
   }
+
   if (skia_use_legacy_gpu_pixel_ops) {
     public_defines += [ "SK_LEGACY_GPU_PIXEL_OPS" ]
   }
@@ -890,7 +845,6 @@
     ":fontmgr_empty",
     ":fontmgr_fontconfig",
     ":fontmgr_fuchsia",
-    ":gpu",
     ":heif",
     ":hsw",
     ":jpeg",
@@ -907,6 +861,12 @@
     ":xml",
   ]
 
+  # We need the public deps here for Vulkan. Our third_party/vulkan target sets some defines that
+  # need to get propagated up to the tools that depend on :skia and thus :gpu.
+  public_deps = [
+    ":gpu",
+  ]
+
   # This file (and all GN files in Skia) are designed to work with an
   # empty sources assignment filter; we handle all that explicitly.
   # We clear the filter here for clients who may have set up a global filter.
diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn
index 15b10ca..e5440b9 100644
--- a/gn/BUILDCONFIG.gn
+++ b/gn/BUILDCONFIG.gn
@@ -33,6 +33,9 @@
   win_toolchain_version = ""
 
   clang_win = ""
+
+  skia_vulkan_sdk = getenv("VULKAN_SDK")
+  skia_moltenvk_path = ""
 }
 declare_args() {
   is_debug = !is_official_build
diff --git a/third_party/vulkan/BUILD.gn b/third_party/vulkan/BUILD.gn
new file mode 100644
index 0000000..425ccda
--- /dev/null
+++ b/third_party/vulkan/BUILD.gn
@@ -0,0 +1,69 @@
+# Copyright 2018 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+if (is_fuchsia) {
+  import("//build/vulkan/config.gni")
+}
+
+declare_args() {
+  skia_vulkan_header = ""
+  skia_tools_vulkan_header_dir = ""
+
+  # When buliding on Android we get the header via the NDK so no need for any extra path.
+  if (is_fuchsia) {
+    skia_tools_vulkan_header_dir = "$fuchsia_vulkan_sdk/include"
+  } else if (is_linux || is_win) {
+    skia_tools_vulkan_header_dir = "$skia_vulkan_sdk/include"
+  }
+}
+
+config("moltenvk") {
+  if (is_ios) {
+    moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/iOS"
+  } else {
+    moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/macOS"
+  }
+  cflags = [
+    "-F$moltenvk_framework_path",
+    "-isystem$skia_moltenvk_path/MoltenVK/include",  # for <vulkan/vulkan.h>
+  ]
+  ldflags = [ "-F$moltenvk_framework_path" ]
+  libs = [
+    "MoltenVK.framework",
+    "Metal.framework",
+    "IOSurface.framework",
+    "QuartzCore.framework",
+    "Foundation.framework",
+  ]
+  if (is_ios) {
+    libs += [ "UIKit.framework" ]
+  } else {
+    libs += [ "IOKit.framework" ]
+  }
+  defines = [ "SK_MOLTENVK" ]
+}
+
+config("vulkan_config") {
+  include_dirs = []
+  configs = []
+
+  if (skia_tools_vulkan_header_dir != "") {
+    include_dirs += [ skia_tools_vulkan_header_dir ]
+  }
+  defines = [ "SK_VULKAN" ]
+  if (skia_vulkan_header != "") {
+    defines += [ "SK_VULKAN_HEADER=\"$skia_vulkan_header\"" ]
+  } else if (defined(is_skia_standalone) && is_skia_standalone &&
+             !is_official_build) {
+    defines += [ "SK_VULKAN_HEADER=\"GrVulkanDefines.h\"" ]
+  }
+  if (skia_moltenvk_path != "") {
+    configs += [ ":moltenvk" ]
+  }
+}
+
+source_set("vulkan") {
+  public_configs = [ ":vulkan_config" ]
+}
diff --git a/tools/gpu/vk/GrVulkanDefines.h b/tools/gpu/vk/GrVulkanDefines.h
index 2052341..78d0954 100644
--- a/tools/gpu/vk/GrVulkanDefines.h
+++ b/tools/gpu/vk/GrVulkanDefines.h
@@ -10,26 +10,29 @@
 
 #include "SkTypes.h"
 
-#if defined(SK_BUILD_FOR_WIN)
-#   if !defined(VK_USE_PLATFORM_WIN32_KHR)
-#      define VK_USE_PLATFORM_WIN32_KHR
-#   endif
-#elif defined(SK_BUILD_FOR_ANDROID)
-#   if !defined(VK_USE_PLATFORM_ANDROID_KHR)
-#      define VK_USE_PLATFORM_ANDROID_KHR
-#   endif
-#elif defined(SK_BUILD_FOR_UNIX)
-#   if !defined(VK_USE_PLATFORM_XCB_KHR)
-#      define VK_USE_PLATFORM_XCB_KHR
-#   endif
-#endif
+    #ifdef SK_MOLTENVK
+        #include <MoltenVk/mvk_vulkan.h>
+    #else
+        #if defined(SK_BUILD_FOR_WIN)
+        #   if !defined(VK_USE_PLATFORM_WIN32_KHR)
+        #      define VK_USE_PLATFORM_WIN32_KHR
+        #   endif
+        #elif defined(SK_BUILD_FOR_ANDROID)
+        #   if !defined(VK_USE_PLATFORM_ANDROID_KHR)
+        #      define VK_USE_PLATFORM_ANDROID_KHR
+        #   endif
+        #elif defined(SK_BUILD_FOR_UNIX)
+        #   if !defined(VK_USE_PLATFORM_XCB_KHR)
+        #      define VK_USE_PLATFORM_XCB_KHR
+        #   endif
+        #endif
 
-// We create our own function table and never directly call any functions via vk*(). So no need to
-// include the prototype functions.
-#if !defined(VK_NO_PROTOTYPES)
-#define VK_NO_PROTOTYPES
-#endif
+        // We create our own function table and never directly call any functions via vk*(). So no
+        // need to include the prototype functions.
+        #if !defined(VK_NO_PROTOTYPES)
+            #define VK_NO_PROTOTYPES
+        #endif
 
-#include <vulkan/vulkan.h> // IWYU pragma: export
-
+        #include <vulkan/vulkan.h> // IWYU pragma: export
+    #endif
 #endif