diff options
author | metamuffin <metamuffin@disroot.org> | 2024-01-24 02:16:03 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-01-24 02:16:03 +0100 |
commit | 330cbef6f1953de3e1cbeb5aed03e951bc101965 (patch) | |
tree | fc4566dc27ac3d6487fbfe125166335324fd7d88 | |
parent | 754ebf34cbb6280ef77421e1ca54d35d727dc6f7 (diff) | |
download | video-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar video-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar.bz2 video-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar.zst |
fix it?
-rw-r--r-- | flowy/Cargo.toml | 3 | ||||
-rw-r--r-- | flowy/src/main.rs | 17 | ||||
-rw-r--r-- | flowy/src/motion/debug.wgsl | 12 | ||||
-rw-r--r-- | flowy/src/motion/enc.rs | 4 | ||||
-rw-r--r-- | flowy/src/motion/enc.wgsl | 17 | ||||
-rw-r--r-- | flowy/src/motion/mod.rs | 43 |
6 files changed, 79 insertions, 17 deletions
diff --git a/flowy/Cargo.toml b/flowy/Cargo.toml index c51d957..3c9696b 100644 --- a/flowy/Cargo.toml +++ b/flowy/Cargo.toml @@ -5,10 +5,9 @@ edition = "2021" [dependencies] wgpu = "0.18.0" -bytemuck = "1.14.0" +bytemuck = { version = "1.14.0", features = ["derive"] } pollster = "0.3.0" env_logger = "0.10.1" log = "0.4.20" oneshot = "0.1.6" framework = { path = "../framework" } - diff --git a/flowy/src/main.rs b/flowy/src/main.rs index 8529f2c..33ab4c9 100644 --- a/flowy/src/main.rs +++ b/flowy/src/main.rs @@ -1,6 +1,6 @@ pub mod motion; -use framework::Framework; +use framework::{CodecMode, Framework}; use log::{debug, info}; use motion::{dec::MotionDecoder, enc::MotionEncoder, CommonBuffers, Params}; use pollster::FutureExt; @@ -100,18 +100,17 @@ fn main() { framework.next_frame_manual(); debug!("upload"); - bufs.upload(&queue, ¶ms, &rp, &buffer); + bufs.upload_texture(&queue, ¶ms, &rp, &buffer); debug!("compute"); - let mut encoder = device.create_command_encoder(&Default::default()); - if i > 1 { + if let CodecMode::Encode = fparams.mode { menc.pass(&mut encoder, ¶ms, &rp); - mdec.pass(&mut encoder, ¶ms, &rp); - if rp.debug { - mdeb.pass(&mut encoder, ¶ms, &rp); - } + } + mdec.pass(&mut encoder, ¶ms, &rp); + if rp.debug { + mdeb.pass(&mut encoder, ¶ms, &rp); } if rp.preview { bufs.prepare_texture_download(&mut encoder, ¶ms, &rp); @@ -121,7 +120,7 @@ fn main() { device.poll(MaintainBase::Wait); debug!("download"); - bufs.download(&device, &mut buffer); + bufs.download_texture(&device, &mut buffer); framework.encode_done(&[]); debug!("write"); diff --git a/flowy/src/motion/debug.wgsl b/flowy/src/motion/debug.wgsl index 7da5c57..d2c56a4 100644 --- a/flowy/src/motion/debug.wgsl +++ b/flowy/src/motion/debug.wgsl @@ -29,6 +29,18 @@ struct BlockOffset { textureStore(out, base, col); } } + + // for (var x = 0; x < params.block_size.x; x++) { + // for (var y = 0; y < params.block_size.y; y++) { + // let base = uv + vec2(x, y); + // let col_dec = textureLoad(prev, base + bl.offset, 0) + vec4(bl.tint, 1.); + // let col_orig = textureLoad(next, base, 0); + + // let col = vec4( saturate((0.5) + (col_orig.rgb - col_dec.rgb) * 100.), 1.0); + + // textureStore(out, base, col); + // } + // } } diff --git a/flowy/src/motion/enc.rs b/flowy/src/motion/enc.rs index d3e8a81..1a46aa6 100644 --- a/flowy/src/motion/enc.rs +++ b/flowy/src/motion/enc.rs @@ -37,8 +37,8 @@ impl MotionEncoder { let uniform = EncoderUniform { block_size: [params.block_width as i32, params.block_height as i32], output_stride: (params.width / params.block_width) as u32, - search_radius: 16, - skip_threshold: 0.1, + search_radius: 24, + skip_threshold: 1., ..Default::default() }; diff --git a/flowy/src/motion/enc.wgsl b/flowy/src/motion/enc.wgsl index 80618b7..ca3c769 100644 --- a/flowy/src/motion/enc.wgsl +++ b/flowy/src/motion/enc.wgsl @@ -30,16 +30,28 @@ var<private> best_tint: vec3<f32> = vec3(0.); apply_tint(uv); if best_error < params.skip_threshold { break; } best_tint = vec3(0.); + best_error = 10000000.; + do_dist(uv, 64); + if best_error < params.skip_threshold { break; } do_dist(uv, 32); + if best_error < params.skip_threshold { break; } + do_dist(uv, 24); + if best_error < params.skip_threshold { break; } do_dist(uv, 16); - do_dist(uv, 10); + if best_error < params.skip_threshold { break; } + do_dist(uv, 12); + if best_error < params.skip_threshold { break; } do_dist(uv, 8); if best_error < params.skip_threshold { break; } do_dist(uv, 6); - do_dist(uv, 3); + if best_error < params.skip_threshold { break; } do_dist(uv, 4); + if best_error < params.skip_threshold { break; } + do_dist(uv, 3); + if best_error < params.skip_threshold { break; } do_dist(uv, 2); + if best_error < params.skip_threshold { break; } do_dist(uv, 1); if best_error < params.skip_threshold { break; } @@ -85,6 +97,7 @@ fn apply_tint(uv: vec2<i32>) { } } if err < best_error { + best_error = err; best_tint = tint; } } diff --git a/flowy/src/motion/mod.rs b/flowy/src/motion/mod.rs index cd53550..337290f 100644 --- a/flowy/src/motion/mod.rs +++ b/flowy/src/motion/mod.rs @@ -102,7 +102,7 @@ impl CommonBuffers { } } - pub fn upload(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) { + pub fn upload_texture(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) { queue.write_texture( ImageCopyTexture { aspect: wgpu::TextureAspect::All, @@ -119,6 +119,23 @@ impl CommonBuffers { params.extent, ); } + // pub fn upload_offsets(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) { + // queue.write_texture( + // ImageCopyTexture { + // aspect: wgpu::TextureAspect::All, + // mip_level: 0, + // origin: Origin3d::ZERO, + // texture: &self.textures[rp.swap], + // }, + // buffer, + // wgpu::ImageDataLayout { + // offset: 0, + // bytes_per_row: Some(params.extent.width * 4), + // rows_per_image: Some(params.extent.height), + // }, + // params.extent, + // ); + // } pub fn prepare_texture_download( &self, @@ -148,8 +165,30 @@ impl CommonBuffers { params.extent, ); } + pub fn prepare_offsets_download(&self, encoder: &mut CommandEncoder, params: &Params) { + encoder.copy_buffer_to_buffer( + &self.offsets, + 0, + self.offsets_download.as_ref().unwrap(), + 0, + (params.blocks * size_of::<BlockOffset>()) as u64, + ); + } + + pub fn download_offsets(&self, device: &Device, buffer: &mut [u8]) { + let buffer_slice = self.offsets_download.as_ref().unwrap().slice(..); + let (sender, receiver) = oneshot::channel(); + buffer_slice.map_async(wgpu::MapMode::Read, move |r| sender.send(r).unwrap()); + device.poll(wgpu::Maintain::Wait); + receiver.recv().unwrap().unwrap(); + { + let view = buffer_slice.get_mapped_range(); + buffer.copy_from_slice(&view[..]); + } + self.offsets_download.as_ref().unwrap().unmap(); + } - pub fn download(&self, device: &Device, buffer: &mut [u8]) { + pub fn download_texture(&self, device: &Device, buffer: &mut [u8]) { let buffer_slice = self.texture_download.as_ref().unwrap().slice(..); let (sender, receiver) = oneshot::channel(); buffer_slice.map_async(wgpu::MapMode::Read, move |r| sender.send(r).unwrap()); |