From 3c7d4021e9599660b95d1074201e32a8c6d4530d Mon Sep 17 00:00:00 2001 From: zac Date: Sat, 30 Aug 2025 18:24:00 +1000 Subject: [PATCH 1/2] change extension_names to use vk.extensions over hardcoded string --- examples/graphics_context.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/graphics_context.zig b/examples/graphics_context.zig index ea0c1b4..a907853 100644 --- a/examples/graphics_context.zig +++ b/examples/graphics_context.zig @@ -53,8 +53,8 @@ pub const GraphicsContext = struct { defer extension_names.deinit(allocator); // these extensions are to support vulkan in mac os // see https://github.com/glfw/glfw/issues/2335 - try extension_names.append(allocator, "VK_KHR_portability_enumeration"); - try extension_names.append(allocator, "VK_KHR_get_physical_device_properties2"); + try extension_names.append(allocator, vk.extensions.khr_portability_enumeration.name); + try extension_names.append(allocator, vk.extensions.khr_get_physical_device_properties_2.name); var glfw_exts_count: u32 = 0; const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count); From ecf97034c426a2f681d97086fc88ca36994bc3cb Mon Sep 17 00:00:00 2001 From: zac Date: Sat, 30 Aug 2025 18:24:33 +1000 Subject: [PATCH 2/2] add debug messenger to graphics context --- examples/graphics_context.zig | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/examples/graphics_context.zig b/examples/graphics_context.zig index a907853..7ba42f8 100644 --- a/examples/graphics_context.zig +++ b/examples/graphics_context.zig @@ -35,6 +35,7 @@ pub const GraphicsContext = struct { vkb: BaseWrapper, instance: Instance, + debug_messenger: vk.DebugUtilsMessengerEXT, surface: vk.SurfaceKHR, pdev: vk.PhysicalDevice, props: vk.PhysicalDeviceProperties, @@ -51,7 +52,8 @@ pub const GraphicsContext = struct { var extension_names: std.ArrayList([*:0]const u8) = .empty; defer extension_names.deinit(allocator); - // these extensions are to support vulkan in mac os + try extension_names.append(allocator, vk.extensions.ext_debug_utils.name); + // the following extensions are to support vulkan in mac os // see https://github.com/glfw/glfw/issues/2335 try extension_names.append(allocator, vk.extensions.khr_portability_enumeration.name); try extension_names.append(allocator, vk.extensions.khr_get_physical_device_properties_2.name); @@ -81,6 +83,22 @@ pub const GraphicsContext = struct { self.instance = Instance.init(instance, vki); errdefer self.instance.destroyInstance(null); + self.debug_messenger = try self.instance.createDebugUtilsMessengerEXT(&.{ + .message_severity = .{ + //.verbose_bit_ext = true, + //.info_bit_ext = true, + .warning_bit_ext = true, + .error_bit_ext = true, + }, + .message_type = .{ + .general_bit_ext = true, + .validation_bit_ext = true, + .performance_bit_ext = true, + }, + .pfn_user_callback = &debugUtilsMessengerCallback, + .p_user_data = null, + }, null); + self.surface = try createSurface(self.instance, window); errdefer self.instance.destroySurfaceKHR(self.surface, null); @@ -107,6 +125,7 @@ pub const GraphicsContext = struct { pub fn deinit(self: GraphicsContext) void { self.dev.destroyDevice(null); self.instance.destroySurfaceKHR(self.surface, null); + self.instance.destroyDebugUtilsMessengerEXT(self.debug_messenger, null); self.instance.destroyInstance(null); // Don't forget to free the tables to prevent a memory leak. @@ -196,6 +215,17 @@ const QueueAllocation = struct { present_family: u32, }; +fn debugUtilsMessengerCallback(severity: vk.DebugUtilsMessageSeverityFlagsEXT, msg_type: vk.DebugUtilsMessageTypeFlagsEXT, callback_data: ?*const vk.DebugUtilsMessengerCallbackDataEXT, _: ?*anyopaque) callconv(.c) vk.Bool32 { + const severity_str = if (severity.verbose_bit_ext) "verbose" else if (severity.info_bit_ext) "info" else if (severity.warning_bit_ext) "warning" else if (severity.error_bit_ext) "error" else "unknown"; + + const type_str = if (msg_type.general_bit_ext) "general" else if (msg_type.validation_bit_ext) "validation" else if (msg_type.performance_bit_ext) "performance" else if (msg_type.device_address_binding_bit_ext) "device addr" else "unknown"; + + const message: [*c]const u8 = if (callback_data) |cb_data| cb_data.p_message else "NO MESSAGE!"; + std.debug.print("[{s}][{s}]. Message:\n {s}\n", .{ severity_str, type_str, message }); + + return .false; +} + fn pickPhysicalDevice( instance: Instance, allocator: Allocator,