Skip to content

Commit 87c8680

Browse files
committed
hal/vk: Enable image robustness where available
1 parent 3cabd09 commit 87c8680

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ pub struct PhysicalDeviceFeatures {
1818
descriptor_indexing: Option<vk::PhysicalDeviceDescriptorIndexingFeaturesEXT>,
1919
imageless_framebuffer: Option<vk::PhysicalDeviceImagelessFramebufferFeaturesKHR>,
2020
timeline_semaphore: Option<vk::PhysicalDeviceTimelineSemaphoreFeaturesKHR>,
21+
image_robustness: Option<vk::PhysicalDeviceImageRobustnessFeaturesEXT>,
22+
robustness2: Option<vk::PhysicalDeviceRobustness2FeaturesEXT>,
2123
}
2224

2325
// This is safe because the structs have `p_next: *mut c_void`, which we null out/never read.
@@ -228,6 +230,28 @@ impl PhysicalDeviceFeatures {
228230
} else {
229231
None
230232
},
233+
image_robustness: if enabled_extensions.contains(&vk::ExtImageRobustnessFn::name()) {
234+
Some(
235+
vk::PhysicalDeviceImageRobustnessFeaturesEXT::builder()
236+
.robust_image_access(private_caps.robust_image_access)
237+
.build(),
238+
)
239+
} else {
240+
None
241+
},
242+
robustness2: if enabled_extensions.contains(&vk::ExtRobustness2Fn::name()) {
243+
// Note: enabling `robust_buffer_access2` isn't requires, strictly speaking
244+
// since we can enable `robust_buffer_access` all the time. But it improves
245+
// program portability, so we opt into it anyway.
246+
Some(
247+
vk::PhysicalDeviceRobustness2FeaturesEXT::builder()
248+
.robust_buffer_access2(private_caps.robust_buffer_access)
249+
.robust_image_access2(private_caps.robust_image_access)
250+
.build(),
251+
)
252+
} else {
253+
None
254+
},
231255
}
232256
}
233257

@@ -571,6 +595,21 @@ impl super::InstanceShared {
571595
mut_ref.p_next = mem::replace(&mut features2.p_next, mut_ref as *mut _ as *mut _);
572596
}
573597

598+
if capabilities.supports_extension(vk::ExtImageRobustnessFn::name()) {
599+
features.image_robustness =
600+
Some(vk::PhysicalDeviceImageRobustnessFeaturesEXT::builder().build());
601+
602+
let mut_ref = features.image_robustness.as_mut().unwrap();
603+
mut_ref.p_next = mem::replace(&mut features2.p_next, mut_ref as *mut _ as *mut _);
604+
}
605+
if capabilities.supports_extension(vk::ExtRobustness2Fn::name()) {
606+
features.robustness2 =
607+
Some(vk::PhysicalDeviceRobustness2FeaturesEXT::builder().build());
608+
609+
let mut_ref = features.robustness2.as_mut().unwrap();
610+
mut_ref.p_next = mem::replace(&mut features2.p_next, mut_ref as *mut _ as *mut _);
611+
}
612+
574613
unsafe {
575614
get_device_properties.get_physical_device_features2_khr(phd, &mut features2);
576615
}
@@ -593,6 +632,8 @@ impl super::InstanceShared {
593632
null_p_next(&mut features.descriptor_indexing);
594633
null_p_next(&mut features.imageless_framebuffer);
595634
null_p_next(&mut features.timeline_semaphore);
635+
null_p_next(&mut features.image_robustness);
636+
null_p_next(&mut features.robustness2);
596637
}
597638

598639
(capabilities, features)
@@ -675,13 +716,13 @@ impl super::Instance {
675716
|| phd_capabilities.supports_extension(vk::KhrMaintenance1Fn::name()),
676717
imageless_framebuffers: match phd_features.vulkan_1_2 {
677718
Some(features) => features.imageless_framebuffer == vk::TRUE,
678-
None => phd_capabilities.supports_extension(vk::KhrImagelessFramebufferFn::name()),
719+
None => phd_features.imageless_framebuffer.is_some(),
679720
},
680721
image_view_usage: phd_capabilities.properties.api_version >= vk::API_VERSION_1_1
681722
|| phd_capabilities.supports_extension(vk::KhrMaintenance2Fn::name()),
682723
timeline_semaphores: match phd_features.vulkan_1_2 {
683724
Some(features) => features.timeline_semaphore == vk::TRUE,
684-
None => phd_capabilities.supports_extension(vk::KhrTimelineSemaphoreFn::name()),
725+
None => phd_features.timeline_semaphore.is_some(),
685726
},
686727
texture_d24: unsafe {
687728
self.shared
@@ -701,6 +742,13 @@ impl super::Instance {
701742
can_present: true,
702743
//TODO: make configurable
703744
robust_buffer_access: phd_features.core.robust_buffer_access != 0,
745+
robust_image_access: match phd_features.robustness2 {
746+
Some(ref f) => f.robust_image_access2 != 0,
747+
None => match phd_features.image_robustness {
748+
Some(ref f) => f.robust_image_access != 0,
749+
None => false,
750+
},
751+
},
704752
};
705753

706754
let capabilities = crate::Capabilities {
@@ -860,12 +908,16 @@ impl super::Adapter {
860908
capabilities: Some(capabilities.iter().cloned().collect()),
861909
bounds_check_policies: naga::back::BoundsCheckPolicies {
862910
index: naga::back::BoundsCheckPolicy::Restrict,
863-
image: naga::back::BoundsCheckPolicy::Restrict,
864911
buffer: if self.private_caps.robust_buffer_access {
865912
naga::back::BoundsCheckPolicy::Unchecked
866913
} else {
867914
naga::back::BoundsCheckPolicy::Restrict
868915
},
916+
image: if self.private_caps.robust_image_access {
917+
naga::back::BoundsCheckPolicy::Unchecked
918+
} else {
919+
naga::back::BoundsCheckPolicy::Restrict
920+
},
869921
},
870922
}
871923
};

wgpu-hal/src/vulkan/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ struct PrivateCapabilities {
163163
can_present: bool,
164164
non_coherent_map_mask: wgt::BufferAddress,
165165
robust_buffer_access: bool,
166+
robust_image_access: bool,
166167
}
167168

168169
bitflags::bitflags!(

0 commit comments

Comments
 (0)