Skip to content

Commit 982103f

Browse files
committed
Implements resource binding.
1 parent 4915a8f commit 982103f

File tree

3 files changed

+145
-70
lines changed

3 files changed

+145
-70
lines changed

wgpu-hal/src/metal/command.rs

Lines changed: 78 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -720,23 +720,32 @@ impl crate::CommandEncoder for super::CommandEncoder {
720720
if let Some(ref encoder) = self.state.render {
721721
let mut changes_sizes_buffer = false;
722722
for index in 0..group.counters.vs.buffers {
723-
let buf = &group.buffers[index as usize];
724-
let mut offset = buf.offset;
725-
if let Some(dyn_index) = buf.dynamic_index {
726-
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
727-
}
728-
encoder.set_vertex_buffer(
729-
(bg_info.base_resource_indices.vs.buffers + index) as u64,
730-
Some(buf.ptr.as_native()),
731-
offset,
732-
);
733-
if let Some(size) = buf.binding_size {
734-
let br = naga::ResourceBinding {
735-
group: group_index,
736-
binding: buf.binding_location,
737-
};
738-
self.state.storage_buffer_length_map.insert(br, size);
739-
changes_sizes_buffer = true;
723+
match &group.buffers[index as usize] {
724+
super::BufferResource::Buffer(binding) => {
725+
let mut offset = binding.offset;
726+
if let Some(dyn_index) = binding.dynamic_index {
727+
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
728+
}
729+
encoder.set_vertex_buffer(
730+
(bg_info.base_resource_indices.vs.buffers + index) as u64,
731+
Some(binding.ptr.as_native()),
732+
offset,
733+
);
734+
if let Some(size) = binding.binding_size {
735+
let br = naga::ResourceBinding {
736+
group: group_index,
737+
binding: binding.binding_location,
738+
};
739+
self.state.storage_buffer_length_map.insert(br, size);
740+
changes_sizes_buffer = true;
741+
}
742+
}
743+
super::BufferResource::AccelerationStructure(ptr) => {
744+
encoder.set_vertex_acceleration_structure(
745+
(bg_info.base_resource_indices.vs.buffers + index) as u64,
746+
Some(ptr.as_native()),
747+
);
748+
}
740749
}
741750
}
742751
if changes_sizes_buffer {
@@ -754,23 +763,32 @@ impl crate::CommandEncoder for super::CommandEncoder {
754763

755764
changes_sizes_buffer = false;
756765
for index in 0..group.counters.fs.buffers {
757-
let buf = &group.buffers[(group.counters.vs.buffers + index) as usize];
758-
let mut offset = buf.offset;
759-
if let Some(dyn_index) = buf.dynamic_index {
760-
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
761-
}
762-
encoder.set_fragment_buffer(
763-
(bg_info.base_resource_indices.fs.buffers + index) as u64,
764-
Some(buf.ptr.as_native()),
765-
offset,
766-
);
767-
if let Some(size) = buf.binding_size {
768-
let br = naga::ResourceBinding {
769-
group: group_index,
770-
binding: buf.binding_location,
771-
};
772-
self.state.storage_buffer_length_map.insert(br, size);
773-
changes_sizes_buffer = true;
766+
match &group.buffers[(group.counters.vs.buffers + index) as usize] {
767+
super::BufferResource::Buffer(binding) => {
768+
let mut offset = binding.offset;
769+
if let Some(dyn_index) = binding.dynamic_index {
770+
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
771+
}
772+
encoder.set_fragment_buffer(
773+
(bg_info.base_resource_indices.fs.buffers + index) as u64,
774+
Some(binding.ptr.as_native()),
775+
offset,
776+
);
777+
if let Some(size) = binding.binding_size {
778+
let br = naga::ResourceBinding {
779+
group: group_index,
780+
binding: binding.binding_location,
781+
};
782+
self.state.storage_buffer_length_map.insert(br, size);
783+
changes_sizes_buffer = true;
784+
}
785+
}
786+
super::BufferResource::AccelerationStructure(ptr) => {
787+
encoder.set_fragment_acceleration_structure(
788+
(bg_info.base_resource_indices.fs.buffers + index) as u64,
789+
Some(ptr.as_native()),
790+
);
791+
}
774792
}
775793
}
776794
if changes_sizes_buffer {
@@ -832,22 +850,32 @@ impl crate::CommandEncoder for super::CommandEncoder {
832850
let mut changes_sizes_buffer = false;
833851
for index in 0..group.counters.cs.buffers {
834852
let buf = &group.buffers[(index_base.buffers + index) as usize];
835-
let mut offset = buf.offset;
836-
if let Some(dyn_index) = buf.dynamic_index {
837-
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
838-
}
839-
encoder.set_buffer(
840-
(bg_info.base_resource_indices.cs.buffers + index) as u64,
841-
Some(buf.ptr.as_native()),
842-
offset,
843-
);
844-
if let Some(size) = buf.binding_size {
845-
let br = naga::ResourceBinding {
846-
group: group_index,
847-
binding: buf.binding_location,
848-
};
849-
self.state.storage_buffer_length_map.insert(br, size);
850-
changes_sizes_buffer = true;
853+
match buf {
854+
super::BufferResource::Buffer(binding) => {
855+
let mut offset = binding.offset;
856+
if let Some(dyn_index) = binding.dynamic_index {
857+
offset += dynamic_offsets[dyn_index as usize] as wgt::BufferAddress;
858+
}
859+
encoder.set_buffer(
860+
(bg_info.base_resource_indices.cs.buffers + index) as u64,
861+
Some(binding.ptr.as_native()),
862+
offset,
863+
);
864+
if let Some(size) = binding.binding_size {
865+
let br = naga::ResourceBinding {
866+
group: group_index,
867+
binding: binding.binding_location,
868+
};
869+
self.state.storage_buffer_length_map.insert(br, size);
870+
changes_sizes_buffer = true;
871+
}
872+
}
873+
super::BufferResource::AccelerationStructure(ptr) => {
874+
encoder.set_acceleration_structure(
875+
(bg_info.base_resource_indices.cs.buffers + index) as u64,
876+
Some(ptr.as_native()),
877+
);
878+
}
851879
}
852880
}
853881
if changes_sizes_buffer {

wgpu-hal/src/metal/device.rs

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,10 @@ impl crate::Device for super::Device {
746746
wgt::StorageTextureAccess::Atomic => true,
747747
};
748748
}
749-
wgt::BindingType::AccelerationStructure { .. } => unimplemented!(),
749+
wgt::BindingType::AccelerationStructure { .. } => {
750+
target.buffer = Some(info.counters.buffers as _);
751+
info.counters.buffers += 1;
752+
}
750753
}
751754
}
752755

@@ -896,18 +899,41 @@ impl crate::Device for super::Device {
896899
// need to be passed to useResource
897900
}
898901
}
902+
wgt::BindingType::AccelerationStructure { .. } => {
903+
let start = entry.resource_index as usize;
904+
let end = start + count as usize;
905+
let acceleration_structures =
906+
&desc.acceleration_structures[start..end];
907+
908+
for (idx, &acceleration_structure) in
909+
acceleration_structures.iter().enumerate()
910+
{
911+
contents[idx] = acceleration_structure.raw.gpu_resource_id();
912+
913+
let use_info = bg
914+
.resources_to_use
915+
.entry(acceleration_structure.as_raw().cast())
916+
.or_default();
917+
use_info.stages |= stages;
918+
use_info.uses |= uses;
919+
use_info.visible_in_compute |=
920+
layout.visibility.contains(wgt::ShaderStages::COMPUTE);
921+
}
922+
}
899923
_ => {
900924
unimplemented!();
901925
}
902926
}
903927

904-
bg.buffers.push(super::BufferResource {
905-
ptr: unsafe { NonNull::new_unchecked(buffer.as_ptr()) },
906-
offset: 0,
907-
dynamic_index: None,
908-
binding_size: None,
909-
binding_location: layout.binding,
910-
});
928+
bg.buffers.push(super::BufferResource::Buffer(
929+
super::BufferResourceBinding {
930+
ptr: unsafe { NonNull::new_unchecked(buffer.as_ptr()) },
931+
offset: 0,
932+
dynamic_index: None,
933+
binding_size: None,
934+
binding_location: layout.binding,
935+
},
936+
));
911937
counter.buffers += 1;
912938

913939
bg.argument_buffers.push(buffer)
@@ -945,17 +971,19 @@ impl crate::Device for super::Device {
945971
}
946972
_ => None,
947973
};
948-
super::BufferResource {
949-
ptr: source.buffer.as_raw(),
950-
offset: source.offset,
951-
dynamic_index: if has_dynamic_offset {
952-
Some(dynamic_offsets_count - 1)
953-
} else {
954-
None
974+
super::BufferResource::Buffer(
975+
super::BufferResourceBinding {
976+
ptr: source.buffer.as_raw(),
977+
offset: source.offset,
978+
dynamic_index: if has_dynamic_offset {
979+
Some(dynamic_offsets_count - 1)
980+
} else {
981+
None
982+
},
983+
binding_size,
984+
binding_location: layout.binding,
955985
},
956-
binding_size,
957-
binding_location: layout.binding,
958-
}
986+
)
959987
}));
960988
counter.buffers += 1;
961989
}
@@ -978,7 +1006,20 @@ impl crate::Device for super::Device {
9781006
);
9791007
counter.textures += 1;
9801008
}
981-
wgt::BindingType::AccelerationStructure { .. } => unimplemented!(),
1009+
wgt::BindingType::AccelerationStructure { .. } => {
1010+
let start = entry.resource_index as usize;
1011+
let end = start + 1;
1012+
bg.buffers.extend(
1013+
desc.acceleration_structures[start..end].iter().map(
1014+
|acceleration_structure| {
1015+
super::BufferResource::AccelerationStructure(
1016+
acceleration_structure.as_raw(),
1017+
)
1018+
},
1019+
),
1020+
);
1021+
counter.buffers += 1;
1022+
}
9821023
}
9831024
}
9841025
}

wgpu-hal/src/metal/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ impl AsNative for AccelerationStructurePtr {
743743
}
744744

745745
#[derive(Debug)]
746-
struct BufferResource {
746+
struct BufferResourceBinding {
747747
ptr: BufferPtr,
748748
offset: wgt::BufferAddress,
749749
dynamic_index: Option<u32>,
@@ -761,6 +761,12 @@ struct BufferResource {
761761
binding_location: u32,
762762
}
763763

764+
#[derive(Debug)]
765+
enum BufferResource {
766+
Buffer(BufferResourceBinding),
767+
AccelerationStructure(AccelerationStructurePtr),
768+
}
769+
764770
#[derive(Debug)]
765771
struct UseResourceInfo {
766772
uses: MTLResourceUsage,

0 commit comments

Comments
 (0)