@@ -18,6 +18,8 @@ pub struct PhysicalDeviceFeatures {
18
18
descriptor_indexing : Option < vk:: PhysicalDeviceDescriptorIndexingFeaturesEXT > ,
19
19
imageless_framebuffer : Option < vk:: PhysicalDeviceImagelessFramebufferFeaturesKHR > ,
20
20
timeline_semaphore : Option < vk:: PhysicalDeviceTimelineSemaphoreFeaturesKHR > ,
21
+ image_robustness : Option < vk:: PhysicalDeviceImageRobustnessFeaturesEXT > ,
22
+ robustness2 : Option < vk:: PhysicalDeviceRobustness2FeaturesEXT > ,
21
23
}
22
24
23
25
// This is safe because the structs have `p_next: *mut c_void`, which we null out/never read.
@@ -228,6 +230,28 @@ impl PhysicalDeviceFeatures {
228
230
} else {
229
231
None
230
232
} ,
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
+ } ,
231
255
}
232
256
}
233
257
@@ -571,6 +595,21 @@ impl super::InstanceShared {
571
595
mut_ref. p_next = mem:: replace ( & mut features2. p_next , mut_ref as * mut _ as * mut _ ) ;
572
596
}
573
597
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
+
574
613
unsafe {
575
614
get_device_properties. get_physical_device_features2_khr ( phd, & mut features2) ;
576
615
}
@@ -593,6 +632,8 @@ impl super::InstanceShared {
593
632
null_p_next ( & mut features. descriptor_indexing ) ;
594
633
null_p_next ( & mut features. imageless_framebuffer ) ;
595
634
null_p_next ( & mut features. timeline_semaphore ) ;
635
+ null_p_next ( & mut features. image_robustness ) ;
636
+ null_p_next ( & mut features. robustness2 ) ;
596
637
}
597
638
598
639
( capabilities, features)
@@ -675,13 +716,13 @@ impl super::Instance {
675
716
|| phd_capabilities. supports_extension ( vk:: KhrMaintenance1Fn :: name ( ) ) ,
676
717
imageless_framebuffers : match phd_features. vulkan_1_2 {
677
718
Some ( features) => features. imageless_framebuffer == vk:: TRUE ,
678
- None => phd_capabilities . supports_extension ( vk :: KhrImagelessFramebufferFn :: name ( ) ) ,
719
+ None => phd_features . imageless_framebuffer . is_some ( ) ,
679
720
} ,
680
721
image_view_usage : phd_capabilities. properties . api_version >= vk:: API_VERSION_1_1
681
722
|| phd_capabilities. supports_extension ( vk:: KhrMaintenance2Fn :: name ( ) ) ,
682
723
timeline_semaphores : match phd_features. vulkan_1_2 {
683
724
Some ( features) => features. timeline_semaphore == vk:: TRUE ,
684
- None => phd_capabilities . supports_extension ( vk :: KhrTimelineSemaphoreFn :: name ( ) ) ,
725
+ None => phd_features . timeline_semaphore . is_some ( ) ,
685
726
} ,
686
727
texture_d24 : unsafe {
687
728
self . shared
@@ -701,6 +742,13 @@ impl super::Instance {
701
742
can_present : true ,
702
743
//TODO: make configurable
703
744
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
+ } ,
704
752
} ;
705
753
706
754
let capabilities = crate :: Capabilities {
@@ -860,12 +908,16 @@ impl super::Adapter {
860
908
capabilities : Some ( capabilities. iter ( ) . cloned ( ) . collect ( ) ) ,
861
909
bounds_check_policies : naga:: back:: BoundsCheckPolicies {
862
910
index : naga:: back:: BoundsCheckPolicy :: Restrict ,
863
- image : naga:: back:: BoundsCheckPolicy :: Restrict ,
864
911
buffer : if self . private_caps . robust_buffer_access {
865
912
naga:: back:: BoundsCheckPolicy :: Unchecked
866
913
} else {
867
914
naga:: back:: BoundsCheckPolicy :: Restrict
868
915
} ,
916
+ image : if self . private_caps . robust_image_access {
917
+ naga:: back:: BoundsCheckPolicy :: Unchecked
918
+ } else {
919
+ naga:: back:: BoundsCheckPolicy :: Restrict
920
+ } ,
869
921
} ,
870
922
}
871
923
} ;
0 commit comments