diff --git a/.github/workflows/generate-binaries.yaml b/.github/workflows/generate-binaries.yaml index c1c6f44..c5ce4e6 100644 --- a/.github/workflows/generate-binaries.yaml +++ b/.github/workflows/generate-binaries.yaml @@ -3,7 +3,7 @@ name: Generate binaries on: [workflow_dispatch] env: - ISPC_VERSION: 1.20.0 + ISPC_VERSION: 1.30.0 jobs: build-linux: @@ -40,7 +40,7 @@ jobs: - uses: actions/upload-artifact@v6 with: - name: ISPC kernels Ubuntu + name: ISPC kernels Linux path: | src/ispc/downsample_ispc.rs src/ispc/lib*.a @@ -72,7 +72,7 @@ jobs: - uses: actions/upload-artifact@v6 with: - name: ISPC kernels macOS + name: ISPC kernels Apple path: | src/ispc/lib*.a @@ -84,7 +84,7 @@ jobs: with: submodules: true - - name: Clean old artifacts before upload globbing + - name: Clean old artifacts run: Remove-Item src/ispc/*.lib - name: Prepare Environment @@ -107,3 +107,16 @@ jobs: name: ISPC kernels Windows path: | src/ispc/*.lib + + merge: + runs-on: ubuntu-latest + needs: + - build-linux + - build-macos + - build-windows + steps: + - name: Merge Artifacts + uses: actions/upload-artifact/merge@v4 + with: + name: ISPC kernels for ispc-downsampler + delete-merged: true diff --git a/build.rs b/build.rs index 7d89461..518b6f0 100644 --- a/build.rs +++ b/build.rs @@ -12,14 +12,13 @@ fn compile_bindings() { TargetISA::SSE4i32x4, TargetISA::AVX1i32x8, TargetISA::AVX2i32x8, - TargetISA::AVX512KNLi32x16, - TargetISA::AVX512SKXi32x16, + TargetISA::AVX512SKXx16, ], "arm" | "aarch64" => vec![ // TargetISA::Neoni32x4, TargetISA::Neoni32x8, ], - x => panic!("Unsupported target architecture {}", x), + x => panic!("Unsupported target architecture {x}"), }; Config::new() diff --git a/examples/test.rs b/examples/test.rs index de47199..2a094cd 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -7,7 +7,7 @@ use std::time::Instant; fn main() { let res = load(Path::new("test_assets/square_test.png")); match res { - LoadResult::Error(str) => panic!("Image loading error: {}", str), + LoadResult::Error(str) => panic!("Image loading error: {str}"), LoadResult::ImageU8(img) => { assert!(!img.data.is_empty()); diff --git a/src/ispc/downsample_ispc.rs b/src/ispc/downsample_ispc.rs index e9f7910..8674ba0 100644 --- a/src/ispc/downsample_ispc.rs +++ b/src/ispc/downsample_ispc.rs @@ -1,6 +1,6 @@ #[allow(non_camel_case_types,dead_code,non_upper_case_globals,non_snake_case,improper_ctypes)] pub mod downsample_ispc { -/* automatically generated by rust-bindgen 0.69.4 */ +/* automatically generated by rust-bindgen 0.71.1 */ #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -9,52 +9,18 @@ pub struct WeightDimensions { pub src_start: f32, pub src_end: f32, } -#[test] -fn bindgen_test_layout_WeightDimensions() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 12usize, - concat!("Size of: ", stringify!(WeightDimensions)) - ); - assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(WeightDimensions)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).src_center) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(WeightDimensions), - "::", - stringify!(src_center) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).src_start) as usize - ptr as usize }, - 4usize, - concat!( - "Offset of field: ", - stringify!(WeightDimensions), - "::", - stringify!(src_start) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).src_end) as usize - ptr as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(WeightDimensions), - "::", - stringify!(src_end) - ) - ); -} -extern "C" { +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of WeightDimensions"][::std::mem::size_of::() - 12usize]; + ["Alignment of WeightDimensions"][::std::mem::align_of::() - 4usize]; + ["Offset of field: WeightDimensions::src_center"] + [::std::mem::offset_of!(WeightDimensions, src_center) - 0usize]; + ["Offset of field: WeightDimensions::src_start"] + [::std::mem::offset_of!(WeightDimensions, src_start) - 4usize]; + ["Offset of field: WeightDimensions::src_end"] + [::std::mem::offset_of!(WeightDimensions, src_end) - 8usize]; +}; +unsafe extern "C" { pub fn calculate_weights_lanczos( image_scale: f32, filter_scale: f32, @@ -62,7 +28,7 @@ extern "C" { weights: *mut f32, ); } -extern "C" { +unsafe extern "C" { pub fn scale_to_alpha_coverage( source_width: u32, source_height: u32, @@ -89,61 +55,16 @@ pub struct SourceImage { pub data: *const u8, pub pixel_stride: u32, } -#[test] -fn bindgen_test_layout_SourceImage() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(SourceImage)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(SourceImage)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).width) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(SourceImage), - "::", - stringify!(width) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).height) as usize - ptr as usize }, - 4usize, - concat!( - "Offset of field: ", - stringify!(SourceImage), - "::", - stringify!(height) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).data) as usize - ptr as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(SourceImage), - "::", - stringify!(data) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).pixel_stride) as usize - ptr as usize }, - 16usize, - concat!( - "Offset of field: ", - stringify!(SourceImage), - "::", - stringify!(pixel_stride) - ) - ); -} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of SourceImage"][::std::mem::size_of::() - 24usize]; + ["Alignment of SourceImage"][::std::mem::align_of::() - 8usize]; + ["Offset of field: SourceImage::width"][::std::mem::offset_of!(SourceImage, width) - 0usize]; + ["Offset of field: SourceImage::height"][::std::mem::offset_of!(SourceImage, height) - 4usize]; + ["Offset of field: SourceImage::data"][::std::mem::offset_of!(SourceImage, data) - 8usize]; + ["Offset of field: SourceImage::pixel_stride"] + [::std::mem::offset_of!(SourceImage, pixel_stride) - 16usize]; +}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct DownsampledImage { @@ -152,143 +73,49 @@ pub struct DownsampledImage { pub data: *mut u8, pub pixel_stride: u32, } -#[test] -fn bindgen_test_layout_DownsampledImage() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(DownsampledImage)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(DownsampledImage)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).width) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(DownsampledImage), - "::", - stringify!(width) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).height) as usize - ptr as usize }, - 4usize, - concat!( - "Offset of field: ", - stringify!(DownsampledImage), - "::", - stringify!(height) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).data) as usize - ptr as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(DownsampledImage), - "::", - stringify!(data) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).pixel_stride) as usize - ptr as usize }, - 16usize, - concat!( - "Offset of field: ", - stringify!(DownsampledImage), - "::", - stringify!(pixel_stride) - ) - ); -} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of DownsampledImage"][::std::mem::size_of::() - 24usize]; + ["Alignment of DownsampledImage"][::std::mem::align_of::() - 8usize]; + ["Offset of field: DownsampledImage::width"] + [::std::mem::offset_of!(DownsampledImage, width) - 0usize]; + ["Offset of field: DownsampledImage::height"] + [::std::mem::offset_of!(DownsampledImage, height) - 4usize]; + ["Offset of field: DownsampledImage::data"] + [::std::mem::offset_of!(DownsampledImage, data) - 8usize]; + ["Offset of field: DownsampledImage::pixel_stride"] + [::std::mem::offset_of!(DownsampledImage, pixel_stride) - 16usize]; +}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct SampleWeights { pub vertical_weights: *const WeightCollection, pub horizontal_weights: *const WeightCollection, } -#[test] -fn bindgen_test_layout_SampleWeights() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(SampleWeights)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(SampleWeights)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).vertical_weights) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(SampleWeights), - "::", - stringify!(vertical_weights) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).horizontal_weights) as usize - ptr as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(SampleWeights), - "::", - stringify!(horizontal_weights) - ) - ); -} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of SampleWeights"][::std::mem::size_of::() - 16usize]; + ["Alignment of SampleWeights"][::std::mem::align_of::() - 8usize]; + ["Offset of field: SampleWeights::vertical_weights"] + [::std::mem::offset_of!(SampleWeights, vertical_weights) - 0usize]; + ["Offset of field: SampleWeights::horizontal_weights"] + [::std::mem::offset_of!(SampleWeights, horizontal_weights) - 8usize]; +}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct DownsamplingContext { pub weights: SampleWeights, pub scratch_space: *mut u8, } -#[test] -fn bindgen_test_layout_DownsamplingContext() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(DownsamplingContext)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(DownsamplingContext)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).weights) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(DownsamplingContext), - "::", - stringify!(weights) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).scratch_space) as usize - ptr as usize }, - 16usize, - concat!( - "Offset of field: ", - stringify!(DownsamplingContext), - "::", - stringify!(scratch_space) - ) - ); -} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of DownsamplingContext"][::std::mem::size_of::() - 24usize]; + ["Alignment of DownsamplingContext"][::std::mem::align_of::() - 8usize]; + ["Offset of field: DownsamplingContext::weights"] + [::std::mem::offset_of!(DownsamplingContext, weights) - 0usize]; + ["Offset of field: DownsamplingContext::scratch_space"] + [::std::mem::offset_of!(DownsamplingContext, scratch_space) - 16usize]; +}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct WeightCollection { @@ -296,59 +123,25 @@ pub struct WeightCollection { pub weight_counts: *const u32, pub values: *const *const f32, } -#[test] -fn bindgen_test_layout_WeightCollection() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(WeightCollection)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(WeightCollection)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).starts) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(WeightCollection), - "::", - stringify!(starts) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).weight_counts) as usize - ptr as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(WeightCollection), - "::", - stringify!(weight_counts) - ) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).values) as usize - ptr as usize }, - 16usize, - concat!( - "Offset of field: ", - stringify!(WeightCollection), - "::", - stringify!(values) - ) - ); -} -extern "C" { +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of WeightCollection"][::std::mem::size_of::() - 24usize]; + ["Alignment of WeightCollection"][::std::mem::align_of::() - 8usize]; + ["Offset of field: WeightCollection::starts"] + [::std::mem::offset_of!(WeightCollection, starts) - 0usize]; + ["Offset of field: WeightCollection::weight_counts"] + [::std::mem::offset_of!(WeightCollection, weight_counts) - 8usize]; + ["Offset of field: WeightCollection::values"] + [::std::mem::offset_of!(WeightCollection, values) - 16usize]; +}; +unsafe extern "C" { pub fn downsample_normal_map( src: *const SourceImage, dst: *mut DownsampledImage, normal_map_format: NormalMapFormat, ); } -extern "C" { +unsafe extern "C" { pub fn resample_with_cached_weights_3( src: *const SourceImage, dst: *mut DownsampledImage, @@ -356,7 +149,7 @@ extern "C" { ctx: *mut DownsamplingContext, ); } -extern "C" { +unsafe extern "C" { pub fn resample_with_cached_weights_4( src: *const SourceImage, dst: *mut DownsampledImage, @@ -364,7 +157,7 @@ extern "C" { ctx: *mut DownsamplingContext, ); } -extern "C" { +unsafe extern "C" { pub fn calculate_weight_dimensions( filter_scale: f32, src: u32, diff --git a/src/ispc/downsample_ispcaarch64-pc-windows-msvc.lib b/src/ispc/downsample_ispcaarch64-pc-windows-msvc.lib index 3b1e596..ec5f88e 100644 Binary files a/src/ispc/downsample_ispcaarch64-pc-windows-msvc.lib and b/src/ispc/downsample_ispcaarch64-pc-windows-msvc.lib differ diff --git a/src/ispc/downsample_ispcx86_64-pc-windows-msvc.lib b/src/ispc/downsample_ispcx86_64-pc-windows-msvc.lib index 88ef362..61bd6a8 100644 Binary files a/src/ispc/downsample_ispcx86_64-pc-windows-msvc.lib and b/src/ispc/downsample_ispcx86_64-pc-windows-msvc.lib differ diff --git a/src/ispc/libdownsample_ispcaarch64-apple-darwin.a b/src/ispc/libdownsample_ispcaarch64-apple-darwin.a index 2d596c4..c54299a 100644 Binary files a/src/ispc/libdownsample_ispcaarch64-apple-darwin.a and b/src/ispc/libdownsample_ispcaarch64-apple-darwin.a differ diff --git a/src/ispc/libdownsample_ispcaarch64-apple-ios.a b/src/ispc/libdownsample_ispcaarch64-apple-ios.a index 9d1505f..a92340d 100644 Binary files a/src/ispc/libdownsample_ispcaarch64-apple-ios.a and b/src/ispc/libdownsample_ispcaarch64-apple-ios.a differ diff --git a/src/ispc/libdownsample_ispcaarch64-linux-android.a b/src/ispc/libdownsample_ispcaarch64-linux-android.a index e416109..aea9124 100644 Binary files a/src/ispc/libdownsample_ispcaarch64-linux-android.a and b/src/ispc/libdownsample_ispcaarch64-linux-android.a differ diff --git a/src/ispc/libdownsample_ispcaarch64-unknown-linux-gnu.a b/src/ispc/libdownsample_ispcaarch64-unknown-linux-gnu.a index e416109..aea9124 100644 Binary files a/src/ispc/libdownsample_ispcaarch64-unknown-linux-gnu.a and b/src/ispc/libdownsample_ispcaarch64-unknown-linux-gnu.a differ diff --git a/src/ispc/libdownsample_ispcaarch64-unknown-linux-musl.a b/src/ispc/libdownsample_ispcaarch64-unknown-linux-musl.a index e416109..aea9124 100644 Binary files a/src/ispc/libdownsample_ispcaarch64-unknown-linux-musl.a and b/src/ispc/libdownsample_ispcaarch64-unknown-linux-musl.a differ diff --git a/src/ispc/libdownsample_ispcx86_64-apple-darwin.a b/src/ispc/libdownsample_ispcx86_64-apple-darwin.a index d6e89a1..8a1f710 100644 Binary files a/src/ispc/libdownsample_ispcx86_64-apple-darwin.a and b/src/ispc/libdownsample_ispcx86_64-apple-darwin.a differ diff --git a/src/ispc/libdownsample_ispcx86_64-unknown-linux-gnu.a b/src/ispc/libdownsample_ispcx86_64-unknown-linux-gnu.a index 985400b..c8c1876 100644 Binary files a/src/ispc/libdownsample_ispcx86_64-unknown-linux-gnu.a and b/src/ispc/libdownsample_ispcx86_64-unknown-linux-gnu.a differ diff --git a/src/ispc/libdownsample_ispcx86_64-unknown-linux-musl.a b/src/ispc/libdownsample_ispcx86_64-unknown-linux-musl.a index 985400b..c8c1876 100644 Binary files a/src/ispc/libdownsample_ispcx86_64-unknown-linux-musl.a and b/src/ispc/libdownsample_ispcx86_64-unknown-linux-musl.a differ