pub mod motion; use motion::{enc::MotionEncoder, CommonBuffers, Params}; use pollster::FutureExt; use std::io::{stdin, stdout, Read, Write}; use wgpu::{ Backends, DeviceDescriptor, Extent3d, Features, Instance, InstanceDescriptor, Limits, MaintainBase, PowerPreference, RequestAdapterOptions, }; use crate::motion::RoundParams; fn main() { let instance = Instance::new(InstanceDescriptor { backends: Backends::all(), ..Default::default() }); let adapter = instance .request_adapter(&RequestAdapterOptions { power_preference: PowerPreference::HighPerformance, force_fallback_adapter: false, compatible_surface: None, }) .block_on() .unwrap(); let (device, queue) = adapter .request_device( &DeviceDescriptor { label: None, features: Features::BGRA8UNORM_STORAGE, limits: Limits::default(), }, None, ) .block_on() .unwrap(); let (width, height) = (1920, 1080); let params = Params { width, height, extent: Extent3d { width: width as u32, height: height as u32, depth_or_array_layers: 1, }, block_width: 8, block_height: 8, blocks: (width / 8) * (height / 8), }; let bufs = CommonBuffers::create(&device, ¶ms); let menc = MotionEncoder::create(&device, ¶ms, &bufs); let mut buffer = vec![0u8; width * height * 4]; let mut i = 0; loop { let rp = RoundParams { swap: i }; eprintln!("read"); stdin().read_exact(&mut buffer).unwrap(); eprintln!("upload"); bufs.upload(&queue, ¶ms, &rp, &buffer); eprintln!("compute"); let mut encoder = device.create_command_encoder(&Default::default()); menc.pass(&mut encoder, ¶ms, &rp); bufs.prepare_texture_download(&mut encoder, ¶ms, &rp); queue.submit(Some(encoder.finish())); device.poll(MaintainBase::Wait); eprintln!("download"); bufs.download(&device, &mut buffer); eprintln!("write"); stdout().write_all(&buffer).unwrap(); i += 1; i %= 2; } }