# 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/arm.gni")
import("//build/config/android/config.gni")
import("//third_party/libvpx/libvpx_srcs.gni")
import("//third_party/yasm/yasm_assemble.gni")

if (is_posix && !is_mac) {
  os_category = "linux"
} else {
  os_category = os
}

# Sets the architecture name for building libvpx.
if (cpu_arch == "x86") {
  cpu_arch_full = "ia32"
} else if (cpu_arch == "x64") {
  if (is_msan) {
    cpu_arch_full = "generic"
  } else {
    cpu_arch_full = "x64"
  }
} else if (cpu_arch == "arm") {
  if (arm_use_neon) {
    cpu_arch_full = "arm-neon"
  } else if (is_android) {
    cpu_arch_full = "arm-neon-cpu-detect"
  } else {
    cpu_arch_full = "arm"
  }
} else {
  cpu_arch_full = cpu_arch
}

config("libvpx_config") {
  include_dirs = [
    "//third_party/libvpx/source/config",
    "//third_party/libvpx/source/config/$os_category/$cpu_arch_full",
    "//third_party/libvpx/source/libvpx",
    "$root_gen_dir/third_party/libvpx", # Provides vpx_rtcd.h.
  ]
  cflags = [ "-Wno-unused-function", "-Wno-sign-compare" ]
}

executable("libvpx_obj_int_extract") {
  sources = [
    "//third_party/libvpx/source/libvpx/build/make/obj_int_extract.c"
  ]
  configs += [ ":libvpx_config" ]
  if (is_android_webview_build) {
    defines += [ "FORCE_PARSE_ELF" ]
    include_dirs += [ "//third_party/libvpx/include" ]
  }
}

# A library whose object files contain integers to be extracted.
static_library("libvpx_asm_offsets") {
  sources = [
    "//third_party/libvpx/source/libvpx/vp8/encoder/vp8_asm_enc_offsets.c",
    "//third_party/libvpx/source/libvpx/vpx_scale/vpx_scale_asm_offsets.c"
  ]
  configs += [ ":libvpx_config" ]
  if (is_clang) {
    cflags = [ "-Wno-unused-function" ]
  }
}

# This works only on POSIX to extract integer values from an object file.
template("obj_int_extract") {
  action(target_name) {
    script = "//third_party/libvpx/obj_int_extract.py"
    bin_label = "//third_party/libvpx($host_toolchain)"

    args = [
      "-e",
      "./" + rebase_path(get_label_info(bin_label, "root_out_dir") +
                         "/libvpx_obj_int_extract",
                         root_build_dir)
    ]

    if (cpu_arch == "arm") {
      args += [ "-f", "gas" ]
    } else {
      args += [ "-f", "rvds" ]
    }

    args += [
      "-b",
      rebase_path(get_label_info(":libvpx_asm_offsets", "target_out_dir")) +
          "/" + invoker.src_dir + "/libvpx_asm_offsets." +
          invoker.obj_file_root + ".o"
    ]
    out_file = "$target_gen_dir/" + invoker.obj_file_root + ".asm"
    args += [ "-o", rebase_path(out_file) ]
    outputs = [ out_file ]
    deps = [
      ":libvpx_asm_offsets",
      ":libvpx_obj_int_extract($host_toolchain)"
    ]
  }
}

obj_int_extract("gen_asm_offsets_vp8") {
  src_dir = "source/libvpx/vp8/encoder"
  obj_file_root = "vp8_asm_enc_offsets"
}

obj_int_extract("gen_asm_offsets_scale") {
  src_dir = "source/libvpx/vpx_scale"
  obj_file_root = "vpx_scale_asm_offsets"
}

