# Copyright 2019 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("dav1d_generated.gni")

import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//third_party/nasm/nasm_assemble.gni")

# MemorySanitizer can't handle assembly, https://crbug.com/928357.
enable_nasm = (current_cpu == "x86" || current_cpu == "x64") && !is_msan

if (is_win) {
  platform_config_root = "config/win/$current_cpu"
} else if (is_msan) {
  assert(current_cpu == "x64" && is_linux, "Only Linux X64 MSAN is supported")
  platform_config_root = "config/linux-noasm/$current_cpu"
} else {
  # Linux configuration files seem to work on Mac, so just reuse them.
  platform_config_root = "config/linux/$current_cpu"
}

# Clang LTO doesn't respect stack alignment and clang-cl doesn't support setting
# the stack alignment, so we must use the platform's default alignment in those
# cases; https://crbug.com/928743.
if (current_cpu == "x86" || current_cpu == "x64") {
  if (use_thin_lto || is_win) {
    needs_stack_alignment = false
    # The defaults are stack_alignment=4 for x86 and stack_alignment=16 for x64.
  } else {
    # The compiler flags, as well as the stack alignment values, all mirror
    # upstream's meson.build setup:
    # https://chromium.googlesource.com/external/github.com/videolan/dav1d/+/master/meson.build
    needs_stack_alignment = true
    if (current_cpu == "x86") {
      stack_alignment = 16

      if (!is_clang) {
        # Values used by GCC.
        preferred_stack_boundary = 4
        incoming_stack_boundary = 2
      }
    } else if (current_cpu == "x64") {
      stack_alignment = 32

      if (!is_clang) {
        # Values used by GCC.
        preferred_stack_boundary = 5
        incoming_stack_boundary = 4
      }
    }

    if (is_clang) {
      stackalign_flag = "-mstack-alignment=$stack_alignment"
      stackrealign_flag = "-mstackrealign"
    } else {
      # Assume GCC for now.
      stackalign_flag = "-mpreferred-stack-boundary=$preferred_stack_boundary"
      stackrealign_flag = "-mincoming-stack-boundary=$incoming_stack_boundary"
    }
  }
} else {
  needs_stack_alignment = false
}

config("public_dav1d_config") {
  include_dirs = [ "version" ]

  # Disable internal dav1d logs in the official build to save storage.
  if (is_official_build) {
    defines = [ "CONFIG_LOG=0" ]
  } else {
    defines = [ "CONFIG_LOG=1" ]
  }

  if (needs_stack_alignment) {
    defines += [ "STACK_ALIGNMENT=$stack_alignment" ]
  }

  # Don't let dav1d export any symbols. Otherwise the verify_order step on macOS
  # can fail since these exports end up in the final Chromium binary.
  defines += [ "DAV1D_API=" ]
}

config("dav1d_config") {
  configs = [ ":public_dav1d_config" ]
  include_dirs = [
    "libdav1d",
    "libdav1d/include",
    "libdav1d/include/dav1d",
    platform_config_root,
  ]
}

dav1d_copts = [
  "-D_FILE_OFFSET_BITS=64",
  "-D_POSIX_C_SOURCE=200112L",
]

if (!is_win) {
  dav1d_copts += [ "-std=c99" ]
  if (needs_stack_alignment) {
    dav1d_copts += [ stackalign_flag ]
  }
}

if (enable_nasm) {
  nasm_assemble("dav1d_asm") {
    sources = x86_asm_sources

    inputs = [
      "libdav1d/src/ext/x86/x86inc.asm",
      "$platform_config_root/config.asm",
    ]

    include_dirs = [
      "libdav1d/src/",
      platform_config_root,
    ]

    nasm_flags = [
      "-P",
      rebase_path("$platform_config_root/config.asm", root_build_dir),
    ]

    if (needs_stack_alignment) {
      defines = [ "STACK_ALIGNMENT=$stack_alignment" ]
    }

    # Necessary to ensure macOS symbols end up with a _ prefix.
    if (is_mac) {
      defines += [ "PREFIX" ]
    }
  }
}

static_library("dav1d_entrypoints") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    ":dav1d_config",
  ]

  sources = entry_point_sources
  cflags = dav1d_copts
  if (is_win) {
    sources += [ "libdav1d/src/win32/thread.c" ]
  }

  if (needs_stack_alignment) {
    cflags += [ stackrealign_flag ]
  }
}

static_library("dav1d_8bit") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    ":dav1d_config",
  ]

  sources = template_sources
  if (current_cpu == "x86" || current_cpu == "x64") {
    sources += x86_template_sources
  } else if (current_cpu == "arm") {
    sources += arm_template_sources
  } else if (current_cpu == "arm64") {
    sources += arm_template_sources
  }

  cflags = dav1d_copts
  cflags += [ "-DBITDEPTH=8" ]
}

static_library("dav1d_10bit") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    ":dav1d_config",
  ]

  sources = template_sources
  if (current_cpu == "x86" || current_cpu == "x64") {
    sources += x86_template_sources
  } else if (current_cpu == "arm") {
    sources += arm_template_sources
  } else if (current_cpu == "arm64") {
    sources += arm_template_sources
  }

  cflags = dav1d_copts
  cflags += [ "-DBITDEPTH=16" ]
}

if (current_cpu == "x86" || current_cpu == "x64") {
  static_library("dav1d_x86") {
    sources = [
      "libdav1d/src/x86/cpu.c",
      "libdav1d/src/x86/cpu.h",
    ]
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      ":dav1d_config",
    ]
    cflags = dav1d_copts
  }
} else if (current_cpu == "arm" || current_cpu == "arm64") {
  static_library("dav1d_arm") {
    sources = [
      "libdav1d/src/arm/cpu.c",
      "libdav1d/src/arm/cpu.h",
    ]

    # These are not template based so should only be built once.
    if (current_cpu == "arm") {
      sources += arm32_asm_sources
    } else if (current_cpu == "arm64") {
      sources += arm64_asm_sources
    }

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      ":dav1d_config",
    ]

    cflags = dav1d_copts
  }
}

static_library("dav1d") {
  sources = c_sources

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    ":dav1d_config",
  ]
  cflags = dav1d_copts

  deps = [
    ":dav1d_10bit",
    ":dav1d_8bit",
    ":dav1d_entrypoints",
  ]

  public_configs = [ ":public_dav1d_config" ]

  if (current_cpu == "x86" || current_cpu == "x64") {
    deps += [ ":dav1d_x86" ]
    if (enable_nasm) {
      deps += [ ":dav1d_asm" ]
    }
  } else if (current_cpu == "arm" || current_cpu == "arm64") {
    deps += [ ":dav1d_arm" ]
  }
}
