hwdec-vaapi: detect AVX presence for the optimised version of copy_luma master
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 27 Mar 2024 15:19:18 +0000 (16:19 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 27 Mar 2024 15:19:18 +0000 (16:19 +0100)
hwdec-vaapi/src/lib.rs

index 40e14f445fc17e24793419ae76b82cc1d2b2eba0..cdc8b080a52f3df32df7fc5a920c80cda04f42a0 100644 (file)
@@ -283,8 +283,7 @@ pub struct VaapiH264Decoder {
     tb_den:         u32,
 }
 
-#[cfg(not(target_arch="x86_64"))]
-fn copy_luma(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, w: usize, h: usize) {
+fn copy_luma_default(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, w: usize, h: usize) {
     for (dline, sline) in dst.chunks_mut(dstride)
             .zip(src.chunks(sstride))
             .take(h) {
@@ -292,6 +291,10 @@ fn copy_luma(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, w: usiz
     }
 }
 #[cfg(not(target_arch="x86_64"))]
+fn copy_luma(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, w: usize, h: usize) {
+    copy_luma_default(dst, dstride, src, sstride, w, h);
+}
+#[cfg(not(target_arch="x86_64"))]
 fn deint_chroma(frm: NASimpleVideoFrame<u8>, src: &[u8], sstride: usize) {
     let mut uoff = frm.offset[1];
     let mut voff = frm.offset[2];
@@ -309,6 +312,10 @@ fn deint_chroma(frm: NASimpleVideoFrame<u8>, src: &[u8], sstride: usize) {
 use std::arch::asm;
 #[cfg(target_arch="x86_64")]
 fn copy_luma(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, w: usize, h: usize) {
+    if !is_x86_feature_detected!("avx") {
+        copy_luma_default(dst, dstride, src, sstride, w, h);
+        return;
+    }
     if dst.as_ptr().align_offset(32) == 0 && src.as_ptr().align_offset(32) == 0 &&
             (w % 64) == 0 && ((dstride | sstride) % 32) == 0 {
         unsafe {