From 92fc6a50ee12f9a7af8a7c3a4cb5a593bfabaf49 Mon Sep 17 00:00:00 2001 From: Jacob Hughes Date: Wed, 1 Nov 2023 05:20:20 -0700 Subject: [PATCH] debug_printf: Enable debug_printf validation feature --- wgpu-hal/src/vulkan/instance.rs | 34 ++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/wgpu-hal/src/vulkan/instance.rs b/wgpu-hal/src/vulkan/instance.rs index 6910c15a32..b4e1241a48 100644 --- a/wgpu-hal/src/vulkan/instance.rs +++ b/wgpu-hal/src/vulkan/instance.rs @@ -611,7 +611,7 @@ impl crate::Instance for super::Instance { }, ); - let extensions = Self::desired_extensions(&entry, instance_api_version, desc.flags)?; + let mut extensions = Self::desired_extensions(&entry, instance_api_version, desc.flags)?; let instance_layers = { profiling::scope!("vkEnumerateInstanceLayerProperties"); @@ -644,6 +644,7 @@ impl crate::Instance for super::Instance { // Request validation layer if asked. let mut debug_utils = None; + let mut validation_features = None; if desc.flags.contains(wgt::InstanceFlags::VALIDATION) { let validation_layer_name = CStr::from_bytes_with_nul(b"VK_LAYER_KHRONOS_validation\0").unwrap(); @@ -689,6 +690,33 @@ impl crate::Instance for super::Instance { debug_utils = Some((create_info, vk_create_info)); } + + let validation_features_name = vk::ExtValidationFeaturesFn::name(); + match entry.enumerate_instance_extension_properties(Some(validation_layer_name)) { + Ok(validation_extensions) => { + if validation_extensions.iter().any(|inst_ext| { + cstr_from_bytes_until_nul(&inst_ext.extension_name) + == Some(validation_features_name) + }) { + extensions.push(validation_features_name); + validation_features = Some( + vk::ValidationFeaturesEXT::builder().enabled_validation_features( + &[vk::ValidationFeatureEnableEXT::DEBUG_PRINTF], + ), + ); + } else { + log::info!( + "Unable to find validation layer extension {}, not enabling DEBUG_PRINTF", + validation_features_name.to_string_lossy() + ) + } + } + Err(e) => { + log::warn!( + "enumerate_instance_extension_properties() failed for validation layer: {:?}", e + ) + } + } } else { log::warn!( "InstanceFlags::VALIDATION requested, but unable to find layer: {}", @@ -743,6 +771,10 @@ impl crate::Instance for super::Instance { .enabled_layer_names(&str_pointers[..layers.len()]) .enabled_extension_names(&str_pointers[layers.len()..]); + if let Some(validation_features) = validation_features.as_mut() { + create_info = create_info.push_next(validation_features); + } + if let Some(&mut (_, ref mut vk_create_info)) = debug_utils.as_mut() { create_info = create_info.push_next(vk_create_info); }