Skip to content

Commit 1d15189

Browse files
committed
Added errors!
1 parent 1e01e16 commit 1d15189

9 files changed

+896
-862
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
/target
1+
/target
22
Cargo.lock

Cargo.toml

+28-28
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
1-
[package]
2-
name = "bevy_app_compute"
3-
version = "0.10.2"
4-
authors = ["Kjolnyr <[email protected]>"]
5-
edition = "2021"
6-
description = "App compute plugin for Bevy"
7-
repository = "https://github.com/Kjolnyr/bevy_app_compute"
8-
homepage = "https://github.com/Kjolnyr/bevy_app_compute"
9-
documentation = "https://docs.rs/bevy_app_compute"
10-
license = "MIT OR Apache-2.0"
11-
readme = "README.md"
12-
categories = ["game-development"]
13-
14-
15-
[dependencies]
16-
bevy = "0.10"
17-
parking_lot = "0.12.1"
18-
wgpu = "0.15.1"
19-
codespan-reporting = "0.11.1"
20-
futures-lite = "1.13.0"
21-
22-
[[example]]
23-
name = "simple"
24-
25-
[[example]]
26-
name = "multi_pass"
27-
28-
[[example]]
1+
[package]
2+
name = "bevy_app_compute"
3+
version = "0.10.2"
4+
authors = ["Kjolnyr <[email protected]>"]
5+
edition = "2021"
6+
description = "App compute plugin for Bevy"
7+
repository = "https://github.com/Kjolnyr/bevy_app_compute"
8+
homepage = "https://github.com/Kjolnyr/bevy_app_compute"
9+
documentation = "https://docs.rs/bevy_app_compute"
10+
license = "MIT OR Apache-2.0"
11+
readme = "README.md"
12+
categories = ["game-development"]
13+
14+
15+
[dependencies]
16+
bevy = "0.10"
17+
parking_lot = "0.12.1"
18+
wgpu = "0.15.1"
19+
codespan-reporting = "0.11.1"
20+
futures-lite = "1.13.0"
21+
22+
[[example]]
23+
name = "simple"
24+
25+
[[example]]
26+
name = "multi_pass"
27+
28+
[[example]]
2929
name = "one_shot"

examples/multi_pass.rs

