Skip to content

Commit 28e71af

Browse files
committed
WIP: Adds BLASes to bind group resources_to_use.
1 parent e2a6498 commit 28e71af

File tree

9 files changed

+116
-74
lines changed

9 files changed

+116
-74
lines changed

examples/features/src/ray_cube_fragment/mod.rs

Lines changed: 54 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use bytemuck::{Pod, Zeroable};
22
use glam::{Mat4, Quat, Vec3};
33
use std::ops::IndexMut;
4-
use std::{borrow::Cow, future::Future, iter, mem, pin::Pin, task, time::Instant};
4+
use std::{borrow::Cow, future::Future, iter, mem, pin::Pin, task};
55
use wgpu::util::DeviceExt;
66

77
// from cube
@@ -97,11 +97,8 @@ impl<F: Future<Output = Option<wgpu::Error>>> Future for ErrorFuture<F> {
9797
struct Example {
9898
uniforms: Uniforms,
9999
uniform_buf: wgpu::Buffer,
100-
blas: wgpu::Blas,
101-
tlas_package: wgpu::TlasPackage,
102100
pipeline: wgpu::RenderPipeline,
103101
bind_group: wgpu::BindGroup,
104-
start_inst: Instant,
105102
}
106103

107104
impl crate::framework::Example for Example {
@@ -222,22 +219,46 @@ impl crate::framework::Example for Example {
222219

223220
let bind_group_layout = pipeline.get_bind_group_layout(0);
224221

225-
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
226-
label: None,
227-
layout: &bind_group_layout,
228-
entries: &[
229-
wgpu::BindGroupEntry {
230-
binding: 0,
231-
resource: uniform_buf.as_entire_binding(),
232-
},
233-
wgpu::BindGroupEntry {
234-
binding: 1,
235-
resource: wgpu::BindingResource::AccelerationStructure(&tlas),
236-
},
237-
],
238-
});
222+
let mut tlas_package = wgpu::TlasPackage::new(tlas);
239223

240-
let tlas_package = wgpu::TlasPackage::new(tlas);
224+
// scene update
225+
{
226+
let dist = 12.0;
227+
228+
let side_count = 8;
229+
230+
let anim_time = 0.0;
231+
232+
for x in 0..side_count {
233+
for y in 0..side_count {
234+
let instance = tlas_package.index_mut((x + y * side_count) as usize);
235+
236+
let x = x as f32 / (side_count - 1) as f32;
237+
let y = y as f32 / (side_count - 1) as f32;
238+
let x = x * 2.0 - 1.0;
239+
let y = y * 2.0 - 1.0;
240+
241+
let transform = Mat4::from_rotation_translation(
242+
Quat::from_euler(
243+
glam::EulerRot::XYZ,
244+
anim_time * 0.5 * 0.342,
245+
anim_time * 0.5 * 0.254,
246+
anim_time * 0.5 * 0.832,
247+
),
248+
Vec3 {
249+
x: x * dist,
250+
y: y * dist,
251+
z: -24.0,
252+
},
253+
);
254+
let transform = transform.transpose().to_cols_array()[..12]
255+
.try_into()
256+
.unwrap();
257+
258+
*instance = Some(wgpu::TlasInstance::new(&blas, transform, 0, 0xff));
259+
}
260+
}
261+
}
241262

242263
let mut encoder =
243264
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
@@ -264,16 +285,26 @@ impl crate::framework::Example for Example {
264285

265286
queue.submit(Some(encoder.finish()));
266287

267-
let start_inst = Instant::now();
288+
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
289+
label: None,
290+
layout: &bind_group_layout,
291+
entries: &[
292+
wgpu::BindGroupEntry {
293+
binding: 0,
294+
resource: uniform_buf.as_entire_binding(),
295+
},
296+
wgpu::BindGroupEntry {
297+
binding: 1,
298+
resource: wgpu::BindingResource::AccelerationStructure(tlas_package.tlas()),
299+
},
300+
],
301+
});
268302

269303
Example {
270304
uniforms,
271305
uniform_buf,
272-
blas,
273-
tlas_package,
274306
pipeline,
275307
bind_group,
276-
start_inst,
277308
}
278309
}
279310