if (cpu_arch == "x86" || cpu_arch == "x64") {
  yasm_assemble("libvpx_yasm") {
    if (cpu_arch == "x86") {
      sources = libvpx_srcs_x86_assembly
    } else if (cpu_arch == "x64") {
      sources = libvpx_srcs_x86_64_assembly
    }

    defines = [ "CHROMIUM" ]
    include_dirs = [
      "//third_party/libvpx/source/config/$os_category/$cpu_arch_full",
      "//third_party/libvpx/source/config",
     "//third_party/libvpx/source/libvpx",
      target_gen_dir
    ]
  }
}

static_library("libvpx_intrinsics_mmx") {
  configs += [ ":libvpx_config" ]
  cflags = [ "-mmmx" ]
  if (cpu_arch == "x86") {
    sources = libvpx_srcs_x86_mmx
  } else if (cpu_arch == "x64") {
    sources = libvpx_srcs_x86_64_mmx
  }
}

static_library("libvpx_intrinsics_sse2") {
  configs += [ ":libvpx_config" ]
  cflags = [ "-msse2" ]
  if (cpu_arch == "x86") {
    sources = libvpx_srcs_x86_sse2
  } else if (cpu_arch == "x64") {
    sources = libvpx_srcs_x86_64_sse2
  }
}

static_library("libvpx_intrinsics_ssse3") {
  configs += [ ":libvpx_config" ]
  cflags = [ "-mssse3" ]
  if (cpu_arch == "x86") {
    sources = libvpx_srcs_x86_ssse3
  } else if (cpu_arch == "x64") {
    sources = libvpx_srcs_x86_64_ssse3
  }
}

static_library("libvpx_intrinsics_sse4_1") {
  configs += [ ":libvpx_config" ]
  cflags = [ "-msse4.1" ]
  if (cpu_arch == "x86") {
    sources = libvpx_srcs_x86_sse4_1
  } else if (cpu_arch == "x64") {
    sources = libvpx_srcs_x86_64_sse4_1
  }
}

# TOOD(hclam): NEON intrinsics are not building on GN yet.
if (cpu_arch_full == "arm-neon-cpu-detect" && media_use_libvpx) {
  static_library("libvpx_intrinsics_neon") {
    configs += [ ":libvpx_config" ]
    cflags = [ "-mfpu=neon", "-mfloat-abi=softfp" ]
    sources = libvpx_srcs_arm_neon_cpu_detect_neon
  }
}

static_library("libvpx") {
  if (!is_debug && is_win && is_official_build) {
    configs -= [ "//build/config/compiler:optimize" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }

  if (cpu_arch == "x86") {
    sources = libvpx_srcs_x86
  } else if (cpu_arch == "x64") {
    if (is_msan) {
      sources = libvpx_srcs_generic
    } else {
      sources = libvpx_srcs_x86_64
    }
  } else if (cpu_arch == "mipsel") {
    sources = libvpx_srcs_generic
  } else if (cpu_arch == "arm") {
    if (arm_use_neon) {
      sources = libvpx_srcs_arm_neon
    } else if (is_android) {
      sources = libvpx_srcs_arm_neon_cpu_detect
    } else {
      sources = libvpx_srcs_arm
    }
  } else if (cpu_arch == "arm64") {
    sources = libvpx_srcs_arm64
  }

  deps = [
    ":gen_asm_offsets_vp8",
  ]
  configs += [ ":libvpx_config" ]
  if (cpu_arch == "x86" || (cpu_arch == "x64" && !is_msan)) {
    deps += [
      ":libvpx_yasm",
      ":libvpx_intrinsics_mmx",
      ":libvpx_intrinsics_sse2",
      ":libvpx_intrinsics_ssse3",
      ":libvpx_intrinsics_sse4_1",
    ]
  }
  if (is_android) {
    if (cpu_arch == "arm") {
      deps += [
# TODO(hclam): GN build doesn't compile NEON intrinsics because
# -mfpu=vfpv3-d16 needs to be removed.
#        ":libvpx_intrinsics_neon"
      ]
    }
    deps += [ "//third_party/android_tools:cpu_features" ]
  }
}
