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 0000000..b995bc0 Binary files /dev/null and b/examples/imgui/image.png differ diff --git a/examples/imgui/imgui.zig b/examples/imgui/imgui.zig index 6fde90d..b67105c 100644 --- a/examples/imgui/imgui.zig +++ b/examples/imgui/imgui.zig @@ -45,9 +45,7 @@ pub fn main(init: std.process.Init) !void { // --- # --- const instance = try gfx.makeInstance(.{ - .vulkan = .{ - .api_version = .v1_3, - }, + .vulkan = .{}, }); const surface = try gfx.makeSurface(.{ @@ -58,7 +56,7 @@ pub fn main(init: std.process.Init) !void { }, instance); const adapter = try gfx.makeAdapter(.{}, instance); - const device = try gfx.makeDevice(adapter, surface); + const device = try gfx.makeDevice(instance, adapter, surface); const swapchain = try gfx.makeSwapchain(adapter, device, surface); // diff --git a/examples/simple/simple.zig b/examples/simple/simple.zig index 7241d68..7cfc70b 100644 --- a/examples/simple/simple.zig +++ b/examples/simple/simple.zig @@ -48,6 +48,9 @@ pub fn main(init: std.process.Init) !void { const instance = try gfx.makeInstance(.{ .vulkan = .{ .api_version = .v1_3, + .vk_14_features = .{ + .dynamic_rendering_local_read = false, + }, }, }); @@ -59,7 +62,7 @@ pub fn main(init: std.process.Init) !void { }, instance); const adapter = try gfx.makeAdapter(.{}, instance); - const device = try gfx.makeDevice(adapter, surface); + const device = try gfx.makeDevice(instance, adapter, surface); const swapchain = try gfx.makeSwapchain(adapter, device, surface); // --- TEXTURES --- diff --git a/src/gfx.zig b/src/gfx.zig index d70cfa6..a640cc1 100644 --- a/src/gfx.zig +++ b/src/gfx.zig @@ -208,11 +208,12 @@ pub fn getRawAdapter(self: *Self, adapter: Handle(Adapter)) !RawAdapter { /// ---------------------------------------------------- pub fn makeDevice( self: *Self, + instance: Handle(Instance), adapter: Handle(Adapter), surface: Handle(Surface), ) !Handle(Device) { return try switch ((try self.getBackend()).*) { - .vulkan => |*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)); } /// ----------------------------------------------------