Extract image savers to function

This commit is contained in:
numzero 2024-12-31 00:37:07 +03:00
parent d125635f80
commit 946617f988

View File

@ -1,7 +1,7 @@
use std::env::args; use std::env::args;
use std::error::Error; use std::error::Error;
use std::io::{stdout, Write}; use std::io::{stdout, Write};
use std::path::PathBuf; use std::path::{Path, PathBuf};
use std::sync::Arc; use std::sync::Arc;
use std::{fs, io}; use std::{fs, io};
@ -50,12 +50,23 @@ fn main() {
} }
let n_threads = std::thread::available_parallelism().map(|n| n.get()).unwrap_or(2); let n_threads = std::thread::available_parallelism().map(|n| n.get()).unwrap_or(2);
let (img_sender, img_receiver) = async_channel::bounded::<Frame>(2 * n_threads);
std::thread::scope(|s| { std::thread::scope(|s| {
let (img_sender, img_receiver) = async_channel::bounded::<(u32, Arc<wgpu::Buffer>)>(2 * n_threads);
for _ in 0..n_threads { for _ in 0..n_threads {
let img_receiver = img_receiver.clone(); start_saver(s, &path, &img_receiver);
let path = &path; }
s.spawn(move || { do_work(img_sender, start_frame, stop_frame);
});
}
type Frame = (u32, Arc<wgpu::Buffer>);
fn start_saver<'a>(
scope: &'a std::thread::Scope<'a, '_>,
path: &'a Path,
img_receiver: &'a async_channel::Receiver<Frame>,
) {
scope.spawn(move || {
while let Ok((frame, buffer)) = img_receiver.recv_blocking() { while let Ok((frame, buffer)) = img_receiver.recv_blocking() {
let img = image::RgbaImage::from_raw(SIZE.x, SIZE.y, buffer.slice(..).get_mapped_range().to_vec()) let img = image::RgbaImage::from_raw(SIZE.x, SIZE.y, buffer.slice(..).get_mapped_range().to_vec())
.expect("read failure!"); .expect("read failure!");
@ -64,12 +75,10 @@ fn main() {
.expect("save failure!"); .expect("save failure!");
} }
}); });
}
do_work(img_sender, start_frame, stop_frame);
});
} }
fn do_work(img_sender: async_channel::Sender<(u32, Arc<wgpu::Buffer>)>, start_frame: u32, stop_frame: u32) { fn do_work(img_sender: async_channel::Sender<Frame>, start_frame: u32, stop_frame: u32) {
println!("Loading...");
let img_sender = Arc::new(img_sender); let img_sender = Arc::new(img_sender);
let (device, queue) = pollster::block_on(init_gpu()).unwrap(); let (device, queue) = pollster::block_on(init_gpu()).unwrap();