From 2ea9e01e5c1ae1f751e143908355d063636ba35c Mon Sep 17 00:00:00 2001 From: Joshua Groves Date: Sat, 4 Apr 2020 00:38:44 -0230 Subject: [PATCH] Get boids working --- Cargo.toml | 2 +- examples/boids/boids.comp | 5 +++-- examples/boids/boids.comp.spv | Bin 0 -> 5444 bytes examples/boids/main.rs | 35 +++++++++------------------------ examples/boids/shader.frag.spv | Bin 0 -> 336 bytes examples/boids/shader.vert.spv | Bin 0 -> 1684 bytes examples/framework.rs | 3 ++- 7 files changed, 15 insertions(+), 30 deletions(-) create mode 100644 examples/boids/boids.comp.spv create mode 100644 examples/boids/shader.frag.spv create mode 100644 examples/boids/shader.vert.spv diff --git a/Cargo.toml b/Cargo.toml index 6495ddc042..5b5b0d6bda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ cgmath = "0.17" log = "0.4" png = "0.15" winit = { version = "0.22", features = ["web-sys"] } -rand = "0.7.2" +rand = { version = "0.7.2", features = ["wasm-bindgen"] } bytemuck = "1" futures = "0.3" diff --git a/examples/boids/boids.comp b/examples/boids/boids.comp index 4a3d9d10bd..69a4ca6ddf 100644 --- a/examples/boids/boids.comp +++ b/examples/boids/boids.comp @@ -1,7 +1,8 @@ #version 450 -// this shader expects NUM_PARTICLES and PARTICLES_PER_GROUP -// defines to be inserted by main.rs +// These should match the Rust constants defined in main.rs +#define NUM_PARTICLES 1500 +#define PARTICLES_PER_GROUP 64 layout(local_size_x = PARTICLES_PER_GROUP) in; diff --git a/examples/boids/boids.comp.spv b/examples/boids/boids.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..cadd91ef222be77360dfc232fc39d1b26de64356 GIT binary patch literal 5444 zcmZ{n`Ipya6~{lrERu|h3W^)fU=azSETW|-1T<1m=qTDIew`U<>N_*Y45Q_STWX7@ z*+!c!E?JOR6uIP9uAsL5@`q5wAjfFL4ie;!f?wXTZIKL)@t`5r1&24I#bHA$k|ks`8WaF70$lMIg{=)-a4lv z#yB^w?CaqT4|AKvwqmaX4<-6JK ze(_As^t>*_)rHNERw?pFVt)WFc8~r8(JhGl>6Psna`Ul`wQnxt4?^pckKf;}R~gtD zRB;&i2(llE?m|4%-f3H-IjrBh}zr8osv*MozPP}z4KwJx$J>x!F;tAdyCu3WG7m^$w2it?$bkZ3y&-;lv zK8xQvjP)Mc&X1h_b1H0(oUy6mVh>^ajdj~l0X5M>{{rmPU_q<(T z@09b@yOE;U{4v&U*dLoNGCA??ZbpIq$0NY|ACrf50n{1!Q&> zopm|SP?m8M=Ig_CUm?qt7jzG#x|-<-PN zzc;Zxf7K+rr?OX4wcpXfh~Jvu*K%sMr-vZ&XL3XDqaELLu-q>8`<)$*$oZYTM*K{) z>rHa$^LI?nK8fGrwZwACIR|Xcl~nGx@j=AzsTp3&quJ6 zN8h|E);uR7`px5;Xp4OhzcsOM5$rnz`v%rzjQtO`_u@CW-%_;qRR5pam!VHZT>4K# z>sMQU7y4s}Id)gQJ-y=muI;DxDTuk;E6(0C!0x?@INxwNBA4Er3AQ&6RJqS8ecoZ> z-BzMqo}+ICBIh|`YqoxE`JB5N?74ZnHQ@AIUpHc`J^v)4-@ZAQ+R1Y^xSnS%cJk<} zzul*>^_$0e*3KE92AezfIYM9x}` z*C*#Y<$QI{|01}4{+F=peYprbeKA&l`f@SYzHCCwXI~n~#Yp;c3D_L+_N5=~vM>7j z5IOrIPF(}wdR>=dTh|R$Up9k{kBR_GKE2oiHix{u*ot=93w@U%a`r-;x<>G?2Epu5IOUR(}!!oeh~j{kBXS$6nYpgw%r#Hm%KNC>$7$vwsG?L2Iah8>QbkUo51!o_xlD|F88|y?DBs4Zbsz1pEz~g3id6N z_nTnz=6>G-%jJIG2FoeA-*>>~(U;kfv-X^+&Y8D??P=!vyI|+~cElL_dIutZTh+rm zOFY3R&-dW`-je70VDsFCB+n1P^2zf0gQ+dl%EUteAM?A{4c?Bo&0s3h5i-Nf~-OGCGOYY#M#5& zAjW+H(bvgeVflLzdEda81;{-}?r|U3GmJ|;ayjRIu;-*VzXjWyZp0YRcmR=4&fkIE zC!ajO2m1}A4?Dqf#(J(kInUXJ{sSV{iR7FID?Yz}4`IvgM*PnIgm(EI==&og=XW4Z z?mvT*+q1RzAkJ{&)rtR0Ek3pEg_D1ndJjYY6_GQKwLF4$S&P1h5jkrSC-sr@_`@Zu_F0z9e3q_`ib_ zpIZI_C!fAN1C~o)o&&qAMc=cCoVAFP`+0D3TZ?x3l6bY}cA#HErdGD!&C7`U^WTfF qfcGQLt+8tJ${U+J{{+|b{0n<7l05$gCy%l75c9|z>;HG0hP(|V*ZAlF literal 0 HcmV?d00001 diff --git a/examples/boids/main.rs b/examples/boids/main.rs index 2cec94bebb..d171786e67 100644 --- a/examples/boids/main.rs +++ b/examples/boids/main.rs @@ -6,8 +6,6 @@ extern crate rand; #[path = "../framework.rs"] mod framework; -use std::fmt::Write; - use wgpu::vertex_attr_array; // number of boid particles to simulate @@ -35,34 +33,19 @@ impl framework::Example for Example { sc_desc: &wgpu::SwapChainDescriptor, device: &wgpu::Device, ) -> (Self, Option) { - // loads comp shader source and adds shared constants as defines to comp shader - - const BOIDS_SOURCE: &str = include_str!("boids.comp"); - const HEADER: &str = "#version 450"; - assert_eq!(BOIDS_SOURCE.lines().next(), Some(HEADER)); - - let mut boids_source_str = String::from(HEADER); - write!( - boids_source_str, - "\n#define NUM_PARTICLES {}\n#define PARTICLES_PER_GROUP {}", - NUM_PARTICLES, PARTICLES_PER_GROUP - ) - .unwrap(); - boids_source_str += &BOIDS_SOURCE[HEADER.len()..]; - // load (and compile) shaders and create shader modules - let boids = framework::load_glsl(&boids_source_str, framework::ShaderStage::Compute); - let boids_module = device.create_shader_module(&boids); + let boids = include_bytes!("boids.comp.spv"); + let boids_module = device + .create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&boids[..])).unwrap()); - let vs = framework::load_glsl(include_str!("shader.vert"), framework::ShaderStage::Vertex); - let vs_module = device.create_shader_module(&vs); + let vs = include_bytes!("shader.vert.spv"); + let vs_module = + device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&vs[..])).unwrap()); - let fs = framework::load_glsl( - include_str!("shader.frag"), - framework::ShaderStage::Fragment, - ); - let fs_module = device.create_shader_module(&fs); + let fs = include_bytes!("shader.frag.spv"); + let fs_module = + device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&fs[..])).unwrap()); // create compute bind layout group and compute pipeline layout diff --git a/examples/boids/shader.frag.spv b/examples/boids/shader.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..3b3d8fbd71aa5caddb46b0f72484b62483cbc60a GIT binary patch literal 336 zcmYk2%?`m(6od~|O2tnk?4)8z!~&5>SXgw^ohN7_M1m&e0X&+}vd@qeY;HU+0J`JK`PCbxY~1 rA6KTd5nSFHFnesqxa13gw0|tPpUzgUO8YMqpT34EQ+sdz)DnCE5W*4Y literal 0 HcmV?d00001 diff --git a/examples/boids/shader.vert.spv b/examples/boids/shader.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..3e95e49fbd63255d50a8008f0b1a3f9ea2850516 GIT binary patch literal 1684 zcmZ9LTTc^F6h@Df0t$kNfEUyv-ch^(qR356@PP*m39qEV37KRpgx19PqQ>~g{8he~ zxYp^M(r}vHz4!O+>zSEK&rE*^XZQ_-x1oJTLl1rkgP||#&8?lSxn}Fr-2B2*BZfmI z1{yOG&PKbJ|IhWjp)-hFM&^+vq{6QU{fC5V=;e13t3QBWZyXdEx=K&;>w8D_<5s?3 zWV=}r@k*FPA00Mh4eJww*Uov4J}CCKv*X?DxRrgyrBYuI_sAVK^HzS?0PT;s^G7^y zw081uw(oGx3-_+bkKX6aR=u&GbvU<|`%)AguF8(?>v0G7KG}iR_?ztNZZ{Bn>$``( z{XUSH<~7cfFyqD42{T8`c@m~A<{fXsSkE|nIg`CSW1!;G#F(Q!fz^kuMd{_1LKLw{ z@_o|U#@6u9p`Ay3x%AVF7Q@AF@G4_d}}6tw8X4Gf$a?4^}R21oX3~Z zTz8$~|5@o<;|7eorx-cKx-Zb~EbrX)6(ImPMYi_vg$W@xLHdw6)#W??J8a9r)hsZxH33jUe8$cez50{VpKlDdr-! zG2TUr8N(JIqMA9E5O=tOm@ogmtT&D=zsiKpqn~OU?{nzxe-&Rm^}2>_-VmMaHHFyA z`Q?7Ii}-cKT=`Vrchvgbv){xQPxWiq-SwyOt?x`VB-Ou#ZLa*UvgZu8edSWm+t{af zx&tPjdfvtE?s*SC^^{9J?_--QpXxurKE2aJF!5A>7Q4ItBYf+7XL70jV{CKff0jGV zVcS=38_aL!3F5ADK1bgpG5g8CM8uN+3VR8$ru=Kf81au~pOq3vb+FYEbJlI%E#LDs d#8^4M4ZjEPVm<2i_vSa{TpMWP|FP{7@*kECVD|t3 literal 0 HcmV?d00001 diff --git a/examples/framework.rs b/examples/framework.rs index 4445318068..a6702c7ece 100644 --- a/examples/framework.rs +++ b/examples/framework.rs @@ -94,7 +94,8 @@ async fn run_async(event_loop: EventLoop<()>, window: Window) { *control_flow = if cfg!(feature = "metal-auto-capture") { ControlFlow::Exit } else { - ControlFlow::Poll + // TODO: ControlFlow::Poll + ControlFlow::Wait }; match event { event::Event::MainEventsCleared => window.request_redraw(),