Feature checking at instance.zig | ImGui example README.md

This commit is contained in:
abux 2026-08-18 22:21:16 +01:00
parent 8c7421b978
commit b7d2d46e8b
9 changed files with 68 additions and 18 deletions

6
examples/imgui/README.md Normal file
View file

@ -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

BIN
examples/imgui/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -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);
//

View file

@ -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 ---

View file

@ -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),
};
}

View file

@ -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 {

View file

@ -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,
};
// --- # ---

View file

@ -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",
};

View file

@ -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));
}
/// ----------------------------------------------------