Skip to content

Commit 5d1c263

Browse files
committed
Memorizes BLAS dependencies of TLAS to call use_resource() in set_bind_group().
1 parent e2a6498 commit 5d1c263

File tree

9 files changed

+68
-17
lines changed

9 files changed

+68
-17
lines changed

wgpu-core/src/command/ray_tracing.rs

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

587+
let dependencies_raw = dependencies
588+
.iter()
589+
.map(|blas| blas.try_raw(&snatch_guard).unwrap())
590+
.collect::<Vec<_>>();
591+
let tlas_raw = tlas.try_raw(&snatch_guard)?;
592+
tlas_raw.set_dependencies(&dependencies_raw);
593+
587594
build_command.tlas_s_built.push(TlasBuild {
588595
tlas: tlas.clone(),
589596
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_dependencies(&self, _dependencies: &[&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_dependencies(&self, dependencies: &[&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_dependencies(&self, _dependencies: &[&dyn crate::DynAccelerationStructure]) {}
746+
}
745747

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

wgpu-hal/src/metal/command.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,19 @@ impl crate::CommandEncoder for super::CommandEncoder {
740740
changes_sizes_buffer = true;
741741
}
742742
}
743-
super::BufferResource::AccelerationStructure(ptr) => {
743+
super::BufferResource::AccelerationStructure(acceleration_structure) => {
744744
encoder.set_vertex_acceleration_structure(
745745
(bg_info.base_resource_indices.vs.buffers + index) as u64,
746-
Some(ptr.as_native()),
746+
Some(acceleration_structure.as_raw().as_native()),
747747
);
748+
let dependencies = acceleration_structure.dependencies.read();
749+
for blas in dependencies.iter() {
750+
encoder.use_resource_at(
751+
&*blas,
752+
metal::MTLResourceUsage::Read,
753+
metal::MTLRenderStages::Vertex,
754+
);
755+
}
748756
}
749757
}
750758
}
@@ -783,11 +791,19 @@ impl crate::CommandEncoder for super::CommandEncoder {
783791
changes_sizes_buffer = true;
784792
}
785793
}
786-
super::BufferResource::AccelerationStructure(ptr) => {
794+
super::BufferResource::AccelerationStructure(acceleration_structure) => {
787795
encoder.set_fragment_acceleration_structure(
788796
(bg_info.base_resource_indices.fs.buffers + index) as u64,
789-
Some(ptr.as_native()),
797+
Some(acceleration_structure.as_raw().as_native()),
790798
);
799+
let dependencies = acceleration_structure.dependencies.read();
800+
for blas in dependencies.iter() {
801+
encoder.use_resource_at(
802+
&*blas,
803+
metal::MTLResourceUsage::Read,
804+
metal::MTLRenderStages::Fragment,
805+
);
806+
}
791807
}
792808
}
793809
}
@@ -870,11 +886,15 @@ impl crate::CommandEncoder for super::CommandEncoder {
870886
changes_sizes_buffer = true;
871887
}
872888
}
873-
super::BufferResource::AccelerationStructure(ptr) => {
889+
super::BufferResource::AccelerationStructure(acceleration_structure) => {
874890
encoder.set_acceleration_structure(
875891
(bg_info.base_resource_indices.cs.buffers + index) as u64,
876-
Some(ptr.as_native()),
892+
Some(acceleration_structure.as_raw().as_native()),
877893
);
894+
let dependencies = acceleration_structure.dependencies.read();
895+
for blas in dependencies.iter() {
896+
encoder.use_resource(&*blas, metal::MTLResourceUsage::Read);
897+
}
878898
}
879899
}
880900
}

wgpu-hal/src/metal/device.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ impl crate::Device for super::Device {
10131013
desc.acceleration_structures[start..end].iter().map(
10141014
|acceleration_structure| {
10151015
super::BufferResource::AccelerationStructure(
1016-
acceleration_structure.as_raw(),
1016+
(*acceleration_structure).clone(),
10171017
)
10181018
},
10191019
),
@@ -1656,6 +1656,7 @@ impl crate::Device for super::Device {
16561656
objc::rc::autoreleasepool(|| {
16571657
Ok(super::AccelerationStructure {
16581658
raw: device.new_acceleration_structure_with_size(descriptor.size),
1659+
dependencies: Arc::new(parking_lot::RwLock::new(Vec::new())),
16591660
})
16601661
})
16611662
}

wgpu-hal/src/metal/mod.rs

Lines changed: 17 additions & 4 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;
@@ -764,7 +764,7 @@ struct BufferResourceBinding {
764764
#[derive(Debug)]
765765
enum BufferResource {
766766
Buffer(BufferResourceBinding),
767-
AccelerationStructure(AccelerationStructurePtr),
767+
AccelerationStructure(AccelerationStructure),
768768
}
769769

770770
#[derive(Debug)]
@@ -1032,9 +1032,10 @@ pub struct PipelineCache;
10321032

10331033
impl crate::DynPipelineCache for PipelineCache {}
10341034

1035-
#[derive(Debug)]
1035+
#[derive(Debug, Clone)]
10361036
pub struct AccelerationStructure {
10371037
raw: metal::AccelerationStructure,
1038+
dependencies: Arc<RwLock<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_dependencies(&self, dependencies: &[&dyn crate::DynAccelerationStructure]) {
1049+
use crate::dynamic::DynResourceExt;
1050+
*self.dependencies.write() = dependencies
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_dependencies(&self, _dependencies: &[&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_dependencies(&self, _dependencies: &[&dyn crate::DynAccelerationStructure]) {}
778+
}
777779

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

0 commit comments

Comments
 (0)