Skip to content

Commit da725f4

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 17ef6ca commit da725f4

File tree

10 files changed

+564
-676
lines changed

10 files changed

+564
-676
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.38.0"
138138
gpu-alloc = "0.6"
139139
gpu-descriptor = "0.2"
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.19.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.2", 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: 179 additions & 202 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::{ext, 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

@@ -140,12 +126,11 @@ impl crate::CommandEncoder for super::CommandEncoder {
140126
dst_stages |= dst_stage;
141127

142128
vk_barriers.push(
143-
vk::BufferMemoryBarrier::builder()
129+
vk::BufferMemoryBarrier::default()
144130
.buffer(bar.buffer.raw)
145131
.size(vk::WHOLE_SIZE)
146132
.src_access_mask(src_access)
147-
.dst_access_mask(dst_access)
148-
.build(),
133+
.dst_access_mask(dst_access),
149134
)
150135
}
151136

@@ -187,14 +172,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
187172
dst_stages |= dst_stage;
188173

189174
vk_barriers.push(
190-
vk::ImageMemoryBarrier::builder()
175+
vk::ImageMemoryBarrier::default()
191176
.image(bar.texture.raw)
192177
.subresource_range(range)
193178
.src_access_mask(src_access)
194179
.dst_access_mask(dst_access)
195180
.old_layout(src_layout)
196-
.new_layout(dst_layout)
197-
.build(),
181+
.new_layout(dst_layout),
198182
);
199183
}
200184

