Enable dav1d SIMD on more architectures

This commit is contained in:
Basilisk-Dev 2026-05-11 10:16:34 -04:00 • committed by wuggy
commit ad1bfb30d5
19 changed files with 402 additions and 20 deletions

View file

@ -61,6 +61,7 @@ set_config('HAVE_YASM', have_yasm)
# Until the YASM variable is not necessary in old-configure. # Until the YASM variable is not necessary in old-configure.
add_old_configure_assignment('YASM', have_yasm) add_old_configure_assignment('YASM', have_yasm)
<<<<<<< HEAD
# Android NDK # Android NDK
# ============================================================== # ==============================================================
@ -69,6 +70,45 @@ def compiling_android(compile_env, build_project, gonkdir, _):
return compile_env and (gonkdir or build_project in ('mobile/android', 'js')) return compile_env and (gonkdir or build_project in ('mobile/android', 'js'))
include('android-ndk.configure', when=compiling_android) include('android-ndk.configure', when=compiling_android)
=======
# nasm detection
# ==============================================================
nasm = check_prog('NASM', ['nasm'], allow_missing=True)
@depends_if(nasm)
@checking('nasm version')
def nasm_version(nasm):
version = check_cmd_output(
nasm, '-v',
onerror=lambda: die('Failed to get nasm version.')
).splitlines()[0].split()[2]
return Version(version)
@depends(nasm, nasm_version)
def have_nasm(nasm, version):
if nasm and version >= Version('2.14'):
return True
set_config('HAVE_NASM', have_nasm)
@depends(have_nasm, target)
def nasm_asflags(have_nasm, target):
if have_nasm:
asflags = {
('OSX', 'x86'): '-f macho32',
('OSX', 'x86_64'): '-f macho64',
('WINNT', 'x86'): '-f win32',
('WINNT', 'x86_64'): '-f win64',
}.get((target.os, target.cpu), None)
if asflags is None:
if target.cpu == 'x86':
asflags = '-f elf32'
elif target.cpu == 'x86_64':
asflags = '-f elf64'
return asflags
set_config('NASM_ASFLAGS', nasm_asflags)
>>>>>>> 2d3d34f993 (Enable dav1d SIMD on more architectures)
# MacOS deployment target version # MacOS deployment target version
# ============================================================== # ==============================================================

View file

@ -0,0 +1,79 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
SOURCES += [
'/media/libdav1d/src/src/arm/cpu.c',
]
if CONFIG['CPU_ARCH'] == 'aarch64':
SOURCES += [
'/media/libdav1d/src/src/arm/64/cdef.S',
'/media/libdav1d/src/src/arm/64/cdef16.S',
'/media/libdav1d/src/src/arm/64/filmgrain.S',
'/media/libdav1d/src/src/arm/64/filmgrain16.S',
'/media/libdav1d/src/src/arm/64/ipred.S',
'/media/libdav1d/src/src/arm/64/ipred16.S',
'/media/libdav1d/src/src/arm/64/itx.S',
'/media/libdav1d/src/src/arm/64/itx16.S',
'/media/libdav1d/src/src/arm/64/loopfilter.S',
'/media/libdav1d/src/src/arm/64/loopfilter16.S',
'/media/libdav1d/src/src/arm/64/looprestoration.S',
'/media/libdav1d/src/src/arm/64/looprestoration16.S',
'/media/libdav1d/src/src/arm/64/looprestoration_common.S',
'/media/libdav1d/src/src/arm/64/mc.S',
'/media/libdav1d/src/src/arm/64/mc16.S',
'/media/libdav1d/src/src/arm/64/mc16_sve.S',
'/media/libdav1d/src/src/arm/64/mc_dotprod.S',
'/media/libdav1d/src/src/arm/64/msac.S',
'/media/libdav1d/src/src/arm/64/refmvs.S',
]
else:
SOURCES += [
'/media/libdav1d/src/src/arm/32/cdef.S',
'/media/libdav1d/src/src/arm/32/cdef16.S',
'/media/libdav1d/src/src/arm/32/filmgrain.S',
'/media/libdav1d/src/src/arm/32/filmgrain16.S',
'/media/libdav1d/src/src/arm/32/ipred.S',
'/media/libdav1d/src/src/arm/32/ipred16.S',
'/media/libdav1d/src/src/arm/32/itx.S',
'/media/libdav1d/src/src/arm/32/itx16.S',
'/media/libdav1d/src/src/arm/32/loopfilter.S',
'/media/libdav1d/src/src/arm/32/loopfilter16.S',
'/media/libdav1d/src/src/arm/32/looprestoration.S',
'/media/libdav1d/src/src/arm/32/looprestoration16.S',
'/media/libdav1d/src/src/arm/32/looprestoration_common.S',
'/media/libdav1d/src/src/arm/32/mc.S',
'/media/libdav1d/src/src/arm/32/mc16.S',
'/media/libdav1d/src/src/arm/32/msac.S',
'/media/libdav1d/src/src/arm/32/refmvs.S',
]
ASFLAGS += [
'-I%s/media/libdav1d/config' % TOPSRCDIR,
'-I%s/media/libdav1d/src' % TOPSRCDIR,
]
if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['CLANG_CXX']:
ASFLAGS += [
'-no-integrated-as',
]
LOCAL_INCLUDES += [
'/media/libdav1d/config',
'/media/libdav1d/src',
'/media/libdav1d/src/include',
'/media/libdav1d/src/include/dav1d',
]
FINAL_LIBRARY = 'gkmedias'
ALLOW_COMPILER_WARNINGS = True
if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
CFLAGS += [
'-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-parameter',
]

