diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/src/main.rs b/src/main.rs index 53f3a41..5775d70 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use bpaf::{construct, positional, OptionParser, Parser}; +use bpaf::{OptionParser, Parser, construct, positional}; use demosaic::Demosaic; use image::buffer::ConvertBuffer; @@ -9,7 +9,7 @@ mod pipeline; #[derive(Clone, Debug)] struct Args { - paths: Vec<PathBuf> + paths: Vec<PathBuf>, } fn args() -> OptionParser<Args> { @@ -26,19 +26,28 @@ fn main() { // Initialize GPU let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); - let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions::default())).unwrap(); + let adapter = + pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions::default())) + .unwrap(); let downlevel_caps = adapter.get_downlevel_capabilities(); - if !downlevel_caps.flags.contains(wgpu::DownlevelFlags::COMPUTE_SHADERS) { + if !downlevel_caps + .flags + .contains(wgpu::DownlevelFlags::COMPUTE_SHADERS) + { panic!("GPU does not support compute"); } - let (gpu, queue) = pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor { - label: None, - required_features: wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES, - required_limits: wgpu::Limits::default(), - memory_hints: wgpu::MemoryHints::MemoryUsage, - }, None)).unwrap(); + let (gpu, queue) = pollster::block_on(adapter.request_device( + &wgpu::DeviceDescriptor { + label: None, + required_features: wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES, + required_limits: wgpu::Limits::default(), + memory_hints: wgpu::MemoryHints::MemoryUsage, + }, + None, + )) + .unwrap(); // Process images for path in &args.paths { @@ -46,7 +55,7 @@ fn main() { dbg!(&image.cfa); let pipeline = pipeline::Resources { - demosaic: Box::new(demosaic::Lmmse::new(&gpu, &queue)) + demosaic: Box::new(demosaic::Lmmse::new(&gpu, &queue)), }; let demosaiced = pipeline.demosaic.demoasic(&gpu, &queue, &image); @@ -56,9 +65,8 @@ fn main() { usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, mapped_at_creation: false, }); - let mut encoder = gpu.create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: None, - }); + let mut encoder = + gpu.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); encoder.copy_texture_to_buffer( wgpu::TexelCopyTextureInfo { texture: &demosaiced, @@ -78,7 +86,7 @@ fn main() { width: image.width as u32, height: image.height as u32, depth_or_array_layers: 1, - } + }, ); queue.submit([encoder.finish()]); @@ -87,8 +95,17 @@ fn main() { gpu.poll(wgpu::Maintain::Wait); { let readback_data = readback_slice.get_mapped_range(); - let result_image = image::ImageBuffer::<image::Rgba<f32>, _>::from_raw(image.width as u32, image.height as u32, bytemuck::cast_slice(&readback_data)).unwrap(); - <_ as ConvertBuffer<image::ImageBuffer<image::Rgb<u16>, Vec<u16>>>>::convert(&result_image).save_with_format("out.png", image::ImageFormat::Png).unwrap(); + let result_image = image::ImageBuffer::<image::Rgba<f32>, _>::from_raw( + image.width as u32, + image.height as u32, + bytemuck::cast_slice(&readback_data), + ) + .unwrap(); + <_ as ConvertBuffer<image::ImageBuffer<image::Rgb<u16>, Vec<u16>>>>::convert( + &result_image, + ) + .save_with_format("out.png", image::ImageFormat::Png) + .unwrap(); } readback_buf.unmap(); } |