blob: d6cf46767e33405b6783e3f343971091f6b2a2b9 [file]
// Copyright 2025 the Vello Authors
// SPDX-License-Identifier: Apache-2.0 OR MIT
use crate::fine::{BENCH_WIDTH, default_blend, fill_single};
use criterion::{Bencher, Criterion};
use std::io::Cursor;
use std::sync::Arc;
use vello_common::encode::EncodeExt;
use vello_common::fearless_simd::Simd;
use vello_common::kurbo::Affine;
use vello_common::paint::{Image, ImageSource};
use vello_common::peniko;
use vello_common::peniko::ImageQuality;
use vello_common::peniko::ImageSampler;
use vello_common::pixmap::Pixmap;
use vello_cpu::fine::{Fine, FineKernel};
pub fn image(c: &mut Criterion) {
transform::none(c);
transform::scale(c);
transform::rotate(c);
quality::low(c);
quality::medium(c);
quality::high(c);
extend::pad(c);
extend::repeat(c);
extend::reflect(c);
}
mod extend {
use crate::fine::BENCH_WIDTH;
use crate::fine::image::{get_small_image, image_base};
use criterion::Bencher;
use vello_common::fearless_simd::Simd;
use vello_common::kurbo::Affine;
use vello_common::peniko;
use vello_common::peniko::ImageQuality;
use vello_cpu::fine::{Fine, FineKernel};
use vello_dev_macros::vello_bench;
fn extend_base<S: Simd, T: FineKernel<S>>(
b: &mut Bencher<'_>,
fine: &mut Fine<S, T>,
extend: peniko::Extend,
) {
let im = get_small_image(extend, ImageQuality::Low);
image_base(
b,
fine,
im,
Affine::translate((BENCH_WIDTH as f64 / 2.0, 0.0)),
);
}
#[vello_bench]
fn pad<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
extend_base(b, fine, peniko::Extend::Pad);
}
#[vello_bench]
fn repeat<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
extend_base(b, fine, peniko::Extend::Repeat);
}
#[vello_bench]
fn reflect<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
extend_base(b, fine, peniko::Extend::Reflect);
}
}
mod quality {
use crate::fine::image::{get_colr_image, image_base};
use criterion::Bencher;
use vello_common::fearless_simd::Simd;
use vello_common::kurbo::Affine;
use vello_common::peniko;
use vello_common::peniko::ImageQuality;
use vello_cpu::fine::{Fine, FineKernel};
use vello_dev_macros::vello_bench;
fn quality_base<S: Simd, T: FineKernel<S>>(
b: &mut Bencher<'_>,
fine: &mut Fine<S, T>,
quality: ImageQuality,
) {
let im = get_colr_image(peniko::Extend::Pad, quality);
image_base(b, fine, im, Affine::scale(3.0));
}
#[vello_bench]
fn low<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
quality_base(b, fine, ImageQuality::Low);
}
#[vello_bench]
fn medium<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
quality_base(b, fine, ImageQuality::Medium);
}
#[vello_bench]
fn high<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
quality_base(b, fine, ImageQuality::High);
}
}
mod transform {
use crate::fine::BENCH_WIDTH;
use crate::fine::image::{get_colr_image, image_base};
use criterion::Bencher;
use vello_common::fearless_simd::Simd;
use vello_common::kurbo::{Affine, Point};
use vello_common::peniko;
use vello_common::peniko::ImageQuality;
use vello_common::tile::Tile;
use vello_cpu::fine::{Fine, FineKernel};
use vello_dev_macros::vello_bench;
#[vello_bench]
fn none<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
let im = get_colr_image(peniko::Extend::Pad, ImageQuality::Low);
image_base(b, fine, im, Affine::IDENTITY);
}
#[vello_bench]
fn scale<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
let im = get_colr_image(peniko::Extend::Pad, ImageQuality::Low);
image_base(b, fine, im, Affine::scale(3.0));
}
#[vello_bench]
fn rotate<S: Simd, T: FineKernel<S>>(b: &mut Bencher<'_>, fine: &mut Fine<S, T>) {
let im = get_colr_image(peniko::Extend::Pad, ImageQuality::Low);
image_base(
b,
fine,
im,
Affine::rotate_about(
1.0,
Point::new(BENCH_WIDTH as f64 / 2.0, Tile::HEIGHT as f64 / 2.0),
),
);
}
}
fn get_colr_image(extend: peniko::Extend, quality: ImageQuality) -> Image {
let data = include_bytes!("../../../../vello_tests/snapshots/big_colr.png");
let pixmap = Pixmap::from_png(Cursor::new(data)).unwrap();
Image {
image: ImageSource::Pixmap(Arc::new(pixmap)),
sampler: ImageSampler {
x_extend: extend,
y_extend: extend,
quality,
alpha: 1.0,
},
}
}
fn get_small_image(extend: peniko::Extend, quality: ImageQuality) -> Image {
let data = include_bytes!("../../../vello_sparse_tests/tests/assets/rgb_image_2x2.png");
let pixmap = Pixmap::from_png(Cursor::new(data)).unwrap();
Image {
image: ImageSource::Pixmap(Arc::new(pixmap)),
sampler: ImageSampler {
x_extend: extend,
y_extend: extend,
quality,
alpha: 1.0,
},
}
}
fn image_base<S: Simd, T: FineKernel<S>>(
b: &mut Bencher<'_>,
fine: &mut Fine<S, T>,
image: Image,
transform: Affine,
) {
let mut paints = vec![];
let paint = image.encode_into(&mut paints, transform, None);
fill_single(&paint, &paints, BENCH_WIDTH, b, default_blend(), fine);
}