View file

@ -0,0 +1,65 @@
; Mozilla build configuration for bundled dav1d x86 assembly.
%define private_prefix dav1d
%ifndef ARCH_X86_64
%ifidn __OUTPUT_FORMAT__,elf64
%define ARCH_X86_64 1
%elifidn __OUTPUT_FORMAT__,macho64
%define ARCH_X86_64 1
%elifidn __OUTPUT_FORMAT__,win64
%define ARCH_X86_64 1
%elifidn __OUTPUT_FORMAT__,x64
%define ARCH_X86_64 1
%else
%define ARCH_X86_64 0
%endif
%endif
%ifndef ARCH_X86_32
%if ARCH_X86_64
%define ARCH_X86_32 0
%else
%define ARCH_X86_32 1
%endif
%endif
%ifndef STACK_ALIGNMENT
%if ARCH_X86_64
%define STACK_ALIGNMENT 16
%elifidn __OUTPUT_FORMAT__,elf
%define STACK_ALIGNMENT 16
%elifidn __OUTPUT_FORMAT__,elf32
%define STACK_ALIGNMENT 16
%elifidn __OUTPUT_FORMAT__,macho
%define STACK_ALIGNMENT 16
%elifidn __OUTPUT_FORMAT__,macho32
%define STACK_ALIGNMENT 16
%else
%define STACK_ALIGNMENT 4
%endif
%endif
%ifndef PIC
%ifidn __OUTPUT_FORMAT__,win32
%define PIC 0
%else
%define PIC 1
%endif
%endif
%ifndef FORCE_VEX_ENCODING
%define FORCE_VEX_ENCODING 0
%endif
%ifidn __OUTPUT_FORMAT__,win32
%if ARCH_X86_32
%define PREFIX 1
%endif
%elifidn __OUTPUT_FORMAT__,macho
%define PREFIX 1
%elifidn __OUTPUT_FORMAT__,macho32
%define PREFIX 1
%elifidn __OUTPUT_FORMAT__,macho64
%define PREFIX 1
%endif

View file

