diff --git a/media/libdav1d/moz.yaml b/media/libdav1d/moz.yaml --- a/media/libdav1d/moz.yaml +++ b/media/libdav1d/moz.yaml @@ -18,15 +18,15 @@ # Usually different from repository url url: https://code.videolan.org/videolan/dav1d # Human-readable identifier for this version/release # Generally "version NNN", "tag SSS", "bookmark SSS" - release: cd5e415270285a58f48c1e9ec1a2dd024b9acf9f (2022-08-19T13:58:13.000-03:00). + release: 58b15237eef865b2673fc3eecf5a07735db32545 (2022-09-07T02:09:49.000+02:00). # Revision to pull in # Must be a long or short commit SHA (long preferred) - revision: cd5e415270285a58f48c1e9ec1a2dd024b9acf9f + revision: 58b15237eef865b2673fc3eecf5a07735db32545 # The package's license, where possible using the mnemonic from # https://spdx.org/licenses/ # Multiple licenses can be specified (as a YAML list) # A "LICENSE" file must exist containing the full license text diff --git a/media/libdav1d/vcs_version.h b/media/libdav1d/vcs_version.h --- a/media/libdav1d/vcs_version.h +++ b/media/libdav1d/vcs_version.h @@ -1,2 +1,2 @@ /* auto-generated, do not edit */ -#define DAV1D_VERSION "cd5e415270285a58f48c1e9ec1a2dd024b9acf9f" +#define DAV1D_VERSION "58b15237eef865b2673fc3eecf5a07735db32545" diff --git a/third_party/dav1d/src/thread_task.c b/third_party/dav1d/src/thread_task.c --- a/third_party/dav1d/src/thread_task.c +++ b/third_party/dav1d/src/thread_task.c @@ -190,17 +190,18 @@ f->frame_thread.entropy_progress = 0; } else { const int prog_sz = ((f->sbh + 31) & ~31) >> 5; if (prog_sz > f->frame_thread.prog_sz) { atomic_uint *const prog = realloc(f->frame_thread.frame_progress, - prog_sz * 2 * sizeof(*prog)); + 2 * prog_sz * sizeof(*prog)); if (!prog) return -1; f->frame_thread.frame_progress = prog; f->frame_thread.copy_lpf_progress = prog + prog_sz; f->frame_thread.prog_sz = prog_sz; } - memset(f->frame_thread.frame_progress, 0, prog_sz * 2 * sizeof(atomic_uint)); + memset(f->frame_thread.frame_progress, 0, prog_sz * sizeof(atomic_uint)); + memset(f->frame_thread.copy_lpf_progress, 0, prog_sz * sizeof(atomic_uint)); atomic_store(&f->frame_thread.deblock_progress, 0); } f->frame_thread.next_tile_row[pass & 1] = 0; Dav1dTask *t = &tasks[0]; diff --git a/third_party/dav1d/src/x86/looprestoration_avx512.asm b/third_party/dav1d/src/x86/looprestoration_avx512.asm --- a/third_party/dav1d/src/x86/looprestoration_avx512.asm +++ b/third_party/dav1d/src/x86/looprestoration_avx512.asm @@ -327,15 +327,15 @@ punpckhwd m18, m19 vpdpwssd m5, m18, m14 packuswb m2, m4 psrlw m2, 8 vpackuswb m2{k2}, m3, m5 - mova [dstq+r10], m2 - add r10, 64 - jl .hv_loop - mov t6, t5 - mov t5, t4 + movu [dstq+r10], m2 ; We don't have a separate 5-tap version so the 7-tap + add r10, 64 ; function is used for chroma as well, and in some + jl .hv_loop ; esoteric edge cases chroma dst pointers may only + mov t6, t5 ; have a 32-byte alignment despite having a width + mov t5, t4 ; larger than 32, so use an unaligned store here. mov t4, t3 mov t3, t2 mov t2, t1 mov t1, t0 mov t0, t6 @@ -377,11 +377,11 @@ punpckhwd m6, m7 vpdpwssd m3, m6, m14 packuswb m0, m2 psrlw m0, 8 vpackuswb m0{k2}, m1, m3 - mova [dstq+r10], m0 + movu [dstq+r10], m0 add r10, 64 jl .v_loop mov t6, t5 mov t5, t4 mov t4, t3 diff --git a/third_party/dav1d/tests/checkasm/checkasm.c b/third_party/dav1d/tests/checkasm/checkasm.c --- a/third_party/dav1d/tests/checkasm/checkasm.c +++ b/third_party/dav1d/tests/checkasm/checkasm.c @@ -119,19 +119,19 @@ static struct { CheckasmFunc *funcs; CheckasmFunc *current_func; CheckasmFuncVersion *current_func_ver; const char *current_test_name; - const char *bench_pattern; - size_t bench_pattern_len; int num_checked; int num_failed; int nop_time; unsigned cpu_flag; const char *cpu_flag_name; - const char *test_name; + const char *test_pattern; + const char *function_pattern; unsigned seed; + int bench; int bench_c; int verbose; int function_listing; int catch_signals; #if ARCH_X86_64 @@ -487,10 +487,25 @@ raise(s); } } #endif +/* Compares a string with a wildcard pattern. */ +static int wildstrcmp(const char *str, const char *pattern) { + const char *wild = strchr(pattern, '*'); + if (wild) { + const size_t len = wild - pattern; + if (strncmp(str, pattern, len)) return 1; + while (*++wild == '*'); + if (!*wild) return 0; + str += len; + while (*str && wildstrcmp(str, wild)) str++; + return !*str; + } + return strcmp(str, pattern); +} + /* Perform tests and benchmarks for the specified * cpu flag if supported by the host */ static void check_cpu_flag(const char *const name, unsigned flag) { const unsigned old_cpu_flag = state.cpu_flag; @@ -499,11 +514,11 @@ state.cpu_flag = dav1d_get_cpu_flags(); if (!flag || state.cpu_flag != old_cpu_flag) { state.cpu_flag_name = name; for (int i = 0; tests[i].func; i++) { - if (state.test_name && strcmp(tests[i].name, state.test_name)) + if (state.test_pattern && wildstrcmp(tests[i].name, state.test_pattern)) continue; xor128_srand(state.seed); state.current_test_name = tests[i].name; tests[i].func(); } @@ -534,37 +549,44 @@ int main(int argc, char *argv[]) { state.seed = get_seed(); while (argc > 1) { - if (!strncmp(argv[1], "--help", 6)) { + if (!strncmp(argv[1], "--help", 6) || !strcmp(argv[1], "-h")) { fprintf(stderr, "checkasm [options] \n" - " Numeric value to seed the rng\n" + " Numeric value to seed the rng\n" "Options:\n" - " --test= Test only \n" - " --bench= Test and benchmark the functions matching \n" - " --list-functions List available functions\n" - " --list-tests List available tests\n" - " --bench-c Benchmark the C-only functions\n" - " --verbose -v Print failures verbosely\n"); + " --test= Test only \n" + " --function= -f Test only the functions matching \n" + " --bench -b Benchmark the tested functions\n" + " --list-functions List available functions\n" + " --list-tests List available tests\n" + " --bench-c -c Benchmark the C-only functions\n" + " --verbose -v Print failures verbosely\n"); return 0; - } else if (!strncmp(argv[1], "--bench-c", 9)) { + } else if (!strcmp(argv[1], "--bench-c") || !strcmp(argv[1], "-c")) { state.bench_c = 1; - } else if (!strncmp(argv[1], "--bench", 7)) { + } else if (!strcmp(argv[1], "--bench") || !strcmp(argv[1], "-b")) { #ifndef readtime fprintf(stderr, "checkasm: --bench is not supported on your system\n"); return 1; #endif - if (argv[1][7] == '=') { - state.bench_pattern = argv[1] + 8; - state.bench_pattern_len = strlen(state.bench_pattern); - } else - state.bench_pattern = ""; + state.bench = 1; } else if (!strncmp(argv[1], "--test=", 7)) { - state.test_name = argv[1] + 7; + state.test_pattern = argv[1] + 7; + } else if (!strcmp(argv[1], "-t")) { + state.test_pattern = argc > 1 ? argv[2] : ""; + argc--; + argv++; + } else if (!strncmp(argv[1], "--function=", 11)) { + state.function_pattern = argv[1] + 11; + } else if (!strcmp(argv[1], "-f")) { + state.function_pattern = argc > 1 ? argv[2] : ""; + argc--; + argv++; } else if (!strcmp(argv[1], "--list-functions")) { state.function_listing = 1; } else if (!strcmp(argv[1], "--list-tests")) { for (int i = 0; tests[i].name; i++) printf("%s\n", tests[i].name); @@ -600,11 +622,11 @@ sigaction(SIGILL, &sa, NULL); sigaction(SIGSEGV, &sa, NULL); #endif #ifdef readtime - if (state.bench_pattern) { + if (state.bench) { static int testing = 0; checkasm_save_context(); if (!testing) { checkasm_set_signal_handler_state(1); testing = 1; @@ -656,11 +678,11 @@ state.num_failed, state.num_checked); ret = 1; } else { fprintf(stderr, "checkasm: all %d tests passed\n", state.num_checked); #ifdef readtime - if (state.bench_pattern) { + if (state.bench) { state.nop_time = measure_nop_time(); printf("nop: %d.%d\n", state.nop_time/10, state.nop_time%10); print_benchs(state.funcs); } #endif @@ -680,12 +702,15 @@ va_start(arg, name); const int name_length = vsnprintf(name_buf, sizeof(name_buf), name, arg); va_end(arg); - if (!func || name_length <= 0 || (size_t)name_length >= sizeof(name_buf)) + if (!func || name_length <= 0 || (size_t)name_length >= sizeof(name_buf) || + (state.function_pattern && wildstrcmp(name_buf, state.function_pattern))) + { return NULL; + } state.current_func = get_func(&state.funcs, name_buf); if (state.function_listing) /* Save function names without running tests */ return NULL; @@ -722,13 +747,11 @@ return ref; } /* Decide whether or not the current function needs to be benchmarked */ int checkasm_bench_func(void) { - return !state.num_failed && state.bench_pattern && - !strncmp(state.current_func->name, state.bench_pattern, - state.bench_pattern_len); + return !state.num_failed && state.bench; } /* Indicate that the current test has failed, return whether verbose printing * is requested. */ int checkasm_fail_func(const char *const msg, ...) {