Open
Description
Hello, running the compute example:
View full code
use emu_core::prelude::*;
use emu_glsl::*;
use zerocopy::*;
#[repr(C)]
#[derive(AsBytes, FromBytes, Copy, Clone, Default, Debug, GlslStruct)]
struct Shape {
x: u32,
y: u32,
w: i32,
h: i32,
r: [i32; 2],
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
// ensure that a device pool has been initialized
// this should be called before every time when you assume you have devices to use
// that goes for both library users and application users
futures::executor::block_on(assert_device_pool_initialized());
println!("{:?}", take()?.lock().unwrap().info.as_ref().unwrap());
// create some data on GPU
// even mutate it once loaded to GPU
let mut shapes: DeviceBox<[Shape]> = vec![Default::default(); 1024].as_device_boxed_mut()?;
let mut x: DeviceBox<[i32]> = vec![0; 1024].as_device_boxed_mut()?;
shapes.set(vec![
Shape {
x: 0,
y: 0,
w: 100,
h: 100,
r: [2, 9]
};
1024
])?;
// compile GslKernel to SPIR-V
// then, we can either inspect the SPIR-V or finish the compilation by generating a DeviceFnMut
// then, run the DeviceFnMut
let c = compile::<GlslKernel, GlslKernelCompile, Vec<u32>, GlobalCache>(
GlslKernel::new()
.spawn(64)
.share("float stuff[64]")
.param_mut::<[Shape], _>("Shape[] shapes")
.param_mut::<[i32], _>("int[] x")
.param::<i32, _>("int scalar")
.with_struct::<Shape>()
.with_const("int c", "7")
.with_helper_code(
r#"
Shape flip(Shape s) {
s.x = s.x + s.w;
s.y = s.y + s.h;
s.w *= -1;
s.h *= -1;
s.r = ivec2(5, 3);
return s;
}
"#,
)
.with_kernel_code(
"shapes[gl_GlobalInvocationID.x] = flip(shapes[gl_GlobalInvocationID.x]); x[gl_GlobalInvocationID.x] = scalar + c + int(gl_WorkGroupID.x);",
),
)?.finish()?;
unsafe {
spawn(16).launch(call!(c, &mut shapes, &mut x, &DeviceBox::new(10)?))?;
}
// download from GPU and print out
println!("{:?}", futures::executor::block_on(shapes.get())?);
println!("{:?}", futures::executor::block_on(x.get())?);
Ok(())
}
$ cargo run
yields
Finished dev [unoptimized + debuginfo] target(s) in 0.44s
Running `target/debug/emu_test`
Limits {
max_bind_groups: 4,
max_dynamic_uniform_buffers_per_pipeline_layout: 8,
max_dynamic_storage_buffers_per_pipeline_layout: 4,
max_sampled_textures_per_shader_stage: 16,
max_samplers_per_shader_stage: 16,
max_storage_buffers_per_shader_stage: 4,
max_storage_textures_per_shader_stage: 4,
max_uniform_buffers_per_shader_stage: 12,
max_uniform_buffer_binding_size: 16384,
max_push_constant_size: 0,
}
{ name: "Intel(R) Iris(TM) Plus Graphics 655", vendor_id: 0, device_id: 0, device_type: IntegratedGpu }
wgpu error: Validation Error
Caused by:
In CommandEncoder::copy_buffer_to_buffer
Copy error
destination buffer/texture is missing the `COPY_DST` usage flag
note: destination = `<Buffer-(4, 1, Metal)>`
thread 'main' panicked at 'Handling wgpu errors as fatal by default', /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:1896:5
stack backtrace:
0: std::panicking::begin_panic
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:616:12
1: wgpu::backend::direct::default_error_handler
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:1896:5
2: core::ops::function::Fn::call
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/ops/function.rs:70:5
3: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/alloc/src/boxed.rs:1875:9
4: wgpu::backend::direct::ErrorSinkRaw::handle_error
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:1883:9
5: wgpu::backend::direct::Context::handle_error
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:109:9
6: wgpu::backend::direct::Context::handle_error_nolabel
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:121:9
7: <wgpu::backend::direct::Context as wgpu::Context>::command_encoder_copy_buffer_to_buffer
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/backend/direct.rs:1542:13
8: wgpu::CommandEncoder::copy_buffer_to_buffer
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.0/src/lib.rs:1954:9
9: emu_core::device::Device::get::{{closure}}
at /Users/wbrickner/.cargo/git/checkouts/emu-7973979264d9dc07/9fe3db3/emu_core/src/device.rs:391:9
10: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/future/mod.rs:91:19
11: emu_core::boxed::<impl emu_core::device::DeviceBox<[T]>>::get::{{closure}}
at /Users/wbrickner/.cargo/git/checkouts/emu-7973979264d9dc07/9fe3db3/emu_core/src/boxed.rs:298:23
12: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/future/mod.rs:91:19
13: futures_executor::local_pool::block_on::{{closure}}
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-executor-0.3.21/src/local_pool.rs:315:23
14: futures_executor::local_pool::run_executor::{{closure}}
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-executor-0.3.21/src/local_pool.rs:90:37
15: std::thread::local::LocalKey<T>::try_with
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/thread/local.rs:442:16
16: std::thread::local::LocalKey<T>::with
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/thread/local.rs:418:9
17: futures_executor::local_pool::run_executor
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-executor-0.3.21/src/local_pool.rs:86:5
18: futures_executor::local_pool::block_on
at /Users/wbrickner/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-executor-0.3.21/src/local_pool.rs:315:5
19: emu_test::main
at ./src/main.rs:71:22
20: core::ops::function::FnOnce::call_once
at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/ops/function.rs:227:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
my understanding is that buffers must have their usage declared correctly (with some amount of detail) at construction time through wgpu
.
Metadata
Metadata
Assignees
Labels
No labels