@@ -437,7 +421,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
437421
Some(buffer) => ray_tracing_functions
438422
.buffer_device_address
439423
.get_buffer_device_address(
440-
&vk::BufferDeviceAddressInfo::builder().buffer(buffer.raw),
424+
&vk::BufferDeviceAddressInfo::default().buffer(buffer.raw),
441425
),
442426
None => panic!("Buffers are required to build acceleration structures"),
443427
}
@@ -464,23 +448,24 @@ impl crate::CommandEncoder for super::CommandEncoder {
464448
for desc in descriptors {
465449
let (geometries, ranges) = match *desc.entries {
466450
crate::AccelerationStructureEntries::Instances(ref instances) => {
467-
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::builder(
451+
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::default(
452+
// TODO: Code is so large that rustfmt refuses to treat this... :(
468453
)
469454
.data(vk::DeviceOrHostAddressConstKHR {
470455
device_address: get_device_address(instances.buffer),
471456
});
472457

473-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
458+
let geometry = vk::AccelerationStructureGeometryKHR::default()
474459
.geometry_type(vk::GeometryTypeKHR::INSTANCES)
475460
.geometry(vk::AccelerationStructureGeometryDataKHR {
476-
instances: *instance_data,
461+
instances: instance_data,
477462
});
478463

479-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
464+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
480465
.primitive_count(instances.count)
481466
.primitive_offset(instances.offset);
482467

483-
(smallvec::smallvec![*geometry], smallvec::smallvec![*range])
468+
(smallvec::smallvec![geometry], smallvec::smallvec![range])
484469
}
485470
crate::AccelerationStructureEntries::Triangles(ref in_geometries) => {
486471
let mut ranges = smallvec::SmallVec::<
@@ -491,15 +476,15 @@ impl crate::CommandEncoder for super::CommandEncoder {
491476
>::with_capacity(in_geometries.len());
492477
for triangles in in_geometries {
493478
let mut triangle_data =
494-
vk::AccelerationStructureGeometryTrianglesDataKHR::builder()
479+
vk::AccelerationStructureGeometryTrianglesDataKHR::default()
495480
.vertex_data(vk::DeviceOrHostAddressConstKHR {
496481
device_address: get_device_address(triangles.vertex_buffer),
497482
})
498483
.vertex_format(conv::map_vertex_format(triangles.vertex_format))
499484
.max_vertex(triangles.vertex_count)
500485
.vertex_stride(triangles.vertex_stride);
501486

502-
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::builder();
487+
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::default();
503488

504489
if let Some(ref indices) = triangles.indices {
505490
triangle_data = triangle_data
@@ -523,7 +508,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
523508
ray_tracing_functions
524509
.buffer_device_address
525510
.get_buffer_device_address(
526-
&vk::BufferDeviceAddressInfo::builder()
511+
&vk::BufferDeviceAddressInfo::default()
527512
.buffer(transform.buffer.raw),
528513
)
529514
};
@@ -535,17 +520,17 @@ impl crate::CommandEncoder for super::CommandEncoder {
535520
range = range.transform_offset(transform.offset);
536521
}
537522

538-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
523+
let geometry = vk::AccelerationStructureGeometryKHR::default()
539524
.geometry_type(vk::GeometryTypeKHR::TRIANGLES)
540525
.geometry(vk::AccelerationStructureGeometryDataKHR {
541-
triangles: *triangle_data,
526+
triangles: triangle_data,
542527
})
543528
.flags(conv::map_acceleration_structure_geometry_flags(
544529
triangles.flags,
545530
));
546531

547-
geometries.push(*geometry);
548-
ranges.push(*range);
532+
geometries.push(geometry);
533+
ranges.push(range);
549534
}
550535
(geometries, ranges)
551536
}
@@ -557,25 +542,25 @@ impl crate::CommandEncoder for super::CommandEncoder {
557542
[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER],
558543
>::with_capacity(in_geometries.len());
559544
for aabb in in_geometries {
560-
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::builder()
545+
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::default()
561546
.data(vk::DeviceOrHostAddressConstKHR {
562547
device_address: get_device_address(aabb.buffer),
563548
})
564549
.stride(aabb.stride);
565550

566-
let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
551+
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
567552
.primitive_count(aabb.count)
568553
.primitive_offset(aabb.offset);
569554

570-
let geometry = vk::AccelerationStructureGeometryKHR::builder()
555+
let geometry = vk::AccelerationStructureGeometryKHR::default()
571556
.geometry_type(vk::GeometryTypeKHR::AABBS)
572557
.geometry(vk::AccelerationStructureGeometryDataKHR {
573-
aabbs: *aabbs_data,
558+
aabbs: aabbs_data,
574559
})
575560
.flags(conv::map_acceleration_structure_geometry_flags(aabb.flags));
576561

577-
geometries.push(*geometry);
578-
ranges.push(*range);
562+
geometries.push(geometry);
563+
ranges.push(range);
579564
}
580565
(geometries, ranges)
581566
}
@@ -588,7 +573,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
588573
ray_tracing_functions
589574
.buffer_device_address
590575
.get_buffer_device_address(
591-
&vk::BufferDeviceAddressInfo::builder().buffer(desc.scratch_buffer.raw),
576+
&vk::BufferDeviceAddressInfo::default().buffer(desc.scratch_buffer.raw),
592577
)
593578
};
594579
let ty = match *desc.entries {
@@ -597,7 +582,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
597582
}
598583
_ => vk::AccelerationStructureTypeKHR::BOTTOM_LEVEL,
599584
};
600-
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::builder()
585+
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::default()
601586
.ty(ty)
602587
.mode(conv::map_acceleration_structure_build_mode(desc.mode))
603588
.flags(conv::map_acceleration_structure_flags(desc.flags))
@@ -613,7 +598,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
613598
.raw;
614599
}
615600

616-
geometry_infos.push(*geometry_info);
601+
geometry_infos.push(geometry_info);
617602
}
618603

619604
for (i, geometry_info) in geometry_infos.iter_mut().enumerate() {
@@ -644,10 +629,9 @@ impl crate::CommandEncoder for super::CommandEncoder {
644629
src_stage | vk::PipelineStageFlags::TOP_OF_PIPE,
645630
dst_stage | vk::PipelineStageFlags::BOTTOM_OF_PIPE,
646631
vk::DependencyFlags::empty(),
647-
&[vk::MemoryBarrier::builder()
632+
&[vk::MemoryBarrier::default()
648633
.src_access_mask(src_access)
649-
.dst_access_mask(dst_access)
650-
.build()],
634+
.dst_access_mask(dst_access)],
651635
&[],
652636
&[],
653637
)
@@ -749,17 +733,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
749733
.make_framebuffer(fb_key, raw_pass, desc.label)
750734
.unwrap();
751735

752-
let mut vk_info = vk::RenderPassBeginInfo::builder()
736+
let mut vk_info = vk::RenderPassBeginInfo::default()
753737
.render_pass(raw_pass)
754738
.render_area(render_area)
755739
.clear_values(&vk_clear_values)
756740
.framebuffer(raw_framebuffer);
757741
let mut vk_attachment_info = if caps.imageless_framebuffers {
758-
Some(
759-
vk::RenderPassAttachmentBeginInfo::builder()
760-
.attachments(&vk_image_views)
761-
.build(),
762-
)
742+
Some(vk::RenderPassAttachmentBeginInfo::default().attachments(&vk_image_views))
763743
} else {
764744
None
765745
};
@@ -854,21 +834,21 @@ impl crate::CommandEncoder for super::CommandEncoder {
854834
}
855835

856836
unsafe fn insert_debug_marker(&mut self, label: &str) {
857-
if let Some(ext) = self.device.debug_messenger() {
837+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
858838
let cstr = self.temp.make_c_str(label);
859-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
839+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
860840
unsafe { ext.cmd_insert_debug_utils_label(self.active, &vk_label) };
861841
}
862842
}
863843
unsafe fn begin_debug_marker(&mut self, group_label: &str) {
864-
if let Some(ext) = self.device.debug_messenger() {
844+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
865845
let cstr = self.temp.make_c_str(group_label);
866-
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
846+
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
867847
unsafe { ext.cmd_begin_debug_utils_label(self.active, &vk_label) };
868848
}
869849
}
870850
unsafe fn end_debug_marker(&mut self) {
871-
if let Some(ext) = self.device.debug_messenger() {
851+
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
872852
unsafe { ext.cmd_end_debug_utils_label(self.active) };
873853
}
874854
}

0 commit comments

Comments
 (0)