#![allow(clippy::all)] use core::hint::black_box; use iai_callgrind::{library_benchmark, library_benchmark_group, main}; use glam::{BVec3A, Mat2, Mat3A, Mat4, Quat, Vec2, Vec3A, Vec4}; #[cfg(feature = "scalar-math")] use glam::BVec4 as BVec4A; #[cfg(not(feature = "scalar-math"))] use glam::BVec4A; #[inline] fn mat2() -> Mat2 { black_box(Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0])) } #[inline] fn mat3a() -> Mat3A { black_box(Mat3A::from_cols_array(&[ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ])) } #[inline] fn mat4() -> Mat4 { black_box(Mat4::from_cols_array(&[ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, ])) } #[inline] fn quat() -> Quat { black_box(Quat::from_xyzw(0.0, 0.0, 0.0, 1.0)) } #[inline] fn vec2() -> Vec2 { black_box(Vec2::new(1.0, 2.0)) } #[inline] fn vec3a() -> Vec3A { black_box(Vec3A::new(1.0, 2.0, 3.0)) } #[inline] fn bvec3a() -> BVec3A { black_box(BVec3A::new(true, false, true)) } #[inline] fn vec4() -> Vec4 { black_box(Vec4::new(1.0, 2.0, 3.0, 4.0)) } #[inline] fn bvec4a() -> BVec4A { black_box(BVec4A::new(true, false, true, false)) } #[library_benchmark] #[bench::args(mat2())] fn mat2_determinant(m: Mat2) -> f32 { black_box(m.determinant()) } #[library_benchmark] #[bench::args(mat2())] fn mat2_inverse(m: Mat2) -> Mat2 { black_box(m.inverse()) } #[library_benchmark] #[bench::args(mat2())] fn mat2_transpose(m: Mat2) -> Mat2 { black_box(m.transpose()) } #[library_benchmark] #[bench::args(mat2(), mat2())] fn mat2_mul_mat2(m1: Mat2, m2: Mat2) -> Mat2 { black_box(m1 * m2) } #[library_benchmark] #[bench::args(mat2(), vec2())] fn mat2_mul_vec2(m: Mat2, v: Vec2) -> Vec2 { black_box(m * v) } #[library_benchmark] #[bench::args(mat3a())] fn mat3a_determinant(m: Mat3A) -> f32 { black_box(m.determinant()) } #[library_benchmark] #[bench::args(mat3a())] fn mat3a_inverse(m: Mat3A) -> Mat3A { black_box(m.inverse()) } #[library_benchmark] #[bench::args(mat3a())] fn mat3a_transpose(m: Mat3A) -> Mat3A { black_box(m.transpose()) } #[library_benchmark] #[bench::args(mat3a(), mat3a())] fn mat3a_mul_mat3a(m1: Mat3A, m2: Mat3A) -> Mat3A { black_box(m1 * m2) } #[library_benchmark] #[bench::args(mat3a(), vec3a())] fn mat3a_mul_vec3a(m: Mat3A, v: Vec3A) -> Vec3A { black_box(m * v) } #[library_benchmark] #[bench::args(mat4())] fn mat4_determinant(m: Mat4) -> f32 { black_box(m.determinant()) } #[library_benchmark] #[bench::args(mat4())] fn mat4_inverse(m: Mat4) -> Mat4 { black_box(m.inverse()) } #[library_benchmark] #[bench::args(mat4())] fn mat4_transpose(m: Mat4) -> Mat4 { black_box(m.transpose()) } #[library_benchmark] #[bench::args(mat4(), mat4())] fn mat4_mul_mat4(m1: Mat4, m2: Mat4) -> Mat4 { black_box(m1 * m2) } #[library_benchmark] #[bench::args(mat4(), vec4())] fn mat4_mul_vec4(m: Mat4, v: Vec4) -> Vec4 { black_box(m * v) } #[library_benchmark] #[bench::args(quat(), quat())] fn quat_mul_quat(q1: Quat, q2: Quat) -> Quat { black_box(q1 * q2) } #[library_benchmark] #[bench::args(quat(), vec3a())] fn quat_mul_vec3a(q: Quat, v: Vec3A) -> Vec3A { black_box(q * v) } #[library_benchmark] #[bench::args(vec3a(), vec3a())] fn vec3a_dot(v1: Vec3A, v2: Vec3A) -> f32 { black_box(v1.dot(v2)) } #[library_benchmark] #[bench::args(vec3a(), vec3a())] fn vec3a_cross(v1: Vec3A, v2: Vec3A) -> Vec3A { black_box(v1.cross(v2)) } #[library_benchmark] #[bench::args(vec3a())] fn vec3a_length(v: Vec3A) -> f32 { black_box(v.length()) } #[library_benchmark] #[bench::args(vec3a())] fn vec3a_normalize(v: Vec3A) -> Vec3A { black_box(v.normalize()) } #[library_benchmark] #[bench::args(bvec3a(), vec3a(), vec3a())] fn vec3a_select(b: BVec3A, v1: Vec3A, v2: Vec3A) -> Vec3A { black_box(Vec3A::select(b, v1, v2)) } #[library_benchmark] #[bench::args(vec4(), vec4())] fn vec4_dot(v1: Vec4, v2: Vec4) -> f32 { black_box(v1.dot(v2)) } #[library_benchmark] #[bench::args(vec4())] fn vec4_length(v: Vec4) -> f32 { black_box(v.length()) } #[library_benchmark] #[bench::args(vec4())] fn vec4_normalize(v: Vec4) -> Vec4 { black_box(v.normalize()) } #[library_benchmark] #[bench::args(bvec4a(), vec4(), vec4())] fn vec4_select(b: BVec4A, v1: Vec4, v2: Vec4) -> Vec4 { black_box(Vec4::select(b, v1, v2)) } library_benchmark_group!( name = bench_mat2; benchmarks = mat2_determinant, mat2_inverse, mat2_mul_mat2, mat2_mul_vec2, mat2_transpose, ); library_benchmark_group!( name = bench_mat3a; benchmarks = mat3a_determinant, mat3a_inverse, mat3a_mul_mat3a, mat3a_mul_vec3a, mat3a_transpose, ); library_benchmark_group!( name = bench_mat4; benchmarks = mat4_determinant, mat4_inverse, mat4_mul_mat4, mat4_mul_vec4, mat4_transpose, ); library_benchmark_group!( name = bench_quat; benchmarks = quat_mul_quat, quat_mul_vec3a, ); library_benchmark_group!( name = bench_vec3a; benchmarks = vec3a_dot, vec3a_cross, vec3a_length, vec3a_normalize, vec3a_select, ); library_benchmark_group!( name = bench_vec4; benchmarks = vec4_dot, vec4_length, vec4_normalize, vec4_select, ); main!( library_benchmark_groups = bench_mat2, bench_mat3a, bench_mat4, bench_quat, bench_vec3a, bench_vec4 );