From 11a57882861f9811cb1624d76a2b08ffb7d47b9c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 21 Nov 2022 20:19:18 +0100 Subject: works (not) --- vgcodec/Cargo.lock | 37 +++++++++++++++++++++++++++ vgcodec/Cargo.toml | 1 + vgcodec/src/approximate.rs | 62 +++++++++++++++++++++++++++++++++++----------- vgcodec/src/diff.rs | 2 ++ vgcodec/src/diff.wgsl | 5 ++-- vgcodec/src/export.rs | 3 +++ 6 files changed, 92 insertions(+), 18 deletions(-) (limited to 'vgcodec') diff --git a/vgcodec/Cargo.lock b/vgcodec/Cargo.lock index 4c7eacf..390443b 100644 --- a/vgcodec/Cargo.lock +++ b/vgcodec/Cargo.lock @@ -804,6 +804,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.47" @@ -828,6 +834,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "range-alloc" version = "0.1.2" @@ -1050,6 +1086,7 @@ dependencies = [ "image", "log", "pollster", + "rand", "wgpu", ] diff --git a/vgcodec/Cargo.toml b/vgcodec/Cargo.toml index 6680e56..dd76753 100644 --- a/vgcodec/Cargo.toml +++ b/vgcodec/Cargo.toml @@ -11,3 +11,4 @@ pollster = "0.2.5" bytemuck = { version = "1.12.3", features = ["derive"] } futures-intrusive = "0.5.0" image = "0.24.5" +rand = "0.8.5" diff --git a/vgcodec/src/approximate.rs b/vgcodec/src/approximate.rs index 0192973..fc2b4ba 100644 --- a/vgcodec/src/approximate.rs +++ b/vgcodec/src/approximate.rs @@ -2,7 +2,8 @@ use std::sync::Arc; use image::EncodableLayout; use log::info; -use wgpu::{Extent3d, ImageCopyTexture, Origin3d, Texture, TextureUsages}; +use rand::Rng; +use wgpu::{Extent3d, Texture, TextureUsages}; use crate::{ app::App, @@ -12,6 +13,7 @@ use crate::{ paint::{PaintUniforms, Painter}, }; +#[allow(unused)] pub struct Approximator { app: Arc, size: Extent3d, @@ -78,17 +80,44 @@ impl Approximator { } pub async fn run(&mut self) { - let mut current_diff = self.differ.run().await; - let mut params = PaintUniforms { - x: 128.0, - y: 128.0, - r: 0.5, - g: 0.5, - b: 0.5, - radius: 64.0, - }; + for _ in 0..10 { + let mut p = PaintUniforms { + x: rand::thread_rng().gen_range(0.0..256.0), + y: rand::thread_rng().gen_range(0.0..256.0), + r: rand::thread_rng().gen_range(0.0..1.0), + g: rand::thread_rng().gen_range(0.0..1.0), + b: rand::thread_rng().gen_range(0.0..1.0), + radius: rand::thread_rng().gen_range(5.0..10.0), + }; - self.optimize_param(&mut current_diff, &mut params, "", |p| p.b += 0.1); + // Find initial diff + self.save(); + self.painter.run(p); + let mut cd = pollster::block_on(self.differ.run()); + info!("initial diff={cd}"); + self.restore(); + + self.save(); + loop { + let mut q = 0; + q += self.optimize_param(&mut cd, &mut p, "more red", |p| p.r += 0.1); + q += self.optimize_param(&mut cd, &mut p, "less red", |p| p.r -= 0.1); + q += self.optimize_param(&mut cd, &mut p, "more green", |p| p.g += 0.1); + q += self.optimize_param(&mut cd, &mut p, "less green", |p| p.g -= 0.1); + q += self.optimize_param(&mut cd, &mut p, "more blue", |p| p.b += 0.1); + q += self.optimize_param(&mut cd, &mut p, "less blue", |p| p.b -= 0.1); + q += self.optimize_param(&mut cd, &mut p, "increase radius", |p| p.radius *= 1.5); + q += self.optimize_param(&mut cd, &mut p, "decrease radius", |p| p.radius *= 1.5); + q += self.optimize_param(&mut cd, &mut p, "move right", |p| p.x += 5.0); + q += self.optimize_param(&mut cd, &mut p, "move left", |p| p.x -= 5.0); + q += self.optimize_param(&mut cd, &mut p, "move down", |p| p.y += 5.0); + q += self.optimize_param(&mut cd, &mut p, "move up", |p| p.y -= 5.0); + if q == 0 { + break; + } + } + self.painter.run(p); + } self.exporter.run(&self.tex_approx, "a/approx.png").await; } @@ -99,20 +128,23 @@ impl Approximator { params: &mut PaintUniforms, label: &'static str, f: F, - ) where + ) -> usize + where F: Fn(&mut PaintUniforms) -> (), { let mut p = params.clone(); + let mut i = 0; loop { - self.save(); - info!("apply '{label:?}'"); f(&mut p); self.painter.run(p); let diff = pollster::block_on(self.differ.run()); + // pollster::block_on(self.exporter.run(&self.tex_approx, &format!("a/snap.png"))); self.restore(); if diff >= *current_diff { - break; + break i; } + info!("applied {label:?} (before={current_diff} after={diff})"); + i += 1; *current_diff = diff; } } diff --git a/vgcodec/src/diff.rs b/vgcodec/src/diff.rs index b10c4e6..4a7453c 100644 --- a/vgcodec/src/diff.rs +++ b/vgcodec/src/diff.rs @@ -81,6 +81,8 @@ impl Differ { pub async fn run(&self) -> u32 { let App { device, queue, .. } = self.app.as_ref(); + queue.write_buffer(&self.counter_buffer, 0, bytemuck::cast_slice(&[0u32])); + let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); { diff --git a/vgcodec/src/diff.wgsl b/vgcodec/src/diff.wgsl index bb5a3e1..82e169b 100644 --- a/vgcodec/src/diff.wgsl +++ b/vgcodec/src/diff.wgsl @@ -10,8 +10,7 @@ var exp: atomic; fn main(@builtin(global_invocation_id) global_id: vec3) { var col_a = textureLoad(tex_a, vec2(i32(global_id.x), i32(global_id.y)), 0); var col_b = textureLoad(tex_b, vec2(i32(global_id.x), i32(global_id.y)), 0); - var diff = col_a - col_b; - var diffsum = diff.r + diff.g + diff.b; - atomicAdd(&exp, u32(diffsum)); + var diff = length(col_a - col_b); + atomicAdd(&exp, u32(diff * 1000.0)); } diff --git a/vgcodec/src/export.rs b/vgcodec/src/export.rs index 7b02085..e020c5d 100644 --- a/vgcodec/src/export.rs +++ b/vgcodec/src/export.rs @@ -76,5 +76,8 @@ impl Exporter { let result: Vec = bytemuck::cast_slice(&data).to_vec(); let image = RgbaImage::from_raw(self.size.width, self.size.height, result).unwrap(); image.save(save_path).unwrap(); + + drop(data); + self.export_buffer.unmap(); } } -- cgit v1.2.3-70-g09d2