From b7d2d46e8b446da40d4d7179b949a36c2af4147d Mon Sep 17 00:00:00 2001 From: abux Date: Tue, 18 Aug 2026 22:21:16 +0100 Subject: [PATCH] Feature checking at instance.zig | ImGui example README.md --- examples/imgui/README.md | 6 ++++ examples/imgui/image.png | Bin 0 -> 10164 bytes examples/imgui/imgui.zig | 6 ++-- examples/simple/simple.zig | 5 +++- src/gfx.zig | 3 +- src/rhi/common.zig | 2 +- src/rhi/vulkan/resource/device.zig | 42 ++++++++++++++++++++------- src/rhi/vulkan/resource/instance.zig | 18 ++++++++++++ src/rhi/vulkan/vulkan.zig | 4 ++- 9 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 examples/imgui/README.md create mode 100644 examples/imgui/image.png diff --git a/examples/imgui/README.md b/examples/imgui/README.md new file mode 100644 index 0000000..d239e9c --- /dev/null +++ b/examples/imgui/README.md @@ -0,0 +1,6 @@ +# ImGui Example + +![simple](image.png) + +Used dear_bindings with docking imgui branch +https://mrscriptx.github.io/devlog/zig/2025/04/30/zig-linking-dear-imgui.html diff --git a/examples/imgui/image.png b/examples/imgui/image.png new file mode 100644 index 0000000000000000000000000000000000000000..b995bc08be46cb3f75182ed0c853856f271dff0c GIT binary patch literal 10164 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 |*v| v.makeDevice(adapter, surface), + .vulkan => |*v| v.makeDevice(instance, adapter, surface), }; } diff --git a/src/rhi/common.zig b/src/rhi/common.zig index b0b2129..2a0174e 100644 --- a/src/rhi/common.zig +++ b/src/rhi/common.zig @@ -27,7 +27,7 @@ pub const VK13Features = struct { }; pub const VK14Features = struct { - dynamic_rendering_local_read: bool = true, + dynamic_rendering_local_read: bool = false, }; pub const DeviceType = enum { diff --git a/src/rhi/vulkan/resource/device.zig b/src/rhi/vulkan/resource/device.zig index 6f0b866..1b0bbfb 100644 --- a/src/rhi/vulkan/resource/device.zig +++ b/src/rhi/vulkan/resource/device.zig @@ -4,10 +4,12 @@ const std = @import("std"); const vk = @import("vulkan"); -const Adapter = @import("adapter.zig"); -const Surface = @import("surface.zig"); const Self = @This(); +const Instance = @import("instance.zig"); +const Surface = @import("surface.zig"); +const Adapter = @import("adapter.zig"); + /// ---------------------------------------------------- /// ---------------------------------------------------- pub const QueueFamilies = struct { @@ -28,19 +30,41 @@ graphics_command_pool: *vk.VkCommandPool_T, /// ---------------------------------------------------- /// ---------------------------------------------------- pub fn init( - adapter: *Adapter, - surface: *Surface, + instance: *const Instance, + adapter: *const Adapter, + surface: *const Surface, alloc: std.mem.Allocator, ) !Self { - // --- # --- const extensions: []const [*:0]const u8 = &.{ "VK_KHR_swapchain", }; - // --- # --- + var features14: vk.VkPhysicalDeviceVulkan14Features = .{ + .sType = vk.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES, + .dynamicRenderingLocalRead = @intFromBool(instance.vk_14_features.dynamic_rendering_local_read), + }; + var features13: vk.VkPhysicalDeviceVulkan13Features = .{ .sType = vk.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, - .dynamicRendering = vk.VK_TRUE, + .dynamicRendering = @intFromBool(instance.vk_13_features.dynamic_rendering), + .synchronization2 = @intFromBool(instance.vk_13_features.synchronization2), + .pNext = &features14, + }; + + var features12: vk.VkPhysicalDeviceVulkan12Features = .{ + .sType = vk.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + .pNext = &features13, + }; + + var features11: vk.VkPhysicalDeviceVulkan11Features = .{ + .sType = vk.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + .shaderDrawParameters = @intFromBool(instance.vk_11_features.shader_draw_parameters), + .pNext = &features12, + }; + + var features: vk.VkPhysicalDeviceFeatures2 = .{ + .sType = vk.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + .pNext = &features11, }; // --- FIND QUEUE FAMILIES --- @@ -73,15 +97,13 @@ pub fn init( } // --- DEVICE CREATE INFO --- - var features: vk.VkPhysicalDeviceFeatures = .{}; var create_info: vk.VkDeviceCreateInfo = .{ .sType = vk.VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, .pQueueCreateInfos = &queue_create_infos, .queueCreateInfoCount = queue_create_info_count, - .pEnabledFeatures = &features, .enabledExtensionCount = extensions.len, .ppEnabledExtensionNames = extensions.ptr, - .pNext = &features13, + .pNext = &features, }; // --- # --- diff --git a/src/rhi/vulkan/resource/instance.zig b/src/rhi/vulkan/resource/instance.zig index e932a4a..f269979 100644 --- a/src/rhi/vulkan/resource/instance.zig +++ b/src/rhi/vulkan/resource/instance.zig @@ -26,6 +26,24 @@ vk_14_features: cmn.VK14Features, /// ---------------------------------------------------- /// ---------------------------------------------------- pub fn init(config: cmn.VKInstanceConfig, alloc: std.mem.Allocator) !Self { + // --- ENSURE CORRECT FEATURES --- + switch (config.api_version) { + .v1_0, .v1_1, .v1_2 => { + if (config.vk_14_features.dynamic_rendering_local_read or + config.vk_13_features.dynamic_rendering or + config.vk_13_features.synchronization2) + { + return error.FeatureNotSupported; + } + }, + .v1_3 => { + if (config.vk_14_features.dynamic_rendering_local_read) { + return error.FeatureNotSupported; + } + }, + .v1_4 => {}, + } + const validation_layers: []const [*:0]const u8 = &.{ "VK_LAYER_KHRONOS_validation", }; diff --git a/src/rhi/vulkan/vulkan.zig b/src/rhi/vulkan/vulkan.zig index d315309..e2c24e3 100644 --- a/src/rhi/vulkan/vulkan.zig +++ b/src/rhi/vulkan/vulkan.zig @@ -206,12 +206,14 @@ pub fn getRawAdapter(self: *Self, adapter: Handle(Adapter)) !*vk.VkPhysicalDevic /// ---------------------------------------------------- pub fn makeDevice( self: *Self, + instance: Handle(common.Instance), adapter: Handle(Adapter), surface: Handle(Surface), ) !Handle(Device) { + const raw_instance = self.resource.instances.get(instance) orelse return error.InstanceNotFound; const raw_adapter = self.resource.adapters.get(adapter) orelse return error.AdapterNotFound; const raw_surface = self.resource.surfaces.get(surface) orelse return error.SurfaceNotFound; - return try self.resource.devices.put(try .init(raw_adapter, raw_surface, self.alloc)); + return try self.resource.devices.put(try .init(raw_instance, raw_adapter, raw_surface, self.alloc)); } /// ----------------------------------------------------