Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wgpu-hal] Upgrade to ash 0.38 #5504

Merged
merged 1 commit into from
May 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ By @atlv24 and @cwfitzgerald in [#5154](https://github.com/gfx-rs/wgpu/pull/5154
- 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).
- 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)
- Fix SPIR-V type capability requests to not depend on `LocalType` caching. By @atlv24 in [#5590](https://github.com/gfx-rs/wgpu/pull/5590)
- Upgrade `ash` to `0.38`. By @MarijnS95 in [#5504](https://github.com/gfx-rs/wgpu/pull/5504).

#### Tests

Expand Down
6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ objc = "0.2.5"

# Vulkan dependencies
android_system_properties = "0.1.1"
ash = "0.37.3"
ash = "0.38.0"
gpu-alloc = "0.6"
gpu-descriptor = "0.3"

Expand Down
5 changes: 3 additions & 2 deletions wgpu-hal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ gles = [
"dep:khronos-egl",
"dep:libloading",
"dep:ndk-sys",
"winapi/libloaderapi",
]
dx12 = [
"naga/hlsl-out",
Expand All @@ -68,6 +69,7 @@ dx12 = [
"winapi/d3d12shader",
"winapi/d3d12sdklayers",
"winapi/dxgi1_6",
"winapi/errhandlingapi",
]
# TODO: This is a separate feature until Mozilla okays windows-rs, see https://github.com/gfx-rs/wgpu/issues/3207 for the tracking issue.
windows_rs = ["dep:gpu-allocator"]
Expand Down Expand Up @@ -118,7 +120,7 @@ version = "0.20.0"

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
# backend: Vulkan
ash = { version = "0.37.3", optional = true }
ash = { version = "0.38.0", optional = true }
gpu-alloc = { version = "0.6", optional = true }
gpu-descriptor = { version = "0.3", optional = true }
smallvec = { version = "1", optional = true, features = ["union"] }
Expand Down Expand Up @@ -146,7 +148,6 @@ glutin_wgl_sys = { version = "0.5", optional = true }

winapi = { version = "0.3", features = [
"profileapi",
"libloaderapi",
"windef",
"winuser",
"dcomp",
Expand Down
21 changes: 0 additions & 21 deletions wgpu-hal/src/auxil/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,24 +115,3 @@ impl crate::TextureCopy {
self.size = self.size.min(&max_src_size).min(&max_dst_size);
}
}

/// Construct a `CStr` from a byte slice, up to the first zero byte.
///
/// Return a `CStr` extending from the start of `bytes` up to and
/// including the first zero byte. If there is no zero byte in
/// `bytes`, return `None`.
///
/// This can be removed when `CStr::from_bytes_until_nul` is stabilized.
/// ([#95027](https://github.com/rust-lang/rust/issues/95027))
#[allow(dead_code)]
pub(crate) fn cstr_from_bytes_until_nul(bytes: &[std::os::raw::c_char]) -> Option<&std::ffi::CStr> {
if bytes.contains(&0) {
// Safety for `CStr::from_ptr`:
// - We've ensured that the slice does contain a null terminator.
// - The range is valid to read, because the slice covers it.
// - The memory won't be changed, because the slice borrows it.
unsafe { Some(std::ffi::CStr::from_ptr(bytes.as_ptr())) }
} else {
None
}
}
455 changes: 213 additions & 242 deletions wgpu-hal/src/vulkan/adapter.rs

Large diffs are not rendered by default.

104 changes: 42 additions & 62 deletions wgpu-hal/src/vulkan/command.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::conv;

use arrayvec::ArrayVec;
use ash::{extensions::ext, vk};
use ash::vk;

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

Expand Down Expand Up @@ -39,12 +39,6 @@ impl super::Texture {
}
}

impl super::DeviceShared {
fn debug_messenger(&self) -> Option<&ext::DebugUtils> {
Some(&self.instance.debug_utils.as_ref()?.extension)
}
}

impl super::CommandEncoder {
fn write_pass_end_timestamp_if_requested(&mut self) {
if let Some((query_set, index)) = self.end_of_pass_timer_query.take() {
Expand All @@ -65,31 +59,23 @@ impl crate::CommandEncoder for super::CommandEncoder {

unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> {
if self.free.is_empty() {
let vk_info = vk::CommandBufferAllocateInfo::builder()
let vk_info = vk::CommandBufferAllocateInfo::default()
.command_pool(self.raw)
.command_buffer_count(ALLOCATION_GRANULARITY)
.build();
.command_buffer_count(ALLOCATION_GRANULARITY);
let cmd_buf_vec = unsafe { self.device.raw.allocate_command_buffers(&vk_info)? };
self.free.extend(cmd_buf_vec);
}
let raw = self.free.pop().unwrap();

// Set the name unconditionally, since there might be a
// previous name assigned to this.
unsafe {
self.device.set_object_name(
vk::ObjectType::COMMAND_BUFFER,
raw,
label.unwrap_or_default(),
)
};
unsafe { self.device.set_object_name(raw, label.unwrap_or_default()) };

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

let vk_info = vk::CommandBufferBeginInfo::builder()
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT)
.build();
let vk_info = vk::CommandBufferBeginInfo::default()
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT);
unsafe { self.device.raw.begin_command_buffer(raw, &vk_info) }?;
self.active = raw;

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

vk_barriers.push(
vk::BufferMemoryBarrier::builder()
vk::BufferMemoryBarrier::default()
.buffer(bar.buffer.raw)
.size(vk::WHOLE_SIZE)
.src_access_mask(src_access)
.dst_access_mask(dst_access)
.build(),
.dst_access_mask(dst_access),
)
}

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

vk_barriers.push(
vk::ImageMemoryBarrier::builder()
vk::ImageMemoryBarrier::default()
.image(bar.texture.raw)
.subresource_range(range)
.src_access_mask(src_access)
.dst_access_mask(dst_access)
.old_layout(src_layout)
.new_layout(dst_layout)
.build(),
.new_layout(dst_layout),
);
}

Expand Down Expand Up @@ -442,7 +426,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
Some(buffer) => ray_tracing_functions
.buffer_device_address
.get_buffer_device_address(
&vk::BufferDeviceAddressInfo::builder().buffer(buffer.raw),
&vk::BufferDeviceAddressInfo::default().buffer(buffer.raw),
),
None => panic!("Buffers are required to build acceleration structures"),
}
Expand All @@ -469,23 +453,24 @@ impl crate::CommandEncoder for super::CommandEncoder {
for desc in descriptors {
let (geometries, ranges) = match *desc.entries {
crate::AccelerationStructureEntries::Instances(ref instances) => {
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::builder(
let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::default(
// TODO: Code is so large that rustfmt refuses to treat this... :(
cwfitzgerald marked this conversation as resolved.
Show resolved Hide resolved
)
.data(vk::DeviceOrHostAddressConstKHR {
device_address: get_device_address(instances.buffer),
});

let geometry = vk::AccelerationStructureGeometryKHR::builder()
let geometry = vk::AccelerationStructureGeometryKHR::default()
.geometry_type(vk::GeometryTypeKHR::INSTANCES)
.geometry(vk::AccelerationStructureGeometryDataKHR {
instances: *instance_data,
instances: instance_data,
});

let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
.primitive_count(instances.count)
.primitive_offset(instances.offset);

(smallvec::smallvec![*geometry], smallvec::smallvec![*range])
(smallvec::smallvec![geometry], smallvec::smallvec![range])
}
crate::AccelerationStructureEntries::Triangles(ref in_geometries) => {
let mut ranges = smallvec::SmallVec::<
Expand All @@ -496,15 +481,15 @@ impl crate::CommandEncoder for super::CommandEncoder {
>::with_capacity(in_geometries.len());
for triangles in in_geometries {
let mut triangle_data =
vk::AccelerationStructureGeometryTrianglesDataKHR::builder()
vk::AccelerationStructureGeometryTrianglesDataKHR::default()
.vertex_data(vk::DeviceOrHostAddressConstKHR {
device_address: get_device_address(triangles.vertex_buffer),
})
.vertex_format(conv::map_vertex_format(triangles.vertex_format))
.max_vertex(triangles.vertex_count)
.vertex_stride(triangles.vertex_stride);

let mut range = vk::AccelerationStructureBuildRangeInfoKHR::builder();
let mut range = vk::AccelerationStructureBuildRangeInfoKHR::default();

if let Some(ref indices) = triangles.indices {
triangle_data = triangle_data
Expand All @@ -528,7 +513,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
ray_tracing_functions
.buffer_device_address
.get_buffer_device_address(
&vk::BufferDeviceAddressInfo::builder()
&vk::BufferDeviceAddressInfo::default()
.buffer(transform.buffer.raw),
)
};
Expand All @@ -540,17 +525,17 @@ impl crate::CommandEncoder for super::CommandEncoder {
range = range.transform_offset(transform.offset);
}

let geometry = vk::AccelerationStructureGeometryKHR::builder()
let geometry = vk::AccelerationStructureGeometryKHR::default()
.geometry_type(vk::GeometryTypeKHR::TRIANGLES)
.geometry(vk::AccelerationStructureGeometryDataKHR {
triangles: *triangle_data,
triangles: triangle_data,
})
.flags(conv::map_acceleration_structure_geometry_flags(
triangles.flags,
));

geometries.push(*geometry);
ranges.push(*range);
geometries.push(geometry);
ranges.push(range);
}
(geometries, ranges)
}
Expand All @@ -562,25 +547,25 @@ impl crate::CommandEncoder for super::CommandEncoder {
[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER],
>::with_capacity(in_geometries.len());
for aabb in in_geometries {
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::builder()
let aabbs_data = vk::AccelerationStructureGeometryAabbsDataKHR::default()
.data(vk::DeviceOrHostAddressConstKHR {
device_address: get_device_address(aabb.buffer),
})
.stride(aabb.stride);

let range = vk::AccelerationStructureBuildRangeInfoKHR::builder()
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
.primitive_count(aabb.count)
.primitive_offset(aabb.offset);

let geometry = vk::AccelerationStructureGeometryKHR::builder()
let geometry = vk::AccelerationStructureGeometryKHR::default()
.geometry_type(vk::GeometryTypeKHR::AABBS)
.geometry(vk::AccelerationStructureGeometryDataKHR {
aabbs: *aabbs_data,
aabbs: aabbs_data,
})
.flags(conv::map_acceleration_structure_geometry_flags(aabb.flags));

geometries.push(*geometry);
ranges.push(*range);
geometries.push(geometry);
ranges.push(range);
}
(geometries, ranges)
}
Expand All @@ -593,7 +578,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
ray_tracing_functions
.buffer_device_address
.get_buffer_device_address(
&vk::BufferDeviceAddressInfo::builder().buffer(desc.scratch_buffer.raw),
&vk::BufferDeviceAddressInfo::default().buffer(desc.scratch_buffer.raw),
)
};
let ty = match *desc.entries {
Expand All @@ -602,7 +587,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
}
_ => vk::AccelerationStructureTypeKHR::BOTTOM_LEVEL,
};
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::builder()
let mut geometry_info = vk::AccelerationStructureBuildGeometryInfoKHR::default()
.ty(ty)
.mode(conv::map_acceleration_structure_build_mode(desc.mode))
.flags(conv::map_acceleration_structure_flags(desc.flags))
Expand All @@ -618,7 +603,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
.raw;
}

geometry_infos.push(*geometry_info);
geometry_infos.push(geometry_info);
}

for (i, geometry_info) in geometry_infos.iter_mut().enumerate() {
Expand Down Expand Up @@ -649,10 +634,9 @@ impl crate::CommandEncoder for super::CommandEncoder {
src_stage | vk::PipelineStageFlags::TOP_OF_PIPE,
dst_stage | vk::PipelineStageFlags::BOTTOM_OF_PIPE,
vk::DependencyFlags::empty(),
&[vk::MemoryBarrier::builder()
&[vk::MemoryBarrier::default()
.src_access_mask(src_access)
.dst_access_mask(dst_access)
.build()],
.dst_access_mask(dst_access)],
&[],
&[],
)
Expand Down Expand Up @@ -754,17 +738,13 @@ impl crate::CommandEncoder for super::CommandEncoder {
.make_framebuffer(fb_key, raw_pass, desc.label)
.unwrap();

let mut vk_info = vk::RenderPassBeginInfo::builder()
let mut vk_info = vk::RenderPassBeginInfo::default()
.render_pass(raw_pass)
.render_area(render_area)
.clear_values(&vk_clear_values)
.framebuffer(raw_framebuffer);
let mut vk_attachment_info = if caps.imageless_framebuffers {
Some(
vk::RenderPassAttachmentBeginInfo::builder()
.attachments(&vk_image_views)
.build(),
)
Some(vk::RenderPassAttachmentBeginInfo::default().attachments(&vk_image_views))
} else {
None
};
Expand Down Expand Up @@ -859,21 +839,21 @@ impl crate::CommandEncoder for super::CommandEncoder {
}

unsafe fn insert_debug_marker(&mut self, label: &str) {
if let Some(ext) = self.device.debug_messenger() {
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
let cstr = self.temp.make_c_str(label);
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
unsafe { ext.cmd_insert_debug_utils_label(self.active, &vk_label) };
}
}
unsafe fn begin_debug_marker(&mut self, group_label: &str) {
if let Some(ext) = self.device.debug_messenger() {
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
let cstr = self.temp.make_c_str(group_label);
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(cstr).build();
let vk_label = vk::DebugUtilsLabelEXT::default().label_name(cstr);
unsafe { ext.cmd_begin_debug_utils_label(self.active, &vk_label) };
}
}
unsafe fn end_debug_marker(&mut self) {
if let Some(ext) = self.device.debug_messenger() {
if let Some(ext) = self.device.extension_fns.debug_utils.as_ref() {
unsafe { ext.cmd_end_debug_utils_label(self.active) };
}
}
Expand Down