@@ -300,50 +331,9 @@ impl crate::framework::Example for Example {
300331
fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, queue: &wgpu::Queue) {
301332
device.push_error_scope(wgpu::ErrorFilter::Validation);
302333

303-
// scene update
304-
{
305-
let dist = 12.0;
306-
307-
let side_count = 8;
308-
309-
let anim_time = self.start_inst.elapsed().as_secs_f64() as f32;
310-
311-
for x in 0..side_count {
312-
for y in 0..side_count {
313-
let instance = self.tlas_package.index_mut((x + y * side_count) as usize);
314-
315-
let x = x as f32 / (side_count - 1) as f32;
316-
let y = y as f32 / (side_count - 1) as f32;
317-
let x = x * 2.0 - 1.0;
318-
let y = y * 2.0 - 1.0;
319-
320-
let transform = Mat4::from_rotation_translation(
321-
Quat::from_euler(
322-
glam::EulerRot::XYZ,
323-
anim_time * 0.5 * 0.342,
324-
anim_time * 0.5 * 0.254,
325-
anim_time * 0.5 * 0.832,
326-
),
327-
Vec3 {
328-
x: x * dist,
329-
y: y * dist,
330-
z: -24.0,
331-
},
332-
);
333-
let transform = transform.transpose().to_cols_array()[..12]
334-
.try_into()
335-
.unwrap();
336-
337-
*instance = Some(wgpu::TlasInstance::new(&self.blas, transform, 0, 0xff));
338-
}
339-
}
340-
}
341-
342334
let mut encoder =
343335
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
344336

345-
encoder.build_acceleration_structures(iter::empty(), iter::once(&self.tlas_package));
346-
347337
{
348338
let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
349339
label: None,

wgpu-core/src/command/ray_tracing.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,20 @@ impl Global {
584584
dependencies.push(blas.clone());
585585
}
586586

587+
let blases = dependencies
588+
.iter()
589+
.map(|blas| blas.try_raw(&snatch_guard).unwrap())
590+
.collect::<Vec<_>>();
591+
let destination_acceleration_structure = tlas.try_raw(&snatch_guard)?;
592+
#[allow(mutable_transmutes)]
593+
let destination_acceleration_structure = unsafe {
594+
core::mem::transmute::<
595+
&dyn hal::DynAccelerationStructure,
596+
&mut dyn hal::DynAccelerationStructure,
597+
>(destination_acceleration_structure)
598+
};
599+
destination_acceleration_structure.set_blases(&blases);
600+
587601
build_command.tlas_s_built.push(TlasBuild {
588602
tlas: tlas.clone(),
589603
dependencies,

wgpu-hal/src/dx12/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,7 +1134,9 @@ pub struct AccelerationStructure {
11341134
allocation: suballocation::Allocation,
11351135
}
11361136

1137-
impl crate::DynAccelerationStructure for AccelerationStructure {}
1137+
impl crate::DynAccelerationStructure for AccelerationStructure {
1138+
fn set_blases(&mut self, _blases: &[&dyn crate::DynAccelerationStructure]) {}
1139+
}
11381140

11391141
impl SwapChain {
11401142
unsafe fn release_resources(mut self) -> Dxgi::IDXGISwapChain3 {

wgpu-hal/src/dynamic/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ macro_rules! impl_dyn_resource {
5151
pub(crate) use impl_dyn_resource;
5252

5353
/// Extension trait for `DynResource` used by implementations of various dynamic resource traits.
54-
trait DynResourceExt {
54+
pub(crate) trait DynResourceExt {
5555
/// # Panics
5656
///
5757
/// - Panics if `self` is not downcastable to `T`.
@@ -104,7 +104,9 @@ impl<R: DynResource + ?Sized> DynResourceExt for R {
104104
}
105105
}
106106

107-
pub trait DynAccelerationStructure: DynResource + fmt::Debug {}
107+
pub trait DynAccelerationStructure: DynResource + fmt::Debug {
108+
fn set_blases(&mut self, blases: &[&dyn DynAccelerationStructure]);
109+
}
108110
pub trait DynBindGroup: DynResource + fmt::Debug {}
109111
pub trait DynBindGroupLayout: DynResource + fmt::Debug {}
110112
pub trait DynBuffer: DynResource + fmt::Debug {}

wgpu-hal/src/gles/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,9 @@ impl crate::DynQuerySet for QuerySet {}
741741
#[derive(Debug)]
742742
pub struct AccelerationStructure;
743743

744-
impl crate::DynAccelerationStructure for AccelerationStructure {}
744+
impl crate::DynAccelerationStructure for AccelerationStructure {
745+
fn set_blases(&mut self, _blases: &[&dyn crate::DynAccelerationStructure]) {}
746+
}
745747

746748
#[derive(Debug)]
747749
pub struct PipelineCache;

wgpu-hal/src/metal/device.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,15 +843,14 @@ impl crate::Device for super::Device {
843843
(entry, layout)
844844
});
845845
for (entry, layout) in layout_and_entry_iter {
846+
let stages = conv::map_render_stages(layout.visibility);
846847
// Bindless path
847848
if layout.count.is_some() {
848849
if !layout.visibility.contains(stage_bit) {
849850
continue;
850851
}
851852

852853
let count = entry.count;
853-
854-
let stages = conv::map_render_stages(layout.visibility);
855854
let uses = conv::map_resource_usage(&layout.ty);
856855

857856
// Create argument buffer for this array
@@ -1012,6 +1011,21 @@ impl crate::Device for super::Device {
10121011
bg.buffers.extend(
10131012
desc.acceleration_structures[start..end].iter().map(
10141013
|acceleration_structure| {
1014+
for blas in acceleration_structure.blases.iter() {
1015+
let use_info = bg
1016+
.resources_to_use
1017+
.entry(
1018+
<super::ResourcePtr as super::AsNative>::from(
1019+
blas,
1020+
),
1021+
)
1022+
.or_default();
1023+
use_info.stages |= stages;
1024+
use_info.uses |= metal::MTLResourceUsage::Read;
1025+
use_info.visible_in_compute |= layout
1026+
.visibility
1027+
.contains(wgt::ShaderStages::COMPUTE);
1028+
}
10151029
super::BufferResource::AccelerationStructure(
10161030
acceleration_structure.as_raw(),
10171031
)
@@ -1656,6 +1670,7 @@ impl crate::Device for super::Device {
16561670
objc::rc::autoreleasepool(|| {
16571671
Ok(super::AccelerationStructure {
16581672
raw: device.new_acceleration_structure_with_size(descriptor.size),
1673+
blases: Vec::new(),
16591674
})
16601675
})
16611676
}

wgpu-hal/src/metal/mod.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ pub struct PipelineLayout {
670670

671671
impl crate::DynPipelineLayout for PipelineLayout {}
672672

673-
trait AsNative {
673+
pub(crate) trait AsNative {
674674
type Native;
675675
fn from(native: &Self::Native) -> Self;
676676
fn as_native(&self) -> &Self::Native;
@@ -1035,6 +1035,7 @@ impl crate::DynPipelineCache for PipelineCache {}
10351035
#[derive(Debug)]
10361036
pub struct AccelerationStructure {
10371037
raw: metal::AccelerationStructure,
1038+
blases: Vec<metal::AccelerationStructure>,
10381039
}
10391040

10401041
impl AccelerationStructure {
@@ -1043,4 +1044,16 @@ impl AccelerationStructure {
10431044
}
10441045
}
10451046

1046-
impl crate::DynAccelerationStructure for AccelerationStructure {}
1047+
impl crate::DynAccelerationStructure for AccelerationStructure {
1048+
fn set_blases(&mut self, blases: &[&dyn crate::DynAccelerationStructure]) {
1049+
use crate::dynamic::DynResourceExt;
1050+
self.blases = blases
1051+
.iter()
1052+
.map(|blas| {
1053+
blas.expect_downcast_ref::<AccelerationStructure>()
1054+
.raw
1055+
.clone()
1056+
})
1057+
.collect::<Vec<_>>();
1058+
}
1059+
}

wgpu-hal/src/noop/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ impl crate::Api for Api {
6060

6161
crate::impl_dyn_resource!(Buffer, CommandBuffer, Context, Fence, Resource);
6262

63-
impl crate::DynAccelerationStructure for Resource {}
63+
impl crate::DynAccelerationStructure for Resource {
64+
fn set_blases(&mut self, _blases: &[&dyn crate::DynAccelerationStructure]) {}
65+
}
6466
impl crate::DynBindGroup for Resource {}
6567
impl crate::DynBindGroupLayout for Resource {}
6668
impl crate::DynBuffer for Buffer {}

wgpu-hal/src/vulkan/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,9 @@ pub struct AccelerationStructure {
773773
compacted_size_query: Option<vk::QueryPool>,
774774
}
775775

776-
impl crate::DynAccelerationStructure for AccelerationStructure {}
776+
impl crate::DynAccelerationStructure for AccelerationStructure {
777+
fn set_blases(&mut self, _blases: &[&dyn crate::DynAccelerationStructure]) {}
778+
}
777779

778780
#[derive(Debug)]
779781
pub struct Texture {

0 commit comments

Comments
 (0)