Skip to content

Commit b35df3c

Browse files
committed
[wgpu-hal] Upgrade to ash 0.38
https://github.com/ash-rs/ash/releases/tag/0.38.0 In this release a lot of breaking changes have been made: builder structs are dropped in favour of always having a lifetime parameter available on every raw Vulkan structure (when they contain one or more pointers). This massively contributes to lifetime (and mutable aliasing) safety, but requires significant changes to some uses in `wgpu-hal`. All function pointer loaders for both Vulkan core and extensions have moved into the root of `ash::`, making `ash::vk::` a more pure `sys`-like module. Extensions have their own `ash::<prefix>::<ext>` module to clearly separate and group their items from the core. Besides `NAME` and the usual `*Fn` wrappers, the handwritten `extensions` module is now only available via this path. This to combat the previous inconsistency between `ash::KhrSomeExtFn::name()` vs `ash::extensions::khr::SomeExt::name()`. The Vulkan core clearly splits functions across `device` and `instance` functions, to keep functions that can be loaded without a dispatch-table for a device via `get_device_proc_addr()` apart from instance functions. This concept has now been applied to extension functions, making it possible to load them optimized for a device too (when the shared table would previously include instance functions and require the whole thing to be loaded via `get_instance_proc_addr()`), and in the rare case of 3 hand-written extension wrappers: load instance functions via `get_device_proc_addr()` resulting in `NULL` pointers. Finally, a few new helpers like `_as_slice()` and `_as_c_str()` are available (the former only for statically-sized struct-owned arrays with a length delimiter field) to simplify commonly written patterns.
1 parent 911baf3 commit b35df3c

File tree

10 files changed

+525
-667
lines changed

10 files changed

+525
-667
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ Bottom level categories:
175175
#### Vulkan
176176