+63-63
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,63 @@
1-
//! Example showing how to have multiple passes
2-
3-
use bevy::{prelude::*, reflect::TypeUuid, render::render_resource::ShaderRef};
4-
use bevy_app_compute::prelude::*;
5-
6-
#[derive(TypeUuid)]
7-
#[uuid = "5a4f7163-88cd-4a59-94c7-fb51abe389b8"]
8-
struct FirstPassShader;
9-
10-
impl ComputeShader for FirstPassShader {
11-
fn shader() -> ShaderRef {
12-
"shaders/first_pass.wgsl".into()
13-
}
14-
}
15-
16-
#[derive(TypeUuid)]
17-
#[uuid = "7ada0206-7871-404b-b197-5e2477e7073f"]
18-
struct SecondPassShader;
19-
20-
impl ComputeShader for SecondPassShader {
21-
fn shader() -> ShaderRef {
22-
"shaders/second_pass.wgsl".into()
23-
}
24-
}
25-
26-
#[derive(Resource)]
27-
struct SimpleComputeWorker;
28-
29-
impl ComputeWorker for SimpleComputeWorker {
30-
fn build(world: &mut World) -> AppComputeWorker<Self> {
31-
let worker = AppComputeWorkerBuilder::new(world)
32-
.add_uniform("value", &3.)
33-
.add_storage("input", &[1., 2., 3., 4.])
34-
.add_staging("output", &[0f32; 4])
35-
.add_pass::<FirstPassShader>([4, 1, 1], &["value", "input", "output"]) // add each item + `value` from `input` to `output`
36-
.add_pass::<SecondPassShader>([4, 1, 1], &["output"]) // multiply each element of `output` by itself
37-
.build();
38-
39-
// [1. + 3., 2. + 3., 3. + 3., 4. + 3.] = [4., 5., 6., 7.]
40-
// [4. * 4., 5. * 5., 6. * 6., 7. * 7.] = [16., 25., 36., 49.]
41-
42-
worker
43-
}
44-
}
45-
46-
fn main() {
47-
App::new()
48-
.add_plugins(DefaultPlugins)
49-
.add_plugin(AppComputePlugin)
50-
.add_plugin(AppComputeWorkerPlugin::<SimpleComputeWorker>::default())
51-
.add_system(test)
52-
.run();
53-
}
54-
55-
fn test(compute_worker: Res<AppComputeWorker<SimpleComputeWorker>>) {
56-
if !compute_worker.ready() {
57-
return;
58-
};
59-
60-
let result: Vec<f32> = compute_worker.read("output");
61-
62-
println!("got {:?}", result) // [16., 25., 36., 49.]
63-
}
1+
//! Example showing how to have multiple passes
2+
3+
use bevy::{prelude::*, reflect::TypeUuid, render::render_resource::ShaderRef};
4+
use bevy_app_compute::prelude::*;
5+
6+
#[derive(TypeUuid)]
7+
#[uuid = "5a4f7163-88cd-4a59-94c7-fb51abe389b8"]
8+
struct FirstPassShader;
9+
10+
impl ComputeShader for FirstPassShader {
11+
fn shader() -> ShaderRef {
12+
"shaders/first_pass.wgsl".into()
13+
}
14+
}
15+
16+
#[derive(TypeUuid)]
17+
#[uuid = "7ada0206-7871-404b-b197-5e2477e7073f"]
18+
struct SecondPassShader;
19+
20+
impl ComputeShader for SecondPassShader {
21+
fn shader() -> ShaderRef {
22+
"shaders/second_pass.wgsl".into()
23+
}
24+
}
25+
26+
#[derive(Resource)]
27+
struct SimpleComputeWorker;
28+
29+
impl ComputeWorker for SimpleComputeWorker {
30+
fn build(world: &mut World) -> AppComputeWorker<Self> {
31+
let worker = AppComputeWorkerBuilder::new(world)
32+
.add_uniform("value", &3.)
33+
.add_storage("input", &[1., 2., 3., 4.])
34+
.add_staging("output", &[0f32; 4])
35+
.add_pass::<FirstPassShader>([4, 1, 1], &["value", "input", "output"]) // add each item + `value` from `input` to `output`
36+
.add_pass::<SecondPassShader>([4, 1, 1], &["output"]) // multiply each element of `output` by itself
37+
.build();
38+
39+
// [1. + 3., 2. + 3., 3. + 3., 4. + 3.] = [4., 5., 6., 7.]
40+
// [4. * 4., 5. * 5., 6. * 6., 7. * 7.] = [16., 25., 36., 49.]
41+
42+
worker
43+
}
44+
}
45+
46+
fn main() {
47+
App::new()
48+
.add_plugins(DefaultPlugins)
49+
.add_plugin(AppComputePlugin)
50+
.add_plugin(AppComputeWorkerPlugin::<SimpleComputeWorker>::default())
51+
.add_system(test)
52+
.run();
53+
}
54+
55+
fn test(compute_worker: Res<AppComputeWorker<SimpleComputeWorker>>) {
56+
if !compute_worker.ready() {
57+
return;
58+
};
59+
60+
let result: Vec<f32> = compute_worker.read("output").unwrap();
61+
62+
println!("got {:?}", result) // [16., 25., 36., 49.]
63+
}

examples/one_shot.rs

