chromium/gpu/vulkan/BUILD.gn

# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/buildflag_header.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//build_overrides/wayland.gni")
import("//testing/test.gni")
import("features.gni")

# Generate a buildflag header for compile-time checking of Vulkan support.
buildflag_header("buildflags") {
  header = "buildflags.h"
  flags = [ "ENABLE_VULKAN=$enable_vulkan" ]
}

if (enable_vulkan) {
  use_vulkan_xcb = ozone_platform_x11
  config("vulkan_config") {
    defines = [ "VK_NO_PROTOTYPES" ]
    if (use_vulkan_xcb) {
      defines += [ "USE_VULKAN_XCB" ]
    }
    if (ozone_platform_wayland && !use_system_libwayland) {
      configs = [ "//third_party/wayland:wayland_config" ]
    }
  }

  source_set("vulkan_function_pointers") {
    visibility = [
      ":vma_wrapper",
      ":vulkan",
    ]

    sources = [
      "vulkan_function_pointers.cc",
      "vulkan_function_pointers.h",
    ]

    public_configs = [ ":vulkan_config" ]

    configs += [ "//build/config/compiler:wexit_time_destructors" ]

    defines = [ "IS_VULKAN_IMPL" ]

    deps = [
      "//base",
      "//ui/gfx",
    ]

    public_deps = [ "//third_party/vulkan-headers/src:vulkan_headers" ]

    if (is_fuchsia) {
      sources += [ "fuchsia/vulkan_fuchsia_ext.h" ]
    }
  }

  source_set("vma_wrapper") {
    visibility = [ ":vulkan" ]

    sources = [
      "vma_wrapper.cc",
      "vma_wrapper.h",
    ]

    defines = [ "IS_VULKAN_IMPL" ]

    configs += [ "//build/config/compiler:wexit_time_destructors" ]

    deps = [
      ":vulkan_function_pointers",
      "//base",
      "//third_party/vulkan_memory_allocator",
      "//ui/gfx:gfx",
    ]
  }

  component("vulkan") {
    output_name = "vulkan_wrapper"

    sources = [
      "semaphore_handle.cc",
      "semaphore_handle.h",
      "vulkan_command_buffer.cc",
      "vulkan_command_buffer.h",
      "vulkan_command_pool.cc",
      "vulkan_command_pool.h",
      "vulkan_crash_keys.cc",
      "vulkan_crash_keys.h",
      "vulkan_cxx.h",
      "vulkan_device_queue.cc",
      "vulkan_device_queue.h",
      "vulkan_fence_helper.cc",
      "vulkan_fence_helper.h",
      "vulkan_image.cc",
      "vulkan_image.h",
      "vulkan_implementation.cc",
      "vulkan_implementation.h",
      "vulkan_instance.cc",
      "vulkan_instance.h",
      "vulkan_memory.cc",
      "vulkan_memory.h",
      "vulkan_surface.cc",
      "vulkan_surface.h",
      "vulkan_swap_chain.cc",
      "vulkan_swap_chain.h",
      "vulkan_util.cc",
      "vulkan_util.h",
    ]

    defines = [ "IS_VULKAN_IMPL" ]

    if (ozone_platform == "x11") {
      defines += [ "OZONE_PLATFORM_IS_X11" ]
    }

    configs += [ "//build/config/compiler:wexit_time_destructors" ]

    deps = [
      ":buildflags",
      "//base",
      "//build:chromeos_buildflags",
      "//components/crash/core/common:crash_key",
      "//gpu/ipc/common:vulkan_ycbcr_info",
      "//ui/base:ozone_buildflags",
      "//ui/gfx",
      "//ui/gl",
    ]

    public_deps = [
      ":vma_wrapper",
      ":vulkan_function_pointers",
      "//gpu/config:vulkan_info",
    ]

    data_deps = []

    if (is_posix) {
      sources += [ "vulkan_util_posix.cc" ]

      if (is_linux || is_chromeos) {
        sources += [ "vulkan_image_linux.cc" ]
      }
    }

    if (is_android) {
      sources += [ "vulkan_image_android.cc" ]
    }

    if (is_fuchsia) {
      sources += [ "vulkan_util_fuchsia.cc" ]
    }

    if (is_win) {
      sources += [
        "vulkan_image_win.cc",
        "vulkan_util_win32.cc",
      ]
    }

    if (use_ozone) {
      sources += [
        "drm_modifiers_filter_vulkan.cc",
        "drm_modifiers_filter_vulkan.h",
      ]

      deps += [ "//ui/ozone:drm_modifiers_filter" ]
    }

    if (is_chromeos_ash) {
      deps += [ "//ui/gfx/linux:drm" ]
    }

    if (is_fuchsia) {
      sources += [ "vulkan_image_fuchsia.cc" ]

      public_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/zx" ]

      data_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan" ]

      # VulkanInstance enables validation layer in Debug builds and when DCHECKs
      # are enabled in Release builds. In these cases the validation layer
      # libraries and configs need to be included in the generated Fuchsia
      # package.
      if (is_debug || dcheck_always_on) {
        data_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_khronos_validation" ]
      }
    }

    if (is_apple) {
      sources += [ "vulkan_image_mac.cc" ]
    }
  }

  static_library("test_support") {
    testonly = true
    sources = [ "tests/native_window.h" ]

    deps = [
      "//ui/base:features",
      "//ui/gfx",
      "//ui/gfx:native_widget_types",
    ]

    if (use_ozone) {
      sources += [ "tests/native_window.cc" ]
      deps += [
        "//ui/ozone",
        "//ui/platform_window",
      ]
    }

    if (is_win) {
      sources += [ "tests/native_window_win.cc" ]
    }

    if (is_android) {
      sources += [ "tests/native_window_android.cc" ]
      deps += [ "//ui/gl" ]
    }
  }

  # TODO(penghuang): support more platforms
  # https://crbug.com/1065499
  if (is_android || is_win || use_ozone) {
    test("vulkan_tests") {
      use_xvfb = use_xvfb_in_this_config

      sources = [
        "tests/basic_vulkan_test.cc",
        "tests/basic_vulkan_test.h",
        "tests/vulkan_test.cc",
        "tests/vulkan_tests_main.cc",

        # TODO(crbug.com/40781300): fix compile problem with the latest vulkan
        # headers.
        # "vulkan_cxx_unittest.cc",
        "vulkan_fence_helper_unittest.cc",
        "vulkan_image_unittest.cc",
      ]

      deps = [
        ":test_support",
        "//base:base",
        "//base/test:test_support",
        "//components/viz/common:vulkan_context_provider",
        "//gpu/ipc/service",
        "//gpu/vulkan/init",
        "//testing/gmock",
        "//testing/gtest",
        "//ui/events/platform",
        "//ui/gfx",
        "//ui/gfx:native_widget_types",
        "//ui/gfx:test_support",
        "//ui/gfx/geometry",
      ]

      if (is_android) {
        deps += [ "//ui/android:ui_java_test_support" ]
      }

      if (use_ozone) {
        sources += [ "drm_modifiers_filter_vulkan_unittest.cc" ]

        deps += [ "//ui/ozone" ]
      }
    }
  }
}