|
1 | 1 | const std = @import("std"); |
2 | 2 | const vk = @import("vulkan"); |
3 | | -const PhysicalDevice = @import("PhysicalDevice.zig").PhysicalDevice; |
4 | | -const Object = @import("object.zig").Object; |
5 | | - |
6 | | -pub const Instance = extern struct { |
7 | | - const Self = @This(); |
8 | | - pub const ObjectType: vk.ObjectType = .instance; |
9 | | - pub const vtable: VTable = .{}; |
10 | | - |
11 | | - object: Object, |
12 | | - //physical_devices: std.ArrayList(*PhysicalDevice), |
13 | | - alloc_callbacks: vk.AllocationCallbacks, |
14 | | - |
15 | | - pub const VTable = struct { |
16 | | - createInstance: ?vk.PfnCreateInstance = null, |
17 | | - destroyInstance: ?vk.PfnDestroyInstance = null, |
18 | | - enumeratePhysicalDevices: ?vk.PfnEnumeratePhysicalDevices = null, |
19 | | - getInstanceProcAddr: ?vk.PfnGetInstanceProcAddr = null, |
20 | | - enumerateInstanceVersion: ?vk.PfnEnumerateInstanceVersion = null, |
21 | | - //enumerateInstanceLayerProperties: vk.PfnEnumerateInstanceProperties = null, |
22 | | - enumerateInstanceExtensionProperties: ?vk.PfnEnumerateInstanceExtensionProperties = null, |
| 3 | +const dispatchable = @import("dispatchable.zig"); |
| 4 | + |
| 5 | +const Self = @This(); |
| 6 | +pub const ObjectType: vk.ObjectType = .instance; |
| 7 | + |
| 8 | +alloc_callbacks: vk.AllocationCallbacks, |
| 9 | + |
| 10 | +vtable: VTable, |
| 11 | + |
| 12 | +pub fn init(self: *Self, p_infos: ?*const vk.InstanceCreateInfo, callbacks: ?*const vk.AllocationCallbacks) !void { |
| 13 | + const infos = p_infos orelse return error.NullCreateInfos; |
| 14 | + if (infos.s_type != .instance_create_info) { |
| 15 | + return error.InvalidCreateInfos; |
| 16 | + } |
| 17 | + |
| 18 | + self.vtable = .{ |
| 19 | + .destroyInstance = null, |
| 20 | + .enumeratePhysicalDevices = null, |
| 21 | + .enumerateInstanceVersion = null, |
| 22 | + //.enumerateInstanceLayerProperties = null, |
| 23 | + .enumerateInstanceExtensionProperties = null, |
23 | 24 | }; |
| 25 | + |
| 26 | + if (callbacks) |c| { |
| 27 | + self.alloc_callbacks = c.*; |
| 28 | + } |
| 29 | +} |
| 30 | + |
| 31 | +pub fn getProcAddr(self: *const Self, name: []const u8) vk.PfnVoidFunction { |
| 32 | + const allocator = std.heap.c_allocator; |
| 33 | + |
| 34 | + const KV = struct { []const u8, vk.PfnVoidFunction }; |
| 35 | + const pfn_map = std.StaticStringMap(vk.PfnVoidFunction).init([_]KV{ |
| 36 | + .{ "vkDestroyInstance", @ptrCast(self.vtable.destroyInstance) }, |
| 37 | + .{ "vkEnumeratePhysicalDevices", @ptrCast(self.vtable.enumeratePhysicalDevices) }, |
| 38 | + .{ "vkEnumerateInstanceVersion", @ptrCast(self.vtable.enumerateInstanceVersion) }, |
| 39 | + .{ "vkEnumerateInstanceExtensionProperties", @ptrCast(self.vtable.enumerateInstanceExtensionProperties) }, |
| 40 | + }, allocator) catch return null; |
| 41 | + defer pfn_map.deinit(allocator); |
| 42 | + |
| 43 | + return if (pfn_map.get(name)) |pfn| pfn else null; |
| 44 | +} |
| 45 | + |
| 46 | +pub const VTable = struct { |
| 47 | + destroyInstance: ?vk.PfnDestroyInstance, |
| 48 | + enumeratePhysicalDevices: ?vk.PfnEnumeratePhysicalDevices, |
| 49 | + enumerateInstanceVersion: ?vk.PfnEnumerateInstanceVersion, |
| 50 | + //enumerateInstanceLayerProperties: vk.PfnEnumerateInstanceProperties, |
| 51 | + enumerateInstanceExtensionProperties: ?vk.PfnEnumerateInstanceExtensionProperties, |
24 | 52 | }; |
0 commit comments