# 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",
  ]
  cflags_cc = []
  assert(is_linux || is_win)  # TODO: is_mac?
  if (is_linux) {
    defines += [
      "ANGLE_USE_X11",
      "GL_APICALL=__attribute__((visibility(\"default\")))",
      "GL_API=__attribute__((visibility(\"default\")))",
      "EGLAPI=__attribute__((visibility(\"default\")))",
    ]
    cflags_cc += [ "-std=c++14" ]
  } else if (is_win) {
    defines += [
      "ANGLE_ENABLE_D3D11",
      "ANGLE_ENABLE_D3D9",
      "GL_APICALL=",
      "GL_API=",
      "EGLAPI=",
    ]

    # Allow noexcept, even though we build without exceptions
    cflags_cc += [ "/wd4577" ]
    if (is_clang) {
      # utilities.cpp includes an 'unsigned long' <= UINT_MAX check
      cflags_cc += [ "-Wno-tautological-constant-compare" ]
    }
  }
}

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_autogen.def" ]
  }
  if (is_linux) {
    libs += [
      "X11",
      "Xi",
      "Xext",
    ]
    sources += rebase_path(gles_gypi.libangle_gl_glx_sources +
                               gles_gypi.libangle_common_linux_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 +
                               gles_gypi.libangle_common_win_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" ]
  }
}
