# 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/linux/pkg_config.gni")
import("//ui/ozone/ozone.gni")

declare_args() {
  use_mesa_platform_null = false
  use_drm_atomic = false
}

pkg_config("libdrm") {
  packages = [ "libdrm" ]
}

source_set("drm_common") {
  sources = [
    "common/drm_gpu_test_helper_inprocess.cc",
    "common/drm_util.cc",
    "common/drm_util.h",
    "common/inprocess_messages.cc",
    "common/inprocess_messages.h",
    "common/scoped_drm_types.cc",
    "common/scoped_drm_types.h",
    "gpu/crtc_controller.cc",
    "gpu/crtc_controller.h",
    "gpu/drm_buffer.cc",
    "gpu/drm_buffer.h",
    "gpu/drm_console_buffer.cc",
    "gpu/drm_console_buffer.h",
    "gpu/drm_device.cc",
    "gpu/drm_device.h",
    "gpu/drm_device_generator.cc",
    "gpu/drm_device_generator.h",
    "gpu/drm_device_manager.cc",
    "gpu/drm_device_manager.h",
    "gpu/drm_display.cc",
    "gpu/drm_display.h",
    "gpu/drm_gpu_display_manager.cc",
    "gpu/drm_gpu_display_manager.h",
    "gpu/drm_gpu_platform_support.cc",
    "gpu/drm_gpu_platform_support.h",
    "gpu/drm_gpu_platform_support_inprocess.cc",
    "gpu/drm_surface.cc",
    "gpu/drm_surface.h",
    "gpu/drm_surface_factory.cc",
    "gpu/drm_surface_factory.h",
    "gpu/drm_vsync_provider.cc",
    "gpu/drm_vsync_provider.h",
    "gpu/drm_window.cc",
    "gpu/drm_window.h",
    "gpu/hardware_display_controller.cc",
    "gpu/hardware_display_controller.h",
    "gpu/hardware_display_plane.cc",
    "gpu/hardware_display_plane.h",
    "gpu/hardware_display_plane_manager.cc",
    "gpu/hardware_display_plane_manager.h",
    "gpu/hardware_display_plane_manager_legacy.cc",
    "gpu/hardware_display_plane_manager_legacy.h",
    "gpu/overlay_plane.cc",
    "gpu/overlay_plane.h",
    "gpu/page_flip_request.cc",
    "gpu/page_flip_request.h",
    "gpu/scanout_buffer.h",
    "gpu/screen_manager.cc",
    "gpu/screen_manager.h",
    "host/channel_observer.h",
    "host/drm_cursor.cc",
    "host/drm_cursor.h",
    "host/drm_device_handle.cc",
    "host/drm_device_handle.h",
    "host/drm_display_host.cc",
    "host/drm_display_host.h",
    "host/drm_display_host_manager.cc",
    "host/drm_display_host_manager.h",
    "host/drm_gpu_platform_support_host.cc",
    "host/drm_gpu_platform_support_host.h",
    "host/drm_gpu_platform_support_host_inprocess.cc",
    "host/drm_native_display_delegate.cc",
    "host/drm_native_display_delegate.h",
    "host/drm_overlay_candidates_host.cc",
    "host/drm_overlay_candidates_host.h",
    "host/drm_overlay_manager.cc",
    "host/drm_overlay_manager.h",
    "host/drm_window_host.cc",
    "host/drm_window_host.h",
    "host/drm_window_host_manager.cc",
    "host/drm_window_host_manager.h",
    "mojo/drm_gpu_delegate.cc",
    "mojo/drm_gpu_delegate.h",
    "mojo/drm_gpu_impl.cc",
    "mojo/drm_gpu_impl.h",
    "mojo/drm_host_delegate.cc",
    "mojo/drm_host_delegate.h",
    "mojo/drm_host_impl.cc",
    "mojo/drm_host_impl.h",
    "mojo/drm_ipc_init_helper.cc",
  ]

  defines = [ "OZONE_IMPLEMENTATION" ]

  if (use_drm_atomic) {
    defines += [ "USE_DRM_ATOMIC" ]
    sources += [
      "gpu/hardware_display_plane_atomic.cc",
      "gpu/hardware_display_plane_atomic.h",
      "gpu/hardware_display_plane_manager_atomic.cc",
      "gpu/hardware_display_plane_manager_atomic.h",
    ]
  }

  if (is_fnl) {
    defines += [ "FORCE_DISPATCH_TOUCH_EVENTS" ]
  }

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/common",
    "//mojo/converters/geometry",
    "//mojo/converters/ozone_drm_gpu",
    "//mojo/services/ozone_drm_gpu/interfaces",
    "//mojo/services/ozone_drm_host/interfaces",
    "//skia",
    "//ui/base",
    "//ui/display/types",
    "//ui/display/util",
    "//ui/events",
    "//ui/events/devices",
    "//ui/events/ozone:events_ozone",
    "//ui/events/ozone:events_ozone_evdev",
    "//ui/events/ozone:events_ozone_layout",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/ozone:ozone_base",
    "//ui/ozone:ozone_common_message_types",
    "//ui/platform_window",
  ]

  public_configs = [ ":libdrm" ]
}

