| # Copyright 2023 The Cobalt Authors. All Rights Reserved. |
| |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import("dav1d_generated.gni") |
| |
| import("//build/config/compiler/compiler.gni") |
| import("//build/config/sanitizers/sanitizers.gni") |
| |
| assert(use_cobalt_customizations) |
| |
| if (is_starboard) { |
| import("//starboard/build/nasm_assemble.gni") |
| } else { |
| import("//third_party/nasm/nasm_assemble.gni") |
| } |
| |
| # MemorySanitizer can't handle assembly, https://crbug.com/928357. |
| enable_nasm = |
| nasm_exists && (current_cpu == "x86" || current_cpu == "x64") && !is_msan |
| |
| # Some older compilers can't handle AVX-512 instructions. |
| if (using_old_compiler) { |
| enable_nasm = false |
| } |
| |
| if (is_win) { |
| platform_config_root = "config/win/$current_cpu" |
| } else if (is_msan) { |
| assert(current_cpu == "x64" && (is_linux || is_chromeos), |
| "Only Linux X64 MSAN is supported") |
| platform_config_root = "config/linux-noasm/$current_cpu" |
| } else if (current_cpu == "riscv64" || current_cpu == "loong64" || |
| current_cpu == "mipsel" || current_cpu == "mips64el" || |
| current_cpu == "ppc64") { |
| platform_config_root = "config/linux-noasm/generic" |
| } else { |
| # Linux configuration files seem to work on Mac, so just reuse them. |
| if (enable_nasm) { |
| platform_config_root = "config/linux/$current_cpu" |
| } else { |
| platform_config_root = "config/linux-noasm/$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 (enable_nasm) { |
| 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 == "x64" || (is_linux && !is_android) || is_apple) { |
| stack_alignment = 16 |
| } else { |
| stack_alignment = 4 |
| } |
| } |
| } |
| |
| 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 (!is_android && !is_win) { |
| defines += [ |
| "HAVE_PTHREAD_GETAFFINITY_NP=1", |
| "HAVE_PTHREAD_SETAFFINITY_NP=1", |
| ] |
| } |
| |
| # 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 = [ |
| ".", |
| "include", |
| "include/dav1d", |
| platform_config_root, |
| ] |
| if (is_win && !is_clang) { |
| include_dirs += [ "include/compat/msvc" ] |
| } |
| } |
| |
| dav1d_copts = [ |
| "-D_FILE_OFFSET_BITS=64", |
| "-D_POSIX_C_SOURCE=200112L", |
| ] |
| |
| if (is_win) { |
| if (!is_clang) { |
| dav1d_copts += [ "/wd4028" ] |
| } |
| } else { |
| dav1d_copts += [ "-std=c99" ] |
| if (is_mac || is_ios) { |
| dav1d_copts += [ "-D_DARWIN_C_SOURCE" ] |
| } |
| if (is_linux || is_chromeos || is_android || current_os == "aix") { |
| if (!is_clang) { |
| dav1d_copts += [ "-D_GNU_SOURCE" ] |
| } |
| } |
| } |
| |
| if (enable_nasm) { |
| nasm_assemble("dav1d_asm") { |
| sources = x86_asm_sources |
| |
| inputs = [ |
| "src/ext/x86/x86inc.asm", |
| "$platform_config_root/config.asm", |
| ] |
| |
| include_dirs = [ |
| "src/", |
| platform_config_root, |
| ] |
| |
| nasm_flags = [ |
| "-P", |
| rebase_path("$platform_config_root/config.asm", root_build_dir), |
| ] |
| |
| defines = [] |
| if (needs_stack_alignment) { |
| defines += [ "STACK_ALIGNMENT=$stack_alignment" ] |
| } |
| |
| # Necessary to ensure macOS symbols end up with a _ prefix. |
| if (is_mac || is_ios) { |
| defines += [ "PREFIX" ] |
| } |
| } |
| } |
| |
| source_set("dav1d_headers") { |
| configs += [ ":dav1d_config" ] |
| |
| sources = c_headers |
| } |
| |
| static_library("dav1d_8bit") { |
| configs += [ ":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" ] |
| |
| deps = [ ":dav1d_headers" ] |
| } |
| |
| static_library("dav1d_10bit") { |
| configs -= [ |
| # "//build/config/compiler:chromium_code", |
| |
| # Disable coverage for the 10 bit version to avoid confusing the |
| # instrumentation about which version of the library is being run. |
| # dav1d_10 bit was selected for this, as it's less used than dav1d_8bit, |
| # which still has coverage enabled. See crbug.com/1030350. |
| "//build/config/coverage:default_coverage", |
| ] |
| configs += [ ":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" ] |
| |
| deps = [ ":dav1d_headers" ] |
| } |
| |
| if (current_cpu == "x86" || current_cpu == "x64") { |
| static_library("dav1d_x86") { |
| sources = [ |
| "src/x86/cpu.c", |
| "src/x86/cpu.h", |
| ] |
| |
| configs += [ ":dav1d_config" ] |
| cflags = dav1d_copts |
| |
| deps = [ ":dav1d_headers" ] |
| allow_circular_includes_from = [ ":dav1d_headers" ] |
| } |
| } else if (current_cpu == "arm" || current_cpu == "arm64") { |
| static_library("dav1d_arm") { |
| sources = [ |
| "src/arm/cpu.c", |
| "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 += [ ":dav1d_config" ] |
| |
| # Necessary to ensure macOS symbols end up with a _ prefix. |
| if (is_mac || is_ios) { |
| defines = [ "PREFIX" ] |
| } |
| |
| cflags = dav1d_copts |
| |
| deps = [ ":dav1d_headers" ] |
| allow_circular_includes_from = [ ":dav1d_headers" ] |
| } |
| } |
| |
| static_library("dav1d") { |
| sources = c_sources |
| if (is_win) { |
| sources += [ "src/win32/thread.c" ] |
| } |
| |
| configs += [ ":dav1d_config" ] |
| cflags = dav1d_copts |
| |
| deps = [ |
| ":dav1d_10bit", |
| ":dav1d_8bit", |
| ":dav1d_headers", |
| ] |
| |
| 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" ] |
| } |
| } |