aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vgcodec/Cargo.lock37
-rw-r--r--vgcodec/Cargo.toml1
-rw-r--r--vgcodec/src/approximate.rs62
-rw-r--r--vgcodec/src/diff.rs2
-rw-r--r--vgcodec/src/diff.wgsl5
-rw-r--r--vgcodec/src/export.rs3
6 files changed, 92 insertions, 18 deletions
diff --git a/vgcodec/Cargo.lock b/vgcodec/Cargo.lock
index 4c7eacf..390443b 100644
--- a/vgcodec/Cargo.lock
+++ b/vgcodec/Cargo.lock
@@ -805,6 +805,12 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -829,6 +835,36 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -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<App>,
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<storage, read_write> exp: atomic<u32>;
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
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<u8> = 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();
}
}