mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-01-09 18:28:10 -05:00
100 lines
3.0 KiB
Rust
100 lines
3.0 KiB
Rust
use crate::ray_tracing::AsBuildContext;
|
|
use wgpu::{
|
|
include_wgsl, BindGroupDescriptor, BindGroupEntry, BindingResource, BufferDescriptor,
|
|
CommandEncoderDescriptor, ComputePassDescriptor, ComputePipelineDescriptor,
|
|
};
|
|
use wgpu::{AccelerationStructureFlags, BufferUsages};
|
|
use wgpu_macros::gpu_test;
|
|
use wgpu_test::{GpuTestConfiguration, TestParameters, TestingContext};
|
|
|
|
const STRUCT_SIZE: wgpu::BufferAddress = 176;
|
|
|
|
#[gpu_test]
|
|
static ACCESS_ALL_STRUCT_MEMBERS: GpuTestConfiguration = GpuTestConfiguration::new()
|
|
.parameters(TestParameters::default().test_features_limits().features(
|
|
wgpu::Features::EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE
|
|
| wgpu::Features::EXPERIMENTAL_RAY_QUERY,
|
|
))
|
|
.run_sync(access_all_struct_members);
|
|
|
|
fn access_all_struct_members(ctx: TestingContext) {
|
|
let buf = ctx.device.create_buffer(&BufferDescriptor {
|
|
label: None,
|
|
size: STRUCT_SIZE,
|
|
usage: BufferUsages::STORAGE,
|
|
mapped_at_creation: false,
|
|
});
|
|
//
|
|
// Create a clean `AsBuildContext`
|
|
//
|
|
|
|
let as_ctx = AsBuildContext::new(
|
|
&ctx,
|
|
AccelerationStructureFlags::empty(),
|
|
AccelerationStructureFlags::empty(),
|
|
);
|
|
|
|
let mut encoder_build = ctx
|
|
.device
|
|
.create_command_encoder(&CommandEncoderDescriptor {
|
|
label: Some("Build"),
|
|
});
|
|
|
|
encoder_build
|
|
.build_acceleration_structures([&as_ctx.blas_build_entry()], [&as_ctx.tlas_package]);
|
|
|
|
ctx.queue.submit([encoder_build.finish()]);
|
|
|
|
//
|
|
// Create shader to use tlas with
|
|
//
|
|
|
|
let shader = ctx
|
|
.device
|
|
.create_shader_module(include_wgsl!("shader.wgsl"));
|
|
let compute_pipeline = ctx
|
|
.device
|
|
.create_compute_pipeline(&ComputePipelineDescriptor {
|
|
label: None,
|
|
layout: None,
|
|
module: &shader,
|
|
entry_point: Some("all_of_struct"),
|
|
compilation_options: Default::default(),
|
|
cache: None,
|
|
});
|
|
|
|
let bind_group = ctx.device.create_bind_group(&BindGroupDescriptor {
|
|
label: None,
|
|
layout: &compute_pipeline.get_bind_group_layout(0),
|
|
entries: &[
|
|
BindGroupEntry {
|
|
binding: 0,
|
|
resource: BindingResource::AccelerationStructure(as_ctx.tlas_package.tlas()),
|
|
},
|
|
BindGroupEntry {
|
|
binding: 1,
|
|
resource: BindingResource::Buffer(buf.as_entire_buffer_binding()),
|
|
},
|
|
],
|
|
});
|
|
|
|
//
|
|
// Submit once to check for no issues
|
|
//
|
|
|
|
let mut encoder_compute = ctx
|
|
.device
|
|
.create_command_encoder(&CommandEncoderDescriptor::default());
|
|
{
|
|
let mut pass = encoder_compute.begin_compute_pass(&ComputePassDescriptor {
|
|
label: None,
|
|
timestamp_writes: None,
|
|
});
|
|
pass.set_pipeline(&compute_pipeline);
|
|
pass.set_bind_group(0, Some(&bind_group), &[]);
|
|
pass.dispatch_workgroups(1, 1, 1)
|
|
}
|
|
|
|
ctx.queue.submit([encoder_compute.finish()]);
|
|
}
|