| // Copyright 2025 the Vello Authors |
| // SPDX-License-Identifier: Apache-2.0 OR MIT |
| |
| use proc_macro::TokenStream; |
| use proc_macro2::Ident; |
| use quote::quote; |
| use syn::{ItemFn, parse_macro_input}; |
| |
| pub(crate) fn vello_bench_inner(_: TokenStream, item: TokenStream) -> TokenStream { |
| let mut input_fn = parse_macro_input!(item as ItemFn); |
| |
| let input_fn_name = input_fn.sig.ident.clone(); |
| let input_fn_name_str = input_fn.sig.ident.to_string(); |
| let inner_fn_name = Ident::new(&format!("{}_inner", input_fn_name), input_fn_name.span()); |
| |
| input_fn.sig.ident = inner_fn_name.clone(); |
| |
| let expanded = quote! { |
| #input_fn |
| |
| pub fn #input_fn_name(c: &mut criterion::Criterion) { |
| use vello_cpu::fine::Fine; |
| use vello_common::coarse::WideTile; |
| use vello_common::tile::Tile; |
| |
| fn get_bench_name(suffix1: &str, suffix2: &str) -> String { |
| let module_path = module_path!(); |
| |
| let module = module_path |
| .split("::") |
| .skip(1) |
| .collect::<Vec<_>>() |
| .join("/"); |
| |
| format!("{}/{}_{}", module, suffix1, suffix2) |
| } |
| |
| c.bench_function(&get_bench_name(&#input_fn_name_str, "u8_scalar"), |b| { |
| let mut fine = Fine::<u8>::new(); |
| #inner_fn_name(b, &mut fine); |
| }); |
| |
| c.bench_function(&get_bench_name(&#input_fn_name_str, "f32_scalar"), |b| { |
| let mut fine = Fine::<f32>::new(); |
| #inner_fn_name(b, &mut fine); |
| }); |
| } |
| }; |
| |
| expanded.into() |
| } |