Skip to content

Commit ac2d633

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 fb3b33d commit ac2d633

File tree

10 files changed

+602
-709
lines changed

10 files changed

+602
-709
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ By @atlv24 and @cwfitzgerald in [#5154](https://github.com/gfx-rs/wgpu/pull/5154
246246
- 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).
247247
- Add safety check to `wgpu_hal::vulkan::CommandEncoder` to make sure `discard_encoding` is not called in the closed state. By @villuna in [#5557](https://github.com/gfx-rs/wgpu/pull/5557)
248248
- Fix SPIR-V type capability requests to not depend on `LocalType` caching. By @atlv24 in [#5590](https://github.com/gfx-rs/wgpu/pull/5590)
249+
- Upgrade `ash` to `0.38`. By @MarijnS95 in [#5504](https://github.com/gfx-rs/wgpu/pull/5504).
249250

250251
#### Tests
251252

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.38.0"
138138
gpu-alloc = "0.6"
139139
gpu-descriptor = "0.3"
140140

wgpu-hal/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ gles = [
5151
"khronos-egl",
5252
"libloading",
5353
"ndk-sys",
54+
"winapi/libloaderapi",
5455
]
5556
dx12 = [
5657
"naga/hlsl-out",
@@ -114,7 +115,7 @@ version = "0.20.0"
114115

115116
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
116117
# backend: Vulkan
117-
ash = { version = "0.37.3", optional = true }
118+
ash = { version = "0.38.0", optional = true }
118119
gpu-alloc = { version = "0.6", optional = true }
119120
gpu-descriptor = { version = "0.3", optional = true }
120121
smallvec = { version = "1", optional = true, features = ["union"] }
@@ -142,7 +143,6 @@ glutin_wgl_sys = { version = "0.5", optional = true }
142143

143144
winapi = { version = "0.3", features = [
144145
"profileapi",
145-
"libloaderapi",
146146
"windef",
147147
"winuser",
148148
"dcomp",

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: 209 additions & 237 deletions
Large diffs are not rendered by default.

wgpu-hal/src/vulkan/command.rs

Lines changed: 42 additions & 62 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::vk;
55

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

@@ -39,12 +39,6 @@ impl super::Texture {
3939
}
4040
}
4141

42-
impl super::DeviceShared {
43-
fn debug_messenger(&self) -> Option<&ext::DebugUtils> {
44-
Some(&self.instance.debug_utils.as_ref()?.extension)
45-
}
46-
}
47-
4842
impl super::CommandEncoder {
4943
fn write_pass_end_timestamp_if_requested(&mut self) {
5044
if let Some((query_set, index)) = self.end_of_pass_timer_query.take() {
@@ -65,31 +59,23 @@ impl crate::CommandEncoder for super::CommandEncoder {
6559

6660
unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> {
6761
if self.free.is_empty() {
68-
let vk_info = vk::CommandBufferAllocateInfo::builder()
62+
let vk_info = vk::CommandBufferAllocateInfo::default()
6963
.command_pool(self.raw)
70-
.command_buffer_count(ALLOCATION_GRANULARITY)
71-
.build();
64+
.command_buffer_count(ALLOCATION_GRANULARITY);
7265
let cmd_buf_vec = unsafe { self.device.raw.allocate_command_buffers(&vk_info)? };
7366
self.free.extend(cmd_buf_vec);
7467
}
7568
let raw = self.free.pop().unwrap();
7669

7770
// Set the name unconditionally, since there might be a
7871
// 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-
};
72+
unsafe { self.device.set_object_name(raw, label.unwrap_or_default()) };
8673

8774
// Reset this in case the last renderpass was never ended.
8875
self.rpass_debug_marker_active = false;
8976

90-
let vk_info = vk::CommandBufferBeginInfo::builder()
91-
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT)
92-
.build();
77+
let vk_info = vk::CommandBufferBeginInfo::default()
78+
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT);
9379
unsafe { self.device.raw.begin_command_buffer(raw, &vk_info) }?;
9480
self.active = raw;
9581

@@ -145,12 +131,11 @@ impl crate::CommandEncoder for super::CommandEncoder {
145131
dst_stages |= dst_stage;
146132

147133
vk_barriers.push(
148-
vk::BufferMemoryBarrier::builder()
134+
vk::BufferMemoryBarrier::default()
149135
.buffer(bar.buffer.raw)
150136
.size(vk::WHOLE_SIZE)
151137
.src_access_mask(src_access)
152-
.dst_access_mask(dst_access)
153-
.build(),
138+
.dst_access_mask(dst_access),
154139
)
155140
}
156141

@@ -192,14 +177,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
192177
dst_stages |= dst_stage;
193178

194179
vk_barriers.push(
195-
vk::ImageMemoryBarrier::builder()
180+
vk::ImageMemoryBarrier::default()
196181
.image(bar.texture.raw)
197182
.subresource_range(range)
198183
.src_access_mask(src_access)
199184
.dst_access_mask(dst_access)
200185
.old_layout(src_layout)
201-
.new_layout(dst_layout)
202-
.build(),
186+
.new_layout(dst_layout),
203187
);
204188
}
205189

@@ -442,7 +426,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
442426
Some(buffer) => ray_tracing_functions
443427
.buffer_device_address
444428
.get_buffer_device_address(
445-
&vk::BufferDeviceAddressInfo::builder().buffer(buffer.raw),
429+
&vk::BufferDeviceAddressInfo::default().buffer(buffer.raw),
446430
),
447431
None => panic!("Buffers are required to build acceleration structures"),
448432
}
@@ -469,23 +453,24 @@ impl crate::CommandEncoder for super::CommandEncoder {
469453
for desc in descriptors {
470454
let (geometries, ranges) = match *desc.entries {
471455
crate::AccelerationStructureEntries::Instances(ref instances) => {
472-
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::builder(
456+
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::default(
457+
// TODO: Code is so large that rustfmt refuses to treat this... :(
473458
)
474459
.data(vk::DeviceOrHostAddressConstKHR {
475460
device_address: get_device_address(instances.buffer),
476461
});
477462

478-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
463+
let geometry = vk::AccelerationStructureGeometryKHR::default()
479464
.geometry_type(vk::GeometryTypeKHR::INSTANCES)
480465
.geometry(vk::AccelerationStructureGeometryDataKHR {
481-
instances: *instance_data,
466+
instances: instance_data,
482467
});
483468

484-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
469+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
485470
.primitive_count(instances.count)
486471
.primitive_offset(instances.offset);
487472

488-
(smallvec::smallvec![*geometry], smallvec::smallvec![*range])
473+
(smallvec::smallvec![geometry], smallvec::smallvec![range])
489474
}
490475
crate::AccelerationStructureEntries::Triangles(ref in_geometries) => {
491476
let mut ranges = smallvec::SmallVec::<
@@ -496,15 +481,15 @@ impl crate::CommandEncoder for super::CommandEncoder {
496481
>::with_capacity(in_geometries.len());
497482
for triangles in in_geometries {
498483
let mut triangle_data =
499-
vk::AccelerationStructureGeometryTrianglesDataKHR::builder()
484+
vk::AccelerationStructureGeometryTrianglesDataKHR::default()
500485
.vertex_data(vk::DeviceOrHostAddressConstKHR {
501486
device_address: get_device_address(triangles.vertex_buffer),
502487
})
503488
.vertex_format(conv::map_vertex_format(triangles.vertex_format))
504489
.max_vertex(triangles.vertex_count)
505490
.vertex_stride(triangles.vertex_stride);
506491

507-
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::builder();
492+
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::default();
508493

509494
if let Some(ref indices) = triangles.indices {
510495
triangle_data = triangle_data
@@ -528,7 +513,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
528513
ray_tracing_functions
529514
.buffer_device_address
530515
.get_buffer_device_address(
531-
&vk::BufferDeviceAddressInfo::builder()
516+
&vk::BufferDeviceAddressInfo::default()
532517
.buffer(transform.buffer.raw),
533518
)
534519
};
@@ -540,17 +525,17 @@ impl crate::CommandEncoder for super::CommandEncoder {
540525
range = range.transform_offset(transform.offset);
541526
}
542527

543-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
528+
let geometry = vk::AccelerationStructureGeometryKHR::default()
544529
.geometry_type(vk::GeometryTypeKHR::TRIANGLES)
545530
.geometry(vk::AccelerationStructureGeometryDataKHR {
546-
triangles: *triangle_data,
531+
triangles: triangle_data,
547532
})
548533
.flags(conv::map_acceleration_structure_geometry_flags(
549534
triangles.flags,
550535
));
551536

552-
geometries.push(*geometry);
553-
ranges.push(*range);
537+
geometries.push(geometry);
538+
ranges.push(range);
554539
}
555540
(geometries, ranges)
556541
}
@@ -562,25 +547,25 @@ impl crate::CommandEncoder for super::CommandEncoder {
562547
[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER],
563548
>::with_capacity(in_geometries.len());
564549
for aabb in in_geometries {
565-
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::builder()
550+
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::default()
566551
.data(vk::DeviceOrHostAddressConstKHR {
567552
device_address: get_device_address(aabb.buffer),
568553
})
569554
.stride(aabb.stride);
570555

571-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
556+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
572557
.primitive_count(aabb.count)
573558
.primitive_offset(aabb.offset);
574559

575-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
560+
let geometry = vk::AccelerationStructureGeometryKHR::default()
576561
.geometry_type(vk::GeometryTypeKHR::AABBS)
577562
.geometry(vk::AccelerationStructureGeometryDataKHR {
578-
aabbs: *aabbs_data,
563+
aabbs: aabbs_data,
579564
})
580565
.flags(conv::map_acceleration_structure_geometry_flags(aabb.flags));
581566

582-
geometries.push(*geometry);
583-
ranges.push(*range);
567+
geometries.push(geometry);
568+
ranges.push(range);
584569
}
585570
(geometries, ranges)
586571
}
@@ -593,7 +578,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
593578
ray_tracing_functions
594579
.buffer_device_address
595580
.get_buffer_device_address(
596-
&vk::BufferDeviceAddressInfo::builder().buffer(desc.scratch_buffer.raw),
581+
&vk::BufferDeviceAddressInfo::default().buffer(desc.scratch_buffer.raw),
597582
)
598583
};
599584
let ty = match *desc.entries {
@@ -602,7 +587,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
602587
}
603588
_ => vk::AccelerationStructureTypeKHR::BOTTOM_LEVEL,
604589
};
605-
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::builder()
590+
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::default()
606591
.ty(ty)
607592
.mode(conv::map_acceleration_structure_build_mode(desc.mode))
608593
.flags(conv::map_acceleration_structure_flags(desc.flags))
@@ -618,7 +603,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
618603
.raw;
619604
}
620605

621-
geometry_infos.push(*geometry_info);
606+
geometry_infos.push(geometry_info);
622607
}
623608

624609
for (i, geometry_info) in geometry_infos.iter_mut().enumerate() {
@@ -649,10 +634,9 @@ impl crate::CommandEncoder for super::CommandEncoder {
649634
src_stage | vk::PipelineStageFlags::TOP_OF_PIPE,
650635
dst_stage | vk::PipelineStageFlags::BOTTOM_OF_PIPE,
651636
vk::DependencyFlags::empty(),
652-
&[vk::MemoryBarrier::builder()
637+
&[vk::MemoryBarrier::default()
653638
.src_access_mask(src_access)
654-
.dst_access_mask(dst_access)
655-
.build()],
639+
.dst_access_mask(dst_access)],
656640
&[],
657641
&[],
658642
)
@@ -754,17 +738,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
754738
.make_framebuffer(fb_key, raw_pass, desc.label)
755739
.unwrap();
756740

757-
let mut vk_info = vk::RenderPassBeginInfo::builder()
741+
let mut vk_info = vk::RenderPassBeginInfo::default()
758742
.render_pass(raw_pass)
759743
.render_area(render_area)
760744
.clear_values(&vk_clear_values)
761745
.framebuffer(raw_framebuffer);
762746
let mut vk_attachment_info = if caps.imageless_framebuffers {
763-
Some(
764-
vk::RenderPassAttachmentBeginInfo::builder()
765-
.attachments(&vk_image_views)
766-
.build(),
767-
)
747+
Some(vk::RenderPassAttachmentBeginInfo::default().attachments(&vk_image_views))
768748
} else {
769749
None
770750
};
@@ -859,21 +839,21 @@ impl crate::CommandEncoder for super::CommandEncoder {
859839
}
860840

861841
unsafe fn insert_debug_marker(&mut self, label: &str) {
862-
if let Some(ext) = self.device.debug_messenger() {
842+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
863843
let cstr = self.temp.make_c_str(label);
864-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
844+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
865845
unsafe { ext.cmd_insert_debug_utils_label(self.active, &vk_label) };
866846
}
867847
}
868848
unsafe fn begin_debug_marker(&mut self, group_label: &str) {
869-
if let Some(ext) = self.device.debug_messenger() {
849+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
870850
let cstr = self.temp.make_c_str(group_label);
871-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
851+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
872852
unsafe { ext.cmd_begin_debug_utils_label(self.active, &vk_label) };
873853
}
874854
}
875855
unsafe fn end_debug_marker(&mut self) {
876-
if let Some(ext) = self.device.debug_messenger() {
856+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
877857
unsafe { ext.cmd_end_debug_utils_label(self.active) };
878858
}
879859
}

0 commit comments

Comments
 (0)