177177
- Set object labels when the DEBUG flag is set, even if the VALIDATION flag is disabled. By @DJMcNab in [#5345](https://github.com/gfx-rs/wgpu/pull/5345).
178+
- Upgrade `ash` to `0.38`. By @MarijnS95 in [#5504](https://github.com/gfx-rs/wgpu/pull/5504).
178179

179180
#### Metal
180181

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ objc = "0.2.5"
134134

135135
# Vulkan dependencies
136136
android_system_properties = "0.1.1"
137-
ash = "0.37.3"
137+
# ash = "0.37.3" # TODO: workspace deps are unused?
138138
gpu-alloc = "0.6"
139139
gpu-descriptor = "0.2"
140140

wgpu-hal/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ version = "0.19.0"
114114

115115
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
116116
# backend: Vulkan
117-
ash = { version = "0.37.3", optional = true }
117+
ash = { version = "0.38.0", optional = true }
118118
gpu-alloc = { version = "0.6", optional = true }
119119
gpu-descriptor = { version = "0.2", optional = true }
120120
smallvec = { version = "1", optional = true, features = ["union"] }

wgpu-hal/src/auxil/mod.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,24 +115,3 @@ impl crate::TextureCopy {
115115
self.size = self.size.min(&max_src_size).min(&max_dst_size);
116116
}
117117
}
118-
119-
/// Construct a `CStr` from a byte slice, up to the first zero byte.
120-
///
121-
/// Return a `CStr` extending from the start of `bytes` up to and
122-
/// including the first zero byte. If there is no zero byte in
123-
/// `bytes`, return `None`.
124-
///
125-
/// This can be removed when `CStr::from_bytes_until_nul` is stabilized.
126-
/// ([#95027](https://github.com/rust-lang/rust/issues/95027))
127-
#[allow(dead_code)]
128-
pub(crate) fn cstr_from_bytes_until_nul(bytes: &[std::os::raw::c_char]) -> Option<&std::ffi::CStr> {
129-
if bytes.contains(&0) {
130-
// Safety for `CStr::from_ptr`:
131-
// - We've ensured that the slice does contain a null terminator.
132-
// - The range is valid to read, because the slice covers it.
133-
// - The memory won't be changed, because the slice borrows it.
134-
unsafe { Some(std::ffi::CStr::from_ptr(bytes.as_ptr())) }
135-
} else {
136-
None
137-
}
138-
}

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 177 additions & 202 deletions
Large diffs are not rendered by default.

wgpu-hal/src/vulkan/command.rs

Lines changed: 46 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::conv;
22

33
use arrayvec::ArrayVec;
4-
use ash::{extensions::ext, vk};
4+
use ash::{ext, vk};
55

66
use std::{mem, ops::Range, slice};
77

@@ -40,8 +40,10 @@ impl super::Texture {
4040
}
4141

4242
impl super::DeviceShared {
43-
fn debug_messenger(&self) -> Option<&ext::DebugUtils> {
44-
Some(&self.instance.debug_utils.as_ref()?.extension)
43+
/// Returns loaded [`ext::debug_utils`] for the device
44+
// TODO: Inline this now-shorter function?
45+
fn debug_utils_device(&self) -> Option<&ext::debug_utils::Device> {
46+
self.extension_fns.debug_utils.as_ref()
4547
}
4648
}
4749

@@ -65,31 +67,23 @@ impl crate::CommandEncoder for super::CommandEncoder {
6567

6668
unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> {
6769
if self.free.is_empty() {
68-
let vk_info = vk::CommandBufferAllocateInfo::builder()
70+
let vk_info = vk::CommandBufferAllocateInfo::default()
6971
.command_pool(self.raw)
70-
.command_buffer_count(ALLOCATION_GRANULARITY)
71-
.build();
72+
.command_buffer_count(ALLOCATION_GRANULARITY);
7273
let cmd_buf_vec = unsafe { self.device.raw.allocate_command_buffers(&vk_info)? };
7374
self.free.extend(cmd_buf_vec);
7475
}
7576
let raw = self.free.pop().unwrap();
7677

7778
// Set the name unconditionally, since there might be a
7879
// previous name assigned to this.
79-
unsafe {
80-
self.device.set_object_name(
81-
vk::ObjectType::COMMAND_BUFFER,
82-
raw,
83-
label.unwrap_or_default(),
84-
)
85-
};
80+
unsafe { self.device.set_object_name(raw, label.unwrap_or_default()) };
8681

8782
// Reset this in case the last renderpass was never ended.
8883
self.rpass_debug_marker_active = false;
8984

90-
let vk_info = vk::CommandBufferBeginInfo::builder()
91-
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT)
92-
.build();
85+
let vk_info = vk::CommandBufferBeginInfo::default()
86+
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT);
9387
unsafe { self.device.raw.begin_command_buffer(raw, &vk_info) }?;
9488
self.active = raw;
9589

@@ -140,12 +134,11 @@ impl crate::CommandEncoder for super::CommandEncoder {
140134
dst_stages |= dst_stage;
141135

142136
vk_barriers.push(
143-
vk::BufferMemoryBarrier::builder()
137+
vk::BufferMemoryBarrier::default()
144138
.buffer(bar.buffer.raw)
145139
.size(vk::WHOLE_SIZE)
146140
.src_access_mask(src_access)
147-
.dst_access_mask(dst_access)
148-
.build(),
141+
.dst_access_mask(dst_access),
149142
)
150143
}
151144

@@ -187,14 +180,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
187180
dst_stages |= dst_stage;
188181

189182
vk_barriers.push(
190-
vk::ImageMemoryBarrier::builder()
183+
vk::ImageMemoryBarrier::default()
191184
.image(bar.texture.raw)
192185
.subresource_range(range)
193186
.src_access_mask(src_access)
194187
.dst_access_mask(dst_access)
195188
.old_layout(src_layout)
196-
.new_layout(dst_layout)
197-
.build(),
189+
.new_layout(dst_layout),
198190
);
199191
}
200192

@@ -437,7 +429,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
437429
Some(buffer) => ray_tracing_functions
438430
.buffer_device_address
439431
.get_buffer_device_address(
440-
&vk::BufferDeviceAddressInfo::builder().buffer(buffer.raw),
432+
&vk::BufferDeviceAddressInfo::default().buffer(buffer.raw),
441433
),
442434
None => panic!("Buffers are required to build acceleration structures"),
443435
}
@@ -464,23 +456,24 @@ impl crate::CommandEncoder for super::CommandEncoder {
464456
for desc in descriptors {
465457
let (geometries, ranges) = match *desc.entries {
466458
crate::AccelerationStructureEntries::Instances(ref instances) => {
467-
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::builder(
459+
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::default(
460+
// TODO: Code is so large that rustfmt refuses to treat this... :(
468461
)
469462
.data(vk::DeviceOrHostAddressConstKHR {
470463
device_address: get_device_address(instances.buffer),
471464
});
472465

473-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
466+
let geometry = vk::AccelerationStructureGeometryKHR::default()
474467
.geometry_type(vk::GeometryTypeKHR::INSTANCES)
475468
.geometry(vk::AccelerationStructureGeometryDataKHR {
476-
instances: *instance_data,
469+
instances: instance_data,
477470
});
478471

479-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
472+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
480473
.primitive_count(instances.count)
481474
.primitive_offset(instances.offset);
482475

483-
(smallvec::smallvec![*geometry], smallvec::smallvec![*range])
476+
(smallvec::smallvec![geometry], smallvec::smallvec![range])
484477
}
485478
crate::AccelerationStructureEntries::Triangles(ref in_geometries) => {
486479
let mut ranges = smallvec::SmallVec::<
@@ -491,15 +484,15 @@ impl crate::CommandEncoder for super::CommandEncoder {
491484
>::with_capacity(in_geometries.len());
492485
for triangles in in_geometries {
493486
let mut triangle_data =
494-
vk::AccelerationStructureGeometryTrianglesDataKHR::builder()
487+
vk::AccelerationStructureGeometryTrianglesDataKHR::default()
495488
.vertex_data(vk::DeviceOrHostAddressConstKHR {
496489
device_address: get_device_address(triangles.vertex_buffer),
497490
})
498491
.vertex_format(conv::map_vertex_format(triangles.vertex_format))
499492
.max_vertex(triangles.vertex_count)
500493
.vertex_stride(triangles.vertex_stride);
501494

502-
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::builder();
495+
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::default();
503496

504497
if let Some(ref indices) = triangles.indices {
505498
triangle_data = triangle_data
@@ -523,7 +516,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
523516
ray_tracing_functions
524517
.buffer_device_address
525518
.get_buffer_device_address(
526-
&vk::BufferDeviceAddressInfo::builder()
519+
&vk::BufferDeviceAddressInfo::default()
527520
.buffer(transform.buffer.raw),
528521
)
529522
};
@@ -535,17 +528,17 @@ impl crate::CommandEncoder for super::CommandEncoder {
535528
range = range.transform_offset(transform.offset);
536529
}
537530

538-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
531+
let geometry = vk::AccelerationStructureGeometryKHR::default()
539532
.geometry_type(vk::GeometryTypeKHR::TRIANGLES)
540533
.geometry(vk::AccelerationStructureGeometryDataKHR {
541-
triangles: *triangle_data,
534+
triangles: triangle_data,
542535
})
543536
.flags(conv::map_acceleration_structure_geometry_flags(
544537
triangles.flags,
545538
));
546539

547-
geometries.push(*geometry);
548-
ranges.push(*range);
540+
geometries.push(geometry);
541+
ranges.push(range);
549542
}
550543
(geometries, ranges)
551544
}
@@ -557,25 +550,25 @@ impl crate::CommandEncoder for super::CommandEncoder {
557550
[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER],
558551
>::with_capacity(in_geometries.len());
559552
for aabb in in_geometries {
560-
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::builder()
553+
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::default()
561554
.data(vk::DeviceOrHostAddressConstKHR {
562555
device_address: get_device_address(aabb.buffer),
563556
})
564557
.stride(aabb.stride);
565558

566-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
559+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
567560
.primitive_count(aabb.count)
568561
.primitive_offset(aabb.offset);
569562

570-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
563+
let geometry = vk::AccelerationStructureGeometryKHR::default()
571564
.geometry_type(vk::GeometryTypeKHR::AABBS)
572565
.geometry(vk::AccelerationStructureGeometryDataKHR {
573-
aabbs: *aabbs_data,
566+
aabbs: aabbs_data,
574567
})
575568
.flags(conv::map_acceleration_structure_geometry_flags(aabb.flags));
576569

577-
geometries.push(*geometry);
578-
ranges.push(*range);
570+
geometries.push(geometry);
571+
ranges.push(range);
579572
}
580573
(geometries, ranges)
581574
}
@@ -588,7 +581,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
588581
ray_tracing_functions
589582
.buffer_device_address
590583
.get_buffer_device_address(
591-
&vk::BufferDeviceAddressInfo::builder().buffer(desc.scratch_buffer.raw),
584+
&vk::BufferDeviceAddressInfo::default().buffer(desc.scratch_buffer.raw),
592585
)
593586
};
594587
let ty = match *desc.entries {
@@ -597,7 +590,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
597590
}
598591
_ => vk::AccelerationStructureTypeKHR::BOTTOM_LEVEL,
599592
};
600-
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::builder()
593+
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::default()
601594
.ty(ty)
602595
.mode(conv::map_acceleration_structure_build_mode(desc.mode))
603596
.flags(conv::map_acceleration_structure_flags(desc.flags))
@@ -613,7 +606,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
613606
.raw;
614607
}
615608

616-
geometry_infos.push(*geometry_info);
609+
geometry_infos.push(geometry_info);
617610
}
618611

619612
for (i, geometry_info) in geometry_infos.iter_mut().enumerate() {
@@ -644,10 +637,9 @@ impl crate::CommandEncoder for super::CommandEncoder {
644637
src_stage | vk::PipelineStageFlags::TOP_OF_PIPE,
645638
dst_stage | vk::PipelineStageFlags::BOTTOM_OF_PIPE,
646639
vk::DependencyFlags::empty(),
647-
&[vk::MemoryBarrier::builder()
640+
&[vk::MemoryBarrier::default()
648641
.src_access_mask(src_access)
649-
.dst_access_mask(dst_access)
650-
.build()],
642+
.dst_access_mask(dst_access)],
651643
&[],
652644
&[],
653645
)
@@ -749,17 +741,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
749741
.make_framebuffer(fb_key, raw_pass, desc.label)
750742
.unwrap();
751743

752-
let mut vk_info = vk::RenderPassBeginInfo::builder()
744+
let mut vk_info = vk::RenderPassBeginInfo::default()
753745
.render_pass(raw_pass)
754746
.render_area(render_area)
755747
.clear_values(&vk_clear_values)
756748
.framebuffer(raw_framebuffer);
757749
let mut vk_attachment_info = if caps.imageless_framebuffers {
758-
Some(
759-
vk::RenderPassAttachmentBeginInfo::builder()
760-
.attachments(&vk_image_views)
761-
.build(),
762-
)
750+
Some(vk::RenderPassAttachmentBeginInfo::default().attachments(&vk_image_views))
763751
} else {
764752
None
765753
};
@@ -854,21 +842,21 @@ impl crate::CommandEncoder for super::CommandEncoder {
854842
}
855843

856844
unsafe fn insert_debug_marker(&mut self, label: &str) {
857-
if let Some(ext) = self.device.debug_messenger() {
845+
if let Some(ext) = self.device.debug_utils_device() {
858846
let cstr = self.temp.make_c_str(label);
859-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
847+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
860848
unsafe { ext.cmd_insert_debug_utils_label(self.active, &vk_label) };
861849
}
862850
}
863851
unsafe fn begin_debug_marker(&mut self, group_label: &str) {
864-
if let Some(ext) = self.device.debug_messenger() {
852+
if let Some(ext) = self.device.debug_utils_device() {
865853
let cstr = self.temp.make_c_str(group_label);
866-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
854+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
867855
unsafe { ext.cmd_begin_debug_utils_label(self.active, &vk_label) };
868856
}
869857
}
870858
unsafe fn end_debug_marker(&mut self) {
871-
if let Some(ext) = self.device.debug_messenger() {
859+
if let Some(ext) = self.device.debug_utils_device() {
872860
unsafe { ext.cmd_end_debug_utils_label(self.active) };
873861
}
874862
}

0 commit comments

Comments
 (0)