use nalgebra::{DVector, Vector4};
use wgcore::composer::ComposerExt;
use wgcore::gpu::GpuInstance;
use wgcore::kernel::{KernelInvocationBuilder, KernelInvocationQueue};
use wgcore::tensor::{GpuScalar, GpuVector};
use wgcore::Shader;
use wgpu::{BufferUsages, ComputePipeline};
use wgcore::hot_reloading::HotReloadState;
#[derive(Shader)]
#[shader(
src = "hot_reloading.wgsl",
composable = false
)]
struct ShaderHotReloading {
main: ComputePipeline
}
#[async_std::main]
async fn main() -> anyhow::Result<()> {
let gpu = GpuInstance::new().await?;
let mut kernel = ShaderHotReloading::from_device(gpu.device())?;
let buffer = GpuScalar::init(gpu.device(), 0u32, BufferUsages::STORAGE | BufferUsages::COPY_SRC);
let staging = GpuScalar::init(gpu.device(), 0u32, BufferUsages::COPY_DST | BufferUsages::MAP_READ);
let mut hot_reload = HotReloadState::new()?;
ShaderHotReloading::watch_sources(&mut hot_reload)?;
println!("#############################");
println!("Edit the file `hot_reloading.wgsl`.\nThe updated result will be printed below whenever a change is detected.");
println!("#############################");
for loop_id in 0.. {
hot_reload.update_changes();
match kernel.reload_if_changed(gpu.device(), &hot_reload) {
Ok(changed) => {
if changed || loop_id == 0 {
let mut queue = KernelInvocationQueue::new(gpu.device());
KernelInvocationBuilder::new(&mut queue, &kernel.main)
.bind0([buffer.buffer()])
.queue(1);
let mut encoder = gpu.device().create_command_encoder(&Default::default());
queue.encode(&mut encoder, None);
staging.copy_from(&mut encoder, &buffer);
gpu.queue().submit(Some(encoder.finish()));
let result_read = staging.read(gpu.device()).await.unwrap();
println!("Current result value: {}", result_read[0]);
}
}
Err(e) => {
println!("Hot reloading error: {:?}", e);
}
}
}
Ok(())
}