+63-63
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,63 @@
1-
//! Example showing how to execute compute shaders on demand
2-
3-
use bevy::{prelude::*, reflect::TypeUuid, render::render_resource::ShaderRef};
4-
use bevy_app_compute::prelude::*;
5-
6-
#[derive(TypeUuid)]
7-
#[uuid = "2545ae14-a9bc-4f03-9ea4-4eb43d1075a7"]
8-
struct SimpleShader;
9-
10-
impl ComputeShader for SimpleShader {
11-
fn shader() -> ShaderRef {
12-
"shaders/simple.wgsl".into()
13-
}
14-
}
15-
16-
#[derive(Resource)]
17-
struct SimpleComputeWorker;
18-
19-
impl ComputeWorker for SimpleComputeWorker {
20-
fn build(world: &mut World) -> AppComputeWorker<Self> {
21-
let worker = AppComputeWorkerBuilder::new(world)
22-
.add_uniform("uni", &5.)
23-
.add_staging("values", &[1., 2., 3., 4.])
24-
.add_pass::<SimpleShader>([4, 1, 1], &["uni", "values"])
25-
.one_shot()
26-
.build();
27-
28-
worker
29-
}
30-
}
31-
32-
fn main() {
33-
App::new()
34-
.add_plugins(DefaultPlugins)
35-
.add_plugin(AppComputePlugin)
36-
.add_plugin(AppComputeWorkerPlugin::<SimpleComputeWorker>::default())
37-
.add_system(on_click_compute)
38-
.add_system(read_data)
39-
.run();
40-
}
41-
42-
fn on_click_compute(
43-
buttons: Res<Input<MouseButton>>,
44-
mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>,
45-
) {
46-
if !buttons.just_pressed(MouseButton::Left) {
47-
return;
48-
}
49-
50-
compute_worker.execute();
51-
}
52-
53-
fn read_data(mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>) {
54-
if !compute_worker.ready() {
55-
return;
56-
};
57-
58-
let result: Vec<f32> = compute_worker.read("values");
59-
60-
compute_worker.write("values", &result);
61-
62-
println!("got {:?}", result)
63-
}
1+
//! Example showing how to execute compute shaders on demand
2+
3+
use bevy::{prelude::*, reflect::TypeUuid, render::render_resource::ShaderRef};
4+
use bevy_app_compute::prelude::*;
5+
6+
#[derive(TypeUuid)]
7+
#[uuid = "2545ae14-a9bc-4f03-9ea4-4eb43d1075a7"]
8+
struct SimpleShader;
9+
10+
impl ComputeShader for SimpleShader {
11+
fn shader() -> ShaderRef {
12+
"shaders/simple.wgsl".into()
13+
}
14+
}
15+
16+
#[derive(Resource)]
17+
struct SimpleComputeWorker;
18+
19+
impl ComputeWorker for SimpleComputeWorker {
20+
fn build(world: &mut World) -> AppComputeWorker<Self> {
21+
let worker = AppComputeWorkerBuilder::new(world)
22+
.add_uniform("uni", &5.)
23+
.add_staging("values", &[1., 2., 3., 4.])
24+
.add_pass::<SimpleShader>([4, 1, 1], &["uni", "values"])
25+
.one_shot()
26+
.build();
27+
28+
worker
29+
}
30+
}
31+
32+
fn main() {
33+
App::new()
34+
.add_plugins(DefaultPlugins)
35+
.add_plugin(AppComputePlugin)
36+
.add_plugin(AppComputeWorkerPlugin::<SimpleComputeWorker>::default())
37+
.add_system(on_click_compute)
38+
.add_system(read_data)
39+
.run();
40+
}
41+
42+
fn on_click_compute(
43+
buttons: Res<Input<MouseButton>>,
44+
mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>,
45+
) {
46+
if !buttons.just_pressed(MouseButton::Left) {
47+
return;
48+
}
49+
50+
compute_worker.execute();
51+
}
52+
53+
fn read_data(mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>) {
54+
if !compute_worker.ready() {
55+
return;
56+
};
57+
58+
let result: Vec<f32> = compute_worker.read("values").unwrap();
59+
60+
compute_worker.write("values", &result).ok();
61+
62+
println!("got {:?}", result)
63+
}

examples/simple.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ fn test(mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>) {
4242
return;
4343
};
4444

45-
let result: Vec<f32> = compute_worker.read("values");
45+
let result: Vec<f32> = compute_worker.read("values").unwrap();
4646

47-
compute_worker.write("values", &[2., 3., 4., 5.]);
47+
compute_worker.write("values", &[2., 3., 4., 5.]).ok();
4848

4949
println!("got {:?}", result)
5050
}

src/error.rs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
pub type Result<T> = std::result::Result<T, Error>;
2+
3+
#[derive(Debug)]
4+
pub enum Error {
5+
BufferNotFound(String),
6+
StagingBufferNotFound(String),
7+
PipelinesEmpty,
8+
PipelineNotReady,
9+
EncoderIsNone
10+
}
11+
12+
impl std::error::Error for Error {}
13+
14+
15+
impl std::fmt::Display for Error {
16+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17+
match self {
18+
Error::BufferNotFound(name) => write!(f, "Buffer {name} not found."),
19+
Error::StagingBufferNotFound(name) => write!(f, "Staging buffer {name} not found."),
20+
Error::PipelinesEmpty => write!(f, "Missing pipelines. Have you added your shader plugins?"),
21+
Error::PipelineNotReady => write!(f, "Pipeline isn't ready yet."),
22+
Error::EncoderIsNone => write!(f, "The command encoder hasn't been initialized."),
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)