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

import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
import("//gpu/vulkan/features.gni")
import("//media/media_options.gni")
import("//ui/ozone/ozone.gni")

# See //content/BUILD.gn for how this works.
group("gpu") {
  visibility = [ "//content/*" ]  # This is an internal content API.

  if (is_component_build) {
    public_deps = [
      "//content",
    ]
  } else {
    public_deps = [
      ":gpu_sources",
    ]
  }
}

if (is_component_build) {
  link_target_type = "jumbo_source_set"
} else {
  link_target_type = "jumbo_static_library"
}

target(link_target_type, "gpu_sources") {
  # This is an internal content API. Code outside of the content "component"
  # (like content/test and content/shell) should depend on ":gpu" above.
  visibility = [ "//content/*" ]

  sources = [
    "gpu_child_thread.cc",
    "gpu_child_thread.h",
    "gpu_main.cc",
    "gpu_process.cc",
    "gpu_process.h",
    "gpu_sandbox_hook_linux.cc",
    "gpu_sandbox_hook_linux.h",
    "gpu_service_factory.cc",
    "gpu_service_factory.h",
    "in_process_gpu_thread.cc",
    "in_process_gpu_thread.h",
  ]

  configs += [ "//content:content_implementation" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//components/tracing",
    "//components/viz/service",
    "//content:export",
    "//content/child",
    "//content/common",
    "//content/common:mojo_bindings",
    "//content/public/child:child_sources",
    "//content/public/common:common_sources",
    "//gpu:gpu",
    "//gpu/ipc/common:command_buffer_traits",
    "//gpu/ipc/common:gpu_preferences_util",
    "//gpu/ipc/service",
    "//ipc",
    "//media:media_buildflags",
    "//media/gpu",
    "//media/mojo:buildflags",

    # TODO(jrummell): As //media/gpu/ipc/service is a source_set in a
    # component build, determine if it should not be included here.
    # http://crbug.com/702833.
    "//components/viz/service/main",
    "//media/gpu/ipc/service",
    "//media/mojo/clients:clients",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/mojom",
    "//services/shape_detection:lib",
    "//services/shape_detection/public/mojom",
    "//services/viz/privileged/interfaces",
    "//skia",
    "//third_party/angle:angle_gpu_info_util",
    "//ui/gfx/ipc",
    "//ui/gl",
    "//ui/gl/init",
    "//ui/latency/ipc",
  ]

  if (is_android) {
    deps += [ "//media" ]
  }

  if (is_linux) {
    deps += [ "//services/service_manager/zygote" ]
  }

  if (mojo_media_host == "gpu") {
    deps += [ "//media/mojo/services" ]
  }

  if (is_win) {
    configs += [
      "//third_party/khronos:khronos_headers",
      "//third_party/wtl:wtl_includes",
    ]
    libs = [ "setupapi.lib" ]
    deps += [ "//sandbox" ]
  }

  if (is_linux || is_mac) {
    deps += [ "//sandbox" ]
  }

  if (use_x11) {
    deps += [
      "//ui/events/platform/x11",
      "//ui/gfx/x",
    ]
  }

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }

  if (enable_vulkan) {
    deps += [ "//gpu/vulkan" ]
  }

  # Use DRI on desktop Linux builds.
  if (current_cpu != "s390x" && current_cpu != "ppc64" && is_desktop_linux &&
      (!is_chromecast || is_cast_desktop_build)) {
    configs += [ "//build/config/linux/dri" ]
  }
}