if (ozone_platform_dri || ozone_platform_drm) {
  source_set("drm") {
    sources = [
      "ozone_platform_drm.cc",
      "ozone_platform_drm.h",
    ]

    deps = [
      ":drm_common",
      "//base",
      "//skia",
      "//ui/base",
      "//ui/events/ozone:events_ozone",
      "//ui/events/ozone:events_ozone_evdev",
      "//ui/events/ozone:events_ozone_layout",
      "//ui/ozone:ozone_base",
    ]
  }
}

if (ozone_platform_dri || ozone_platform_drm || ozone_platform_gbm) {
  source_set("drm_unittests") {
    testonly = true
    sources = [
      "gpu/drm_surface_unittest.cc",
      "gpu/drm_window_unittest.cc",
      "gpu/hardware_display_controller_unittest.cc",
      "gpu/hardware_display_plane_manager_unittest.cc",
      "gpu/screen_manager_unittest.cc",
      "test/mock_drm_device.cc",
      "test/mock_drm_device.h",
    ]

    deps = [
      "//base",
      "//mojo/public/c/system",
      "//skia",
      "//testing/gtest",
      "//ui/ozone",
      "//ui/ozone:ozone_base",
      "//ui/ozone/platform/drm:drm_common",
    ]

    public_configs = [ ":libdrm" ]
  }
}

if (ozone_platform_gbm) {
  pkg_config("libgbm") {
    packages = [ "gbm" ]
  }

  source_set("gbm") {
    sources = [
      "gpu/drm_dmabuf_pixmap.cc",
      "gpu/drm_dmabuf_pixmap.h",
      "gpu/gbm_buffer.cc",
      "gpu/gbm_buffer.h",
      "gpu/gbm_buffer_base.cc",
      "gpu/gbm_buffer_base.h",
      "gpu/gbm_device.cc",
      "gpu/gbm_device.h",
      "gpu/gbm_surface.cc",
      "gpu/gbm_surface.h",
      "gpu/gbm_surface_factory.cc",
      "gpu/gbm_surface_factory.h",
      "gpu/gbm_surfaceless.cc",
      "gpu/gbm_surfaceless.h",
      "ozone_platform_gbm.cc",
      "ozone_platform_gbm.h",
    ]

    deps = [
      ":drm_common",
      "//base",
      "//skia",
      "//ui/base",
      "//ui/events/ozone:events_ozone",
      "//ui/events/ozone:events_ozone_evdev",
      "//ui/events/ozone:events_ozone_layout",
      "//ui/gfx/geometry",
      "//ui/ozone:ozone_base",
    ]

    public_configs = [
      ":libgbm",
      "//third_party/khronos:khronos_headers",
    ]

    if (use_mesa_platform_null) {
      defines += [ "USE_MESA_PLATFORM_NULL" ]
    }
  }
}
