# Copyright 2020 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/config/cast.gni")
import("//build/toolchain/toolchain.gni")

declare_args() {
  # Indicates if Ozone is enabled. Ozone is a low-level library layer for Linux
  # that does not require X11.
  use_ozone = is_chromeos || is_fuchsia || is_linux
}

declare_args() {
  # Ozone extra platforms file path. Can be overridden to build out of
  # tree ozone platforms.
  ozone_extra_path = "//build/config/ozone_extra.gni"

  # Select platforms automatically. Turn this off for manual control.
  ozone_auto_platforms = use_ozone

  # TODO(petermcneeley): Backwards compatiblity support for VM images.
  # Remove when deprecated. (https://crbug.com/1122009)
  ozone_platform_gbm = -1

  # Enable explicit apitrace (https://apitrace.github.io) loading.
  # This requires apitrace library with additional bindings.
  # See ChromeOS package for details:
  # https://chromium-review.googlesource.com/c/chromiumos/overlays/chromiumos-overlay/+/2659419
  # Chrome will not start without an apitrace.so library.
  # Trace will be saved to /tmp/gltrace.dat file by default. You can
  # override it at run time with TRACE_FILE=<path> environment variable.
  enable_opengl_apitrace = false
}

declare_args() {
  # The platform that will used at runtime by default. This can be overridden
  # with the command line flag --ozone-platform=<platform>.
  ozone_platform = ""

  # Compile the 'cast' platform.
  ozone_platform_cast = false

  # Compile the 'drm' platform.
  ozone_platform_drm = false

  # Compile the 'headless' platform.
  ozone_platform_headless = false

  # Compile the 'flatland' platform.
  ozone_platform_flatland = false

  # Compile the 'x11' platform.
  ozone_platform_x11 = false

  # Compile the 'wayland' platform.
  ozone_platform_wayland = false

  if (ozone_auto_platforms) {
    # Use headless as the default platform unless modified below.
    ozone_platform = "headless"
    ozone_platform_headless = true

    if (is_cast_audio_only) {
      # Just use headless for audio-only Cast platforms.
    } else if (is_castos) {
      # Enable the Cast ozone platform on all video CastOS builds.
      ozone_platform_cast = true

      # For visual desktop Chromecast builds, override the default "headless"
      # platform with --ozone-platform=x11.
      # NOTE: The CQ is one such case.
      if (target_os == "linux" &&
          (target_cpu == "x86" || target_cpu == "x64")) {
        ozone_platform_x11 = true
      } else {
        ozone_platform = "cast"
      }
    } else if (is_chromeos) {
      ozone_platform = "x11"
      ozone_platform_drm = true
      ozone_platform_x11 = true
    } else if (is_linux) {
      ozone_platform = "x11"
      ozone_platform_wayland = true
      ozone_platform_x11 = true
    } else if (is_fuchsia) {
      ozone_platform = "flatland"
      ozone_platform_flatland = true
    }
  }

  # TODO(petermcneeley): Backwards compatiblity support for VM images.
  # Remove when deprecated. (https://crbug.com/1122009)
  if (ozone_platform_gbm != -1) {
    ozone_platform_drm = ozone_platform_gbm
  }
}

import(ozone_extra_path)

_ozone_extra_directory = get_path_info(ozone_extra_path, "dir")

# Extra paths to add to targets visibility list.
ozone_external_platform_visibility = [ "$_ozone_extra_directory/*" ]

if (is_a_target_toolchain) {
  assert(
      use_ozone || !(ozone_platform_cast || ozone_platform_drm ||
                         ozone_platform_flatland || ozone_platform_headless ||
                         ozone_platform_x11 || ozone_platform_wayland),
      "Must set use_ozone to select ozone platforms")
}

# TODO(petermcneeley): Backwards compatiblity support for VM images.
# Remove when deprecated. (https://crbug.com/1122009)

assert(ozone_platform_gbm == -1 || ozone_platform_drm == ozone_platform_gbm)

ozone_platform_gbm = ozone_platform_drm

if (ozone_platform == "gbm") {
  ozone_platform = "drm"
}
