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

declare_args() {
}

angle_root = "../externals/angle2"

import("../third_party.gni")

third_party("angle2") {
  public_include_dirs = [ "$angle_root/include" ]
  deps = [
    ":libEGL",
    ":libGLESv2",
  ]
}

compiler_gypi = exec_script("//gn/gypi_to_gn.py",
                            [ rebase_path("$angle_root/src/compiler.gypi") ],
                            "scope",
                            [])

gles_gypi = exec_script("//gn/gypi_to_gn.py",
                        [ rebase_path("$angle_root/src/libGLESv2.gypi") ],
                        "scope",
                        [])

config("common") {
  defines = [
    "ANGLE_ENABLE_ESSL",
    "ANGLE_ENABLE_GLSL",
    "ANGLE_ENABLE_HLSL",
    "ANGLE_ENABLE_OPENGL",
    "EGL_EGLEXT_PROTOTYPES",
    "GL_GLEXT_PROTOTYPES",
  ]
  include_dirs = [
    "$root_gen_dir/angle2",
    "$angle_root/include",
    "$angle_root/src",
    "$angle_root/src/common/third_party/base",
    "$angle_root/src/third_party/khronos",
  ]

  assert(is_linux || is_win)  # TODO: is_mac?
  if (is_linux) {
    defines += [
      "ANGLE_USE_X11",
      "GL_APICALL=__attribute__((visibility(\"default\")))",
      "EGLAPI=__attribute__((visibility(\"default\")))",
    ]
  } else if (is_win) {
    defines += [
      "ANGLE_ENABLE_D3D11",
      "ANGLE_ENABLE_D3D9",
      "GL_APICALL=",
      "EGLAPI=",
    ]
  }
}

copy("commit_id") {
  sources = [
    "$angle_root/src/commit.h",
  ]
  outputs = [
    "$root_gen_dir/angle2/id/commit.h",
  ]
}

shared_library("libGLESv2") {
  configs += [ ":common" ]
  configs -= [ "//gn:warnings" ]
  defines = [
    "LIBANGLE_IMPLEMENTATION",
    "LIBGLESV2_IMPLEMENTATION",
  ]
  deps = [
    ":commit_id",
  ]
  libs = []
  sources = rebase_path(
          compiler_gypi.angle_preprocessor_sources +
              compiler_gypi.angle_translator_sources +
              compiler_gypi.angle_translator_essl_sources +
              compiler_gypi.angle_translator_glsl_sources +
              compiler_gypi.angle_translator_hlsl_sources +
              gles_gypi.libangle_sources + gles_gypi.libangle_common_sources +
              gles_gypi.libangle_image_util_sources +
              gles_gypi.libglesv2_sources + gles_gypi.libangle_gl_sources,
          ".",
          "$angle_root/src")
  if (!is_win) {
    sources -= [ "$angle_root/src/libGLESv2/libGLESv2.def" ]
  }

  if (is_linux) {
    libs += [
      "X11",
      "Xi",
      "Xext",
    ]
    sources +=
        rebase_path(gles_gypi.libangle_gl_glx_sources, ".", "$angle_root/src") +
        [ "$angle_root/src/third_party/libXNVCtrl/NVCtrl.c" ]
  } else if (is_win) {
    defines += [
      # TODO: ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES
    ]
    sources += rebase_path(gles_gypi.libangle_gl_wgl_sources +
                               gles_gypi.libangle_d3d_shared_sources +
                               gles_gypi.libangle_d3d9_sources +
                               gles_gypi.libangle_d3d11_sources +
                               gles_gypi.libangle_d3d11_win32_sources,
                           ".",
                           "$angle_root/src")
    libs += [
      "d3d9.lib",
      "dxguid.lib",
      "gdi32.lib",
      "user32.lib",
    ]
    deps += [
      # TODO: copy_compiler_dll?
    ]
  }
}

shared_library("libEGL") {
  configs += [ ":common" ]
  configs -= [ "//gn:warnings" ]
  defines = [ "LIBEGL_IMPLEMENTATION" ]
  deps = [
    ":libGLESv2",
  ]
  sources = rebase_path(gles_gypi.libegl_sources, ".", "$angle_root/src")
  if (!is_win) {
    sources -= [ "$angle_root/src/libEGL/libEGL.def" ]
  }
}
