From: Josh Simmons Date: Tue, 4 Jun 2024 20:42:52 +0000 (+0200) Subject: narcissus-gpu: Add command buffer debug markers X-Git-Url: https://git.nega.tv//gitweb.cgi?a=commitdiff_plain;h=74546f31109e62cf313144c5f559d29cc237af26;p=josh%2Fnarcissus narcissus-gpu: Add command buffer debug markers --- diff --git a/engine/narcissus-gpu/Cargo.toml b/engine/narcissus-gpu/Cargo.toml index eb8d22d..9c82c69 100644 --- a/engine/narcissus-gpu/Cargo.toml +++ b/engine/narcissus-gpu/Cargo.toml @@ -5,6 +5,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["debug_markers"] +debug_markers = [] + [dependencies] narcissus-core = { path = "../narcissus-core" } blake3-smol = { path = "../../external/blake3-smol" } diff --git a/engine/narcissus-gpu/src/backend/vulkan/mod.rs b/engine/narcissus-gpu/src/backend/vulkan/mod.rs index 09b14bb..fc04a4a 100644 --- a/engine/narcissus-gpu/src/backend/vulkan/mod.rs +++ b/engine/narcissus-gpu/src/backend/vulkan/mod.rs @@ -392,6 +392,9 @@ pub(crate) struct VulkanDevice { _global_fn: vk::GlobalFunctions, instance_fn: vk::InstanceFunctions, device_fn: vk::DeviceFunctions, + + #[cfg(feature = "debug_markers")] + debug_utils_fn: Option, } impl VulkanDevice { @@ -444,12 +447,22 @@ impl VulkanDevice { let mut enabled_extensions = vec![]; let mut has_get_surface_capabilities2 = false; + #[cfg(feature = "debug_markers")] + let mut has_debug_utils = false; for extension in &extension_properties { let extension_name = CStr::from_bytes_until_nul(&extension.extension_name).unwrap(); - if extension_name.to_str().unwrap() == "VK_KHR_get_surface_capabilities2" { - has_get_surface_capabilities2 = true; - enabled_extensions.push(extension_name); - break; + match extension_name.to_str().unwrap() { + "VK_KHR_get_surface_capabilities2" => { + has_get_surface_capabilities2 = true; + enabled_extensions.push(extension_name); + } + + #[cfg(feature = "debug_markers")] + "VK_EXT_debug_utils" => { + has_debug_utils = true; + enabled_extensions.push(extension_name); + } + _ => {} } } @@ -654,6 +667,18 @@ impl VulkanDevice { let device_fn = vk::DeviceFunctions::new(&instance_fn, device, vk::VERSION_1_3); + #[cfg(feature = "debug_markers")] + let debug_utils_fn = if has_debug_utils { + Some(vk::DebugUtilsFunctions::new( + &global_fn, + &instance_fn, + instance, + device, + )) + } else { + None + }; + let wsi = Box::new(VulkanWsi::new(&global_fn, instance, wsi_support)); let universal_queue = unsafe { @@ -733,15 +758,6 @@ impl VulkanDevice { Self { instance, physical_device, - physical_device_properties, - _physical_device_properties_11: physical_device_properties_11, - _physical_device_properties_12: physical_device_properties_12, - _physical_device_properties_13: physical_device_properties_13, - _physical_device_features: physical_device_features, - _physical_device_features_11: physical_device_features_11, - _physical_device_features_12: physical_device_features_12, - _physical_device_features_13: physical_device_features_13, - physical_device_memory_properties, device, universal_queue, @@ -769,9 +785,22 @@ impl VulkanDevice { allocator, + physical_device_properties, + _physical_device_properties_11: physical_device_properties_11, + _physical_device_properties_12: physical_device_properties_12, + _physical_device_properties_13: physical_device_properties_13, + _physical_device_features: physical_device_features, + _physical_device_features_11: physical_device_features_11, + _physical_device_features_12: physical_device_features_12, + _physical_device_features_13: physical_device_features_13, + physical_device_memory_properties, + _global_fn: global_fn, instance_fn, device_fn, + + #[cfg(feature = "debug_markers")] + debug_utils_fn, } } @@ -1580,6 +1609,50 @@ impl Device for VulkanDevice { } } + fn cmd_insert_marker(&self, cmd_encoder: &mut CmdEncoder, label_name: &str, color: [f32; 4]) { + #[cfg(feature = "debug_markers")] + if let Some(debug_utils_fn) = &self.debug_utils_fn { + let arena = HybridArena::<256>::new(); + let label_name = arena.alloc_cstr_from_str(label_name); + + let command_buffer = self.cmd_encoder_mut(cmd_encoder).command_buffer; + let label_info = vk::DebugUtilsLabelExt { + label_name: label_name.as_ptr(), + color, + ..default() + }; + unsafe { + debug_utils_fn.cmd_insert_debug_utils_label_ext(command_buffer, &label_info); + } + } + } + + fn cmd_begin_marker(&self, cmd_encoder: &mut CmdEncoder, label_name: &str, color: [f32; 4]) { + #[cfg(feature = "debug_markers")] + if let Some(debug_utils_fn) = &self.debug_utils_fn { + let arena = HybridArena::<256>::new(); + let label_name = arena.alloc_cstr_from_str(label_name); + + let command_buffer = self.cmd_encoder_mut(cmd_encoder).command_buffer; + let label_info = vk::DebugUtilsLabelExt { + label_name: label_name.as_ptr(), + color, + ..default() + }; + unsafe { + debug_utils_fn.cmd_begin_debug_utils_label_ext(command_buffer, &label_info); + } + } + } + + fn cmd_end_marker(&self, cmd_encoder: &mut CmdEncoder) { + #[cfg(feature = "debug_markers")] + if let Some(debug_utils_fn) = &self.debug_utils_fn { + let command_buffer = self.cmd_encoder_mut(cmd_encoder).command_buffer; + unsafe { debug_utils_fn.cmd_end_debug_utils_label_ext(command_buffer) } + } + } + fn cmd_compute_touch_swapchain(&self, cmd_encoder: &mut CmdEncoder, image: Image) { let cmd_encoder = self.cmd_encoder_mut(cmd_encoder); diff --git a/engine/narcissus-gpu/src/lib.rs b/engine/narcissus-gpu/src/lib.rs index 0212256..3135949 100644 --- a/engine/narcissus-gpu/src/lib.rs +++ b/engine/narcissus-gpu/src/lib.rs @@ -819,6 +819,10 @@ pub trait Device { thread_token: &'a ThreadToken, ) -> CmdEncoder<'a>; + fn cmd_insert_marker(&self, cmd_encoder: &mut CmdEncoder, label_name: &str, color: [f32; 4]); + fn cmd_begin_marker(&self, cmd_encoder: &mut CmdEncoder, label_name: &str, color: [f32; 4]); + fn cmd_end_marker(&self, cmd_encoder: &mut CmdEncoder); + fn cmd_set_bind_group( &self, frame: &Frame,