#[cfg(all(test, feature = "all"))]
use zvidlib_core::simd::test_lock;
#[doc(inline)]
pub use zvidlib_core::simd::{SimdIsa, active, available, detected, set_override};
#[must_use]
pub fn active_by_site() -> Vec<(&'static str, SimdIsa)> {
#[allow(unused_mut)]
let mut sites = Vec::new();
#[cfg(any(feature = "av1-decoder", feature = "av1-encoder"))]
sites.extend(zvidlib_av1::simd_sites());
#[cfg(feature = "vorbis-encoder")]
sites.extend(zvidlib_vorbis_encoder::simd_sites());
#[cfg(any(feature = "vp8-decoder", feature = "vp8-encoder"))]
sites.extend(zvidlib_vp8::simd_sites());
#[cfg(feature = "vp9-decoder")]
sites.extend(zvidlib_vp9_decoder::simd_sites());
#[cfg(feature = "vp9-encoder")]
sites.extend(zvidlib_vp9_encoder::simd_sites());
#[cfg(feature = "hevc-decoder")]
sites.extend(zvidlib_hevc_decoder::simd_sites());
#[cfg(all(feature = "hevc-encoder", not(target_arch = "wasm32")))]
sites.extend(zvidlib_hevc_encoder::simd_sites());
sites.extend(zvidlib_color::simd_sites());
#[cfg(feature = "vorbis-decoder")]
sites.extend(zvidlib_vorbis_decoder::simd_sites());
sites
}
#[cfg(all(test, feature = "all"))]
mod tests {
use super::*;
use super::test_lock as lock;
#[test]
#[cfg(not(target_arch = "wasm32"))]
fn pinning_scalar_reaches_every_dispatch_site() {
use zvidlib_av1::av1_intra_pred::{Av1IntraSimd, av1_intra_simd};
use zvidlib_av1::av1_mc::{McContext, SimdLevel, default_level};
use zvidlib_color::color_convert;
use zvidlib_color::colorconv;
use zvidlib_hevc_decoder::engine::{simd as hevc_simd, transform_simd};
use zvidlib_hevc_encoder::engine::encoder::{quant_simd, rdcost, recon_simd};
use zvidlib_vp9_encoder::simd as vp9_encode;
let _guard = lock();
set_override(Some(SimdIsa::Scalar));
assert_eq!(zvidlib_av1::av1_simd::active_isa(), SimdIsa::Scalar);
assert_eq!(av1_intra_simd(), Av1IntraSimd::Scalar);
assert_eq!(zvidlib_av1::av1_simd::coeff::active_isa(), SimdIsa::Scalar);
assert_eq!(
zvidlib_vorbis_encoder::vorbis_encoder::simd::active_isa(),
SimdIsa::Scalar
);
assert_eq!(default_level(), SimdLevel::Scalar);
assert_eq!(McContext::new().level(), SimdLevel::Scalar);
assert_eq!(zvidlib_vp8::simd::encode_isa(), SimdIsa::Scalar);
assert_eq!(zvidlib_vp8::simd::recon_isa(), SimdIsa::Scalar);
assert_eq!(zvidlib_vp8::simd::decode_isa(), SimdIsa::Scalar);
assert_eq!(zvidlib_vp9_decoder::vp9_simd::active_isa(), SimdIsa::Scalar);
assert_eq!(vp9_encode::isa(), vp9_encode::Isa::Scalar);
assert_eq!(hevc_simd::detected_isa(), hevc_simd::Isa::Scalar);
assert_eq!(transform_simd::detected(), transform_simd::Backend::Scalar);
assert_eq!(rdcost::isa(), rdcost::Isa::Scalar);
assert_eq!(recon_simd::isa(), recon_simd::Isa::Scalar);
assert_eq!(quant_simd::detected(), transform_simd::Backend::Scalar);
assert_eq!(colorconv::isa(), colorconv::Isa::Scalar);
assert_eq!(color_convert::detected_isa(), color_convert::Isa::Scalar);
assert_eq!(
zvidlib_color::yuv_to_rgba::detected_isa(),
zvidlib_color::yuv_to_rgba::Isa::Scalar
);
assert_eq!(
zvidlib_vorbis_decoder::vorbis_simd::active_isa(),
SimdIsa::Scalar
);
let checked = [
"av1_simd",
"av1_mc",
"av1_intra_pred",
"av1_coeff_ctx",
"vorbis_encode",
"vp8_encode",
"vp8_recon",
"vp8_decode",
"vp9_decode",
"vp9_encode",
"hevc_prediction_filters",
"hevc_transforms",
"hevc_rdcost",
"hevc_recon",
"hevc_fwd_transform_quant",
"hevc_colorconv",
"hevc_color_convert",
"yuv_to_rgba",
"vorbis_decode",
];
let sites: Vec<&str> = active_by_site().into_iter().map(|(site, _)| site).collect();
assert_eq!(sites, checked);
set_override(None);
}
#[test]
#[cfg(not(target_arch = "wasm32"))]
fn the_documented_site_table_lists_every_dispatch_site() {
let source = include_str!("simd.rs");
let table = source
.split_once("/// | Site | Kernels |")
.expect("site table")
.1;
let documented: Vec<&str> = table
.lines()
.skip(1)
.map(str::trim_start)
.take_while(|line| line.starts_with("///"))
.filter_map(|line| line.strip_prefix("/// | `"))
.filter_map(|row| row.split_once('`'))
.map(|(site, _)| site)
.collect();
let sites: Vec<&str> = active_by_site().into_iter().map(|(site, _)| site).collect();
assert_eq!(documented, sites);
}
#[test]
#[cfg(not(target_arch = "wasm32"))]
fn clearing_the_override_restores_per_site_detection() {
use zvidlib_av1::av1_intra_pred::{Av1IntraSimd, av1_intra_simd};
use zvidlib_av1::av1_mc::default_level;
use zvidlib_color::color_convert;
use zvidlib_color::colorconv;
use zvidlib_hevc_decoder::engine::{simd as hevc_simd, transform_simd};
use zvidlib_hevc_encoder::engine::encoder::{quant_simd, rdcost, recon_simd};
use zvidlib_vp9_encoder::simd as vp9_encode;
let _guard = lock();
set_override(Some(SimdIsa::Scalar));
set_override(None);
let vectorized = detected() != SimdIsa::Scalar;
assert_eq!(zvidlib_av1::av1_simd::active_isa(), detected());
assert_eq!(av1_intra_simd() != Av1IntraSimd::Scalar, vectorized);
assert_eq!(
zvidlib_av1::av1_simd::coeff::active_isa() != SimdIsa::Scalar,
vectorized
);
assert_eq!(
zvidlib_vorbis_encoder::vorbis_encoder::simd::active_isa(),
detected()
);
assert_eq!(
default_level() != zvidlib_av1::av1_mc::SimdLevel::Scalar,
vectorized
);
assert_eq!(zvidlib_vp8::simd::encode_isa(), detected());
assert_eq!(zvidlib_vp8::simd::recon_isa(), detected());
assert_eq!(zvidlib_vp8::simd::decode_isa(), detected());
assert_eq!(zvidlib_vp9_decoder::vp9_simd::active_isa(), detected());
assert_eq!(vp9_encode::isa() != vp9_encode::Isa::Scalar, vectorized);
assert_eq!(
hevc_simd::detected_isa() != hevc_simd::Isa::Scalar,
vectorized
);
assert_eq!(
transform_simd::detected() != transform_simd::Backend::Scalar,
vectorized
);
assert_eq!(rdcost::isa() != rdcost::Isa::Scalar, vectorized);
assert_eq!(recon_simd::isa() != recon_simd::Isa::Scalar, vectorized);
assert_eq!(
quant_simd::detected() != transform_simd::Backend::Scalar,
vectorized
);
assert_eq!(colorconv::isa() != colorconv::Isa::Scalar, vectorized);
assert_eq!(
color_convert::detected_isa() != color_convert::Isa::Scalar,
vectorized
);
assert_eq!(
zvidlib_color::yuv_to_rgba::detected_isa() != zvidlib_color::yuv_to_rgba::Isa::Scalar,
vectorized
);
assert_eq!(
zvidlib_vorbis_decoder::vorbis_simd::active_isa(),
detected()
);
let checked = [
"av1_simd",
"av1_mc",
"av1_intra_pred",
"av1_coeff_ctx",
"vorbis_encode",
"vp8_encode",
"vp8_recon",
"vp8_decode",
"vp9_decode",
"vp9_encode",
"hevc_prediction_filters",
"hevc_transforms",
"hevc_rdcost",
"hevc_recon",
"hevc_fwd_transform_quant",
"hevc_colorconv",
"hevc_color_convert",
"yuv_to_rgba",
"vorbis_decode",
];
let sites: Vec<&str> = active_by_site().into_iter().map(|(site, _)| site).collect();
assert_eq!(sites, checked);
}
#[test]
fn every_site_reports_the_pinned_instruction_set() {
let _guard = lock();
for isa in available() {
set_override(Some(isa));
for (site, site_isa) in active_by_site() {
assert_eq!(site_isa, isa, "site {site} did not follow the override");
}
}
set_override(None);
for (site, site_isa) in active_by_site() {
assert_eq!(
site_isa,
detected(),
"site {site} did not fall back to detection"
);
}
}
#[test]
fn the_legacy_av1_entry_point_delegates_to_the_shared_override() {
let _guard = lock();
zvidlib_av1::av1_simd::set_active_isa(Some(SimdIsa::Scalar));
assert_eq!(active(), SimdIsa::Scalar);
assert_eq!(zvidlib_av1::av1_simd::active_isa(), SimdIsa::Scalar);
zvidlib_av1::av1_simd::set_active_isa(None);
assert_eq!(active(), detected());
set_override(None);
}
}