Files
wgpu/tests/gpu-tests/ray_tracing/shader.rs
2025-03-04 20:06:44 +01:00

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()]);
}