@ -36,7 +36,10 @@
# define ARCH_LOONGARCH64 0 # define ARCH_LOONGARCH64 0
#endif #endif
#if defined(__powerpc64__) && defined(_LITTLE_ENDIAN) #if defined(__powerpc64__) && \
(defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || \
(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
# define ARCH_PPC64LE 1 # define ARCH_PPC64LE 1
#else #else
# define ARCH_PPC64LE 0 # define ARCH_PPC64LE 0
@ -58,13 +61,37 @@
#define CONFIG_16BPC 1 #define CONFIG_16BPC 1
#define CONFIG_LOG 0 #define CONFIG_LOG 0
#define CONFIG_MACOS_KPERF 0 #define CONFIG_MACOS_KPERF 0
#if ARCH_LOONGARCH64 #if ARCH_AARCH64 || ARCH_ARM || ARCH_LOONGARCH64 || ARCH_PPC64LE || ARCH_X86
# define HAVE_ASM 1 # define HAVE_ASM 1
#else #else
# define HAVE_ASM 0 # define HAVE_ASM 0
#endif #endif
#define TRIM_DSP_FUNCTIONS 0 #define TRIM_DSP_FUNCTIONS 0
#define HAVE_AS_FUNC 0
#if ARCH_AARCH64
# define HAVE_AS_ARCH_DIRECTIVE 1
# define AS_ARCH_LEVEL armv8-a
# define HAVE_AS_ARCHEXT_DOTPROD_DIRECTIVE 1
# define HAVE_AS_ARCHEXT_I8MM_DIRECTIVE 1
# define HAVE_AS_ARCHEXT_SVE_DIRECTIVE 1
# define HAVE_AS_ARCHEXT_SVE2_DIRECTIVE 1
# define HAVE_DOTPROD 1
# define HAVE_I8MM 1
# define HAVE_SVE 1
# define HAVE_SVE2 1
#else
# define HAVE_AS_ARCH_DIRECTIVE 0
# define HAVE_AS_ARCHEXT_DOTPROD_DIRECTIVE 0
# define HAVE_AS_ARCHEXT_I8MM_DIRECTIVE 0
# define HAVE_AS_ARCHEXT_SVE_DIRECTIVE 0
# define HAVE_AS_ARCHEXT_SVE2_DIRECTIVE 0
# define HAVE_DOTPROD 0
# define HAVE_I8MM 0
# define HAVE_SVE 0
# define HAVE_SVE2 0
#endif
#define HAVE_ALIGNED_ALLOC 0 #define HAVE_ALIGNED_ALLOC 0
#define HAVE_DLSYM 0 #define HAVE_DLSYM 0
#define HAVE_ELF_AUX_INFO 0 #define HAVE_ELF_AUX_INFO 0

View file

@ -66,6 +66,13 @@ bitdepth_sources = [
SOURCES += common_sources SOURCES += common_sources
SOURCES += bitdepth_sources SOURCES += bitdepth_sources
if CONFIG['CPU_ARCH'].startswith('x86'):
DIRS += ['x86']
elif CONFIG['CPU_ARCH'] in ('arm', 'aarch64'):
DIRS += ['arm']
elif CONFIG['CPU_ARCH'] == 'ppc64' and CONFIG['TARGET_ENDIANNESS'] == 'little':
DIRS += ['ppc']
if CONFIG['OS_TARGET'] == 'WINNT': if CONFIG['OS_TARGET'] == 'WINNT':
SOURCES += [ SOURCES += [
'/media/libdav1d/src/src/win32/thread.c', '/media/libdav1d/src/src/win32/thread.c',

View file

@ -0,0 +1,55 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
vsx_sources = [
'ppc_cdef_vsx_16bpc.c',
'ppc_cdef_vsx_8bpc.c',
'ppc_looprestoration_vsx_16bpc.c',
'ppc_looprestoration_vsx_8bpc.c',
]
pwr9_sources = [
'ppc_itx_pwr9_16bpc.c',
'ppc_itx_pwr9_8bpc.c',
'ppc_loopfilter_pwr9_16bpc.c',
'ppc_loopfilter_pwr9_8bpc.c',
'ppc_mc_pwr9_16bpc.c',
'ppc_mc_pwr9_8bpc.c',
]
SOURCES += [
'/media/libdav1d/src/src/ppc/cpu.c',
]
SOURCES += pwr9_sources
SOURCES += vsx_sources
for f in pwr9_sources:
SOURCES[f].flags += [
'-mcpu=power9',
]
for f in vsx_sources:
SOURCES[f].flags += [
'-maltivec',
'-mvsx',
]
LOCAL_INCLUDES += [
'/media/libdav1d/config',
'/media/libdav1d/src',
'/media/libdav1d/src/include',
'/media/libdav1d/src/include/dav1d',
]
FINAL_LIBRARY = 'gkmedias'
ALLOW_COMPILER_WARNINGS = True
if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
CFLAGS += [
'-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-parameter',
]

View file

@ -0,0 +1,3 @@
#define BITDEPTH 16
#define DAV1D_VSX 1
#include "../src/src/ppc/cdef_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 8
#define DAV1D_VSX 1
#include "../src/src/ppc/cdef_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 16
#define DAV1D_PWR9 1
#include "../src/src/ppc/itx_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 8
#define DAV1D_PWR9 1
#include "../src/src/ppc/itx_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 16
#define DAV1D_PWR9 1
#include "../src/src/ppc/loopfilter_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 8
#define DAV1D_PWR9 1
#include "../src/src/ppc/loopfilter_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 16
#define DAV1D_VSX 1
#include "../src/src/ppc/looprestoration_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 8
#define DAV1D_VSX 1
#include "../src/src/ppc/looprestoration_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 16
#define DAV1D_PWR9 1
#include "../src/src/ppc/mc_tmpl.c"

View file

@ -0,0 +1,3 @@
#define BITDEPTH 8
#define DAV1D_PWR9 1
#include "../src/src/ppc/mc_tmpl.c"

View file

@ -0,0 +1,79 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
SOURCES += [
'/media/libdav1d/src/src/x86/cdef16_avx2.asm',
'/media/libdav1d/src/src/x86/cdef16_avx512.asm',
'/media/libdav1d/src/src/x86/cdef16_sse.asm',
'/media/libdav1d/src/src/x86/cdef_avx2.asm',
'/media/libdav1d/src/src/x86/cdef_avx512.asm',
'/media/libdav1d/src/src/x86/cdef_sse.asm',
'/media/libdav1d/src/src/x86/cpuid.asm',
'/media/libdav1d/src/src/x86/cpu.c',
'/media/libdav1d/src/src/x86/filmgrain16_avx2.asm',
'/media/libdav1d/src/src/x86/filmgrain16_avx512.asm',
'/media/libdav1d/src/src/x86/filmgrain16_sse.asm',
'/media/libdav1d/src/src/x86/filmgrain_avx2.asm',
'/media/libdav1d/src/src/x86/filmgrain_avx512.asm',
'/media/libdav1d/src/src/x86/filmgrain_sse.asm',
'/media/libdav1d/src/src/x86/ipred16_avx2.asm',
'/media/libdav1d/src/src/x86/ipred16_avx512.asm',
'/media/libdav1d/src/src/x86/ipred16_sse.asm',
'/media/libdav1d/src/src/x86/ipred_avx2.asm',
'/media/libdav1d/src/src/x86/ipred_avx512.asm',
'/media/libdav1d/src/src/x86/ipred_sse.asm',
'/media/libdav1d/src/src/x86/itx16_avx2.asm',
'/media/libdav1d/src/src/x86/itx16_avx512.asm',
'/media/libdav1d/src/src/x86/itx16_sse.asm',
'/media/libdav1d/src/src/x86/itx_avx2.asm',
'/media/libdav1d/src/src/x86/itx_avx512.asm',
'/media/libdav1d/src/src/x86/itx_sse.asm',
'/media/libdav1d/src/src/x86/loopfilter16_avx2.asm',
'/media/libdav1d/src/src/x86/loopfilter16_avx512.asm',
'/media/libdav1d/src/src/x86/loopfilter16_sse.asm',
'/media/libdav1d/src/src/x86/loopfilter_avx2.asm',
'/media/libdav1d/src/src/x86/loopfilter_avx512.asm',
'/media/libdav1d/src/src/x86/loopfilter_sse.asm',
'/media/libdav1d/src/src/x86/looprestoration16_avx2.asm',
'/media/libdav1d/src/src/x86/looprestoration16_avx512.asm',
'/media/libdav1d/src/src/x86/looprestoration16_sse.asm',
'/media/libdav1d/src/src/x86/looprestoration_avx2.asm',
'/media/libdav1d/src/src/x86/looprestoration_avx512.asm',
'/media/libdav1d/src/src/x86/looprestoration_sse.asm',
'/media/libdav1d/src/src/x86/mc16_avx2.asm',
'/media/libdav1d/src/src/x86/mc16_avx512.asm',
'/media/libdav1d/src/src/x86/mc16_sse.asm',
'/media/libdav1d/src/src/x86/mc_avx2.asm',
'/media/libdav1d/src/src/x86/mc_avx512.asm',
'/media/libdav1d/src/src/x86/mc_sse.asm',
'/media/libdav1d/src/src/x86/msac.asm',
'/media/libdav1d/src/src/x86/pal.asm',
'/media/libdav1d/src/src/x86/refmvs.asm',
]
USE_NASM = True
ASFLAGS += [
'-I%s/media/libdav1d/config/' % TOPSRCDIR,
'-I%s/media/libdav1d/src/src/' % TOPSRCDIR,
]
LOCAL_INCLUDES += [
'/media/libdav1d/config',
'/media/libdav1d/src',
'/media/libdav1d/src/include',
'/media/libdav1d/src/include/dav1d',
]
FINAL_LIBRARY = 'gkmedias'
ALLOW_COMPILER_WARNINGS = True
if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
CFLAGS += [
'-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-parameter',
]

View file

@ -1803,6 +1803,17 @@ VARIABLES = {
If yasm is not available on this system, or does not support the If yasm is not available on this system, or does not support the
current target architecture, an error will be raised. current target architecture, an error will be raised.
"""), """),
'USE_NASM': (bool, bool,
"""Use the nasm assembler to assemble assembly files from SOURCES.
By default, the build will use the toolchain assembler, $(AS), to
assemble source files in assembly language (.s or .asm files). Setting
this value to ``True`` will cause it to use nasm instead.
If nasm is not available on this system, or does not support the
current target architecture, an error will be raised.
"""),
} }
# Sanity check: we don't want any variable above to have a list as storage type. # Sanity check: we don't want any variable above to have a list as storage type.

View file

@ -1005,24 +1005,13 @@ class TreeMetadataEmitter(LoggingMixin):
passthru.variables['AS'] = yasm passthru.variables['AS'] = yasm
passthru.variables['ASFLAGS'] = context.config.substs.get('YASM_ASFLAGS') passthru.variables['ASFLAGS'] = context.config.substs.get('YASM_ASFLAGS')
passthru.variables['AS_DASH_C_FLAG'] = '' passthru.variables['AS_DASH_C_FLAG'] = ''
if context.get('USE_NASM') is True:
for (symbol, cls) in [ nasm = context.config.substs.get('NASM')
('ANDROID_RES_DIRS', AndroidResDirs), if not nasm or not context.config.substs.get('HAVE_NASM'):
('ANDROID_EXTRA_RES_DIRS', AndroidExtraResDirs), raise SandboxValidationError('nasm 2.14 or later is not available', context)
('ANDROID_ASSETS_DIRS', AndroidAssetsDirs)]: passthru.variables['AS'] = nasm
paths = context.get(symbol) passthru.variables['ASFLAGS'] = context.config.substs.get('NASM_ASFLAGS')
if not paths: passthru.variables['AS_DASH_C_FLAG'] = ''
continue
for p in paths:
if isinstance(p, SourcePath) and not os.path.isdir(p.full_path):
raise SandboxValidationError('Directory listed in '
'%s is not a directory: \'%s\'' %
(symbol, p.full_path), context)
yield cls(context, paths)
android_extra_packages = context.get('ANDROID_EXTRA_PACKAGES')
if android_extra_packages:
yield AndroidExtraPackages(context, android_extra_packages)
if passthru.variables: if passthru.variables:
yield passthru yield passthru