Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
This commit is contained in:
119
vendor/exr/benches/pixel_format_conversion.rs
vendored
Normal file
119
vendor/exr/benches/pixel_format_conversion.rs
vendored
Normal file
@ -0,0 +1,119 @@
|
||||
#[macro_use]
|
||||
extern crate bencher;
|
||||
|
||||
extern crate exr;
|
||||
use exr::prelude::*;
|
||||
|
||||
use bencher::Bencher;
|
||||
use std::fs;
|
||||
use std::io::Cursor;
|
||||
use exr::image::pixel_vec::PixelVec;
|
||||
use exr::io::Data;
|
||||
use exr::block::samples::FromNativeSample;
|
||||
|
||||
const F32_ZIPS_PATH: &'static str = "tests/images/valid/custom/crowskull/crow_zips.exr";
|
||||
const F32_UNCOMPRESSED_PATH: &'static str = "tests/images/valid/custom/crowskull/crow_uncompressed.exr";
|
||||
const F16_UNCOMPRESSED_PATH: &'static str = "tests/images/valid/custom/crowskull/crow_uncompressed_half.exr";
|
||||
const F16_ZIP_PATH: &'static str = "tests/images/valid/custom/crowskull/crow_zip_half.exr";
|
||||
|
||||
/// Read an image from an in-memory buffer into its native f32 format
|
||||
fn read_f32_as_f32_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F32_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
/// Read image and convert the samples to u32 (from native f32)
|
||||
fn read_f32_as_u32_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<u32>(bench, F32_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
/// f16 is not natively supported by CPUs, which introduces unique performance pitfalls
|
||||
fn read_f32_as_f16_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F32_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f16_as_f16_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F16_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f16_as_f32_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F16_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f16_as_u32_uncompressed_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<u32>(bench, F16_UNCOMPRESSED_PATH, false);
|
||||
}
|
||||
|
||||
|
||||
fn read_f32_as_f16_zips_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F32_ZIPS_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f16_as_f32_zip_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F16_ZIP_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f32_as_f16_zips_nthreads(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F32_ZIPS_PATH, true);
|
||||
}
|
||||
|
||||
fn read_f16_as_f32_zip_nthreads(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F16_ZIP_PATH, true);
|
||||
}
|
||||
|
||||
fn read_f32_as_f32_zips_nthreads(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F32_ZIPS_PATH, true);
|
||||
}
|
||||
|
||||
fn read_f16_as_f16_zip_nthreads(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F16_ZIP_PATH, true);
|
||||
}
|
||||
|
||||
fn read_f32_as_f32_zips_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f32>(bench, F32_ZIPS_PATH, false);
|
||||
}
|
||||
|
||||
fn read_f16_as_f16_zip_1thread(bench: &mut Bencher) {
|
||||
bench_read_image_rgba_as::<f16>(bench, F16_ZIP_PATH, false);
|
||||
}
|
||||
|
||||
fn bench_read_image_rgba_as<T>(bench: &mut Bencher, path: &str, parallel: bool) {
|
||||
let mut file = fs::read(path).unwrap();
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
bench.iter(||{
|
||||
let image = read_file_from_memory_as::<f16>(file.as_slice(), parallel);
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
fn read_file_from_memory_as<T>(file: &[u8], parallel: bool) -> RgbaImage<PixelVec<(T, T, T, T)>>
|
||||
where T: FromNativeSample
|
||||
{
|
||||
let read = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(T, T, T, T)>::constructor, PixelVec::set_pixel)
|
||||
.first_valid_layer().all_attributes();
|
||||
|
||||
let read = if parallel { read } else { read.non_parallel() };
|
||||
read.from_buffered(Cursor::new(file)).unwrap()
|
||||
}
|
||||
|
||||
benchmark_group!(pixel_format_conversion,
|
||||
read_f32_as_f32_uncompressed_1thread,
|
||||
read_f32_as_u32_uncompressed_1thread,
|
||||
read_f32_as_f16_uncompressed_1thread,
|
||||
read_f32_as_f16_zips_1thread,
|
||||
read_f32_as_f16_zips_nthreads,
|
||||
read_f32_as_f32_zips_nthreads,
|
||||
read_f32_as_f32_zips_1thread,
|
||||
|
||||
read_f16_as_f16_uncompressed_1thread,
|
||||
read_f16_as_u32_uncompressed_1thread,
|
||||
read_f16_as_f32_uncompressed_1thread,
|
||||
read_f16_as_f32_zip_1thread,
|
||||
read_f16_as_f32_zip_nthreads,
|
||||
read_f16_as_f16_zip_nthreads,
|
||||
read_f16_as_f16_zip_1thread,
|
||||
);
|
||||
|
||||
benchmark_main!(pixel_format_conversion);
|
39
vendor/exr/benches/profiling.rs
vendored
Normal file
39
vendor/exr/benches/profiling.rs
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
#[macro_use]
|
||||
extern crate bencher;
|
||||
|
||||
extern crate exr;
|
||||
use exr::prelude::*;
|
||||
|
||||
use bencher::Bencher;
|
||||
use std::fs;
|
||||
use std::io::Cursor;
|
||||
use exr::image::pixel_vec::PixelVec;
|
||||
|
||||
const PROFILING_REPETITIONS: i32 = 1; // make this 100 for profiling longer periods
|
||||
|
||||
/// This is a suuuper long benchmark, to allow you to hook up a profiler while running it
|
||||
/// but this means we don't want it in our normal benchmarks
|
||||
fn read_single_image_from_buffer_rgba_f32_as_f16(bench: &mut Bencher) {
|
||||
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_uncompressed.exr").unwrap();
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
bench.iter(||{
|
||||
for _ in 0 .. PROFILING_REPETITIONS {
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f16,f16,f16,f16)>::constructor, PixelVec::set_pixel)
|
||||
.first_valid_layer().all_attributes()
|
||||
.non_parallel()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
benchmark_group!(profiling,
|
||||
read_single_image_from_buffer_rgba_f32_as_f16
|
||||
);
|
||||
|
||||
benchmark_main!(profiling);
|
172
vendor/exr/benches/read.rs
vendored
Normal file
172
vendor/exr/benches/read.rs
vendored
Normal file
@ -0,0 +1,172 @@
|
||||
#[macro_use]
|
||||
extern crate bencher;
|
||||
|
||||
extern crate exr;
|
||||
use exr::prelude::*;
|
||||
|
||||
use bencher::Bencher;
|
||||
use std::fs;
|
||||
use std::io::Cursor;
|
||||
use exr::image::pixel_vec::PixelVec;
|
||||
|
||||
/// Read uncompressed (always single core)
|
||||
fn read_single_image_uncompressed_non_parallel_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_uncompressed.exr").unwrap();
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers().all_attributes()
|
||||
.non_parallel()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read from in-memory in parallel
|
||||
fn read_single_image_uncompressed_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_uncompressed.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers().all_attributes()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read with multi-core RLE decompression
|
||||
fn read_single_image_rle_all_channels(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_rle.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data()
|
||||
.largest_resolution_level()
|
||||
.all_channels()
|
||||
.all_layers()
|
||||
.all_attributes()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read without multi-core RLE decompression
|
||||
fn read_single_image_rle_non_parallel_all_channels(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_rle.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
// copied from `read_all_flat_layers_from_file` and added `.non_parallel()`
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data()
|
||||
.largest_resolution_level()
|
||||
.all_channels()
|
||||
.all_layers()
|
||||
.all_attributes()
|
||||
.non_parallel()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read with multi-core RLE decompression
|
||||
fn read_single_image_rle_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_rle.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data()
|
||||
.largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers()
|
||||
.all_attributes()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read without multi-core RLE decompression
|
||||
fn read_single_image_rle_non_parallel_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_rle.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
// copied from `read_all_flat_layers_from_file` and added `.non_parallel()`
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data()
|
||||
.largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers()
|
||||
.all_attributes()
|
||||
.non_parallel()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read with multi-core zip decompression
|
||||
fn read_single_image_zips_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_zips.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers().all_attributes()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
/// Read without multi-core ZIP decompression
|
||||
fn read_single_image_zips_non_parallel_rgba(bench: &mut Bencher) {
|
||||
let mut file = fs::read("tests/images/valid/custom/crowskull/crow_zips.exr").unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
bencher::black_box(&mut file);
|
||||
|
||||
let image = exr::prelude::read()
|
||||
.no_deep_data().largest_resolution_level()
|
||||
.rgba_channels(PixelVec::<(f32,f32,f32,f32)>::constructor, PixelVec::set_pixel)
|
||||
.all_layers().all_attributes()
|
||||
.non_parallel()
|
||||
.from_buffered(Cursor::new(file.as_slice())).unwrap();
|
||||
|
||||
bencher::black_box(image);
|
||||
})
|
||||
}
|
||||
|
||||
benchmark_group!(read,
|
||||
read_single_image_uncompressed_rgba,
|
||||
read_single_image_uncompressed_non_parallel_rgba,
|
||||
read_single_image_rle_rgba,
|
||||
read_single_image_rle_non_parallel_rgba,
|
||||
read_single_image_rle_all_channels,
|
||||
read_single_image_rle_non_parallel_all_channels,
|
||||
read_single_image_zips_rgba,
|
||||
read_single_image_zips_non_parallel_rgba,
|
||||
);
|
||||
|
||||
benchmark_main!(read);
|
80
vendor/exr/benches/write.rs
vendored
Normal file
80
vendor/exr/benches/write.rs
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
#[macro_use]
|
||||
extern crate bencher;
|
||||
|
||||
extern crate exr;
|
||||
use exr::prelude::*;
|
||||
|
||||
use bencher::Bencher;
|
||||
use std::io::Cursor;
|
||||
|
||||
fn write_parallel_any_channels_to_buffered(bench: &mut Bencher) {
|
||||
let path = "tests/images/valid/custom/crowskull/crow_rle.exr";
|
||||
let image = read_all_flat_layers_from_file(path).unwrap();
|
||||
|
||||
bench.iter(||{
|
||||
let mut result = Vec::new();
|
||||
image.write().to_buffered(Cursor::new(&mut result)).unwrap();
|
||||
bencher::black_box(result);
|
||||
})
|
||||
}
|
||||
|
||||
fn write_parallel_zip1_to_buffered(bench: &mut Bencher) {
|
||||
let path = "tests/images/valid/custom/crowskull/crow_rle.exr";
|
||||
|
||||
let mut image = read_first_flat_layer_from_file(path).unwrap();
|
||||
image.layer_data.encoding.compression = Compression::ZIP1;
|
||||
|
||||
bench.iter(||{
|
||||
let mut result = Vec::new();
|
||||
image.write().to_buffered(Cursor::new(&mut result)).unwrap();
|
||||
bencher::black_box(result);
|
||||
})
|
||||
}
|
||||
|
||||
fn write_nonparallel_zip1_to_buffered(bench: &mut Bencher) {
|
||||
let path = "tests/images/valid/custom/crowskull/crow_rle.exr";
|
||||
|
||||
let mut image = read_first_flat_layer_from_file(path).unwrap();
|
||||
image.layer_data.encoding.compression = Compression::ZIP1;
|
||||
|
||||
bench.iter(||{
|
||||
let mut result = Vec::new();
|
||||
image.write().non_parallel().to_buffered(Cursor::new(&mut result)).unwrap();
|
||||
bencher::black_box(result);
|
||||
})
|
||||
}
|
||||
|
||||
fn write_parallel_zip16_to_buffered(bench: &mut Bencher) {
|
||||
let path = "tests/images/valid/custom/crowskull/crow_rle.exr";
|
||||
|
||||
let mut image = read_first_flat_layer_from_file(path).unwrap();
|
||||
image.layer_data.encoding.compression = Compression::ZIP16;
|
||||
|
||||
bench.iter(||{
|
||||
let mut result = Vec::new();
|
||||
image.write().to_buffered(Cursor::new(&mut result)).unwrap();
|
||||
bencher::black_box(result);
|
||||
})
|
||||
}
|
||||
|
||||
fn write_uncompressed_to_buffered(bench: &mut Bencher) {
|
||||
let path = "tests/images/valid/custom/crowskull/crow_uncompressed.exr";
|
||||
let image = read_all_flat_layers_from_file(path).unwrap();
|
||||
assert!(image.layer_data.iter().all(|layer| layer.encoding.compression == Compression::Uncompressed));
|
||||
|
||||
bench.iter(||{
|
||||
let mut result = Vec::new();
|
||||
image.write().to_buffered(Cursor::new(&mut result)).unwrap();
|
||||
bencher::black_box(result);
|
||||
})
|
||||
}
|
||||
|
||||
benchmark_group!(write,
|
||||
write_parallel_any_channels_to_buffered,
|
||||
write_nonparallel_zip1_to_buffered,
|
||||
write_parallel_zip1_to_buffered,
|
||||
write_parallel_zip16_to_buffered,
|
||||
write_uncompressed_to_buffered
|
||||
);
|
||||
|
||||
benchmark_main!(write);
|
Reference in New Issue
Block a user