From 872323bf2aa2b16b99284d287dad2b3b6cecc48b Mon Sep 17 00:00:00 2001 From: David Allemang Date: Wed, 20 Mar 2024 18:49:46 -0400 Subject: [PATCH] vulkan-tutorial 01 --- src/Window.zig | 60 ++++++++++++++++++++++++ src/main.zig | 124 ++++++++++++++++++++++++++----------------------- 2 files changed, 125 insertions(+), 59 deletions(-) create mode 100644 src/Window.zig diff --git a/src/Window.zig b/src/Window.zig new file mode 100644 index 0000000..fa39cce --- /dev/null +++ b/src/Window.zig @@ -0,0 +1,60 @@ +const Self = @This(); + +const std = @import("std"); +const c = @import("c.zig"); +const vk = @import("vk"); + +const BaseDispatch = vk.BaseWrapper(.{}); +const InstanceDispatch = vk.InstanceWrapper(.{}); +const DeviceDispatch = vk.DeviceWrapper(.{}); + +vkb: BaseDispatch, +vki: InstanceDispatch, +vkd: DeviceDispatch, + +window: *c.GLFWwindow, + +pub fn mainLoop(self: Self) void { + while (c.glfwWindowShouldClose(self.window) == 0) : (c.glfwPollEvents()) { + c.glfwSwapBuffers(self.window); + } +} + +fn initWindow(self: *Self) !void { + c.glfwWindowHint(c.GLFW_CLIENT_API, c.GLFW_NO_API); + self.window = c.glfwCreateWindow( + 1280, + 720, + "Hello World", + null, + null, + ) orelse return error.glfwCreateWindowFailed; + errdefer self.deinitWindow(); +} + +fn deinitWindow(self: Self) void { + c.glfwDestroyWindow(self.window); +} + +fn initVulkan(self: *Self) !void { + _ = self; +} + +fn deinitVulkan(self: Self) void { + _ = self; +} + +pub fn init() !Self { + var self: Self = undefined; + try self.initWindow(); + errdefer self.deinitWindow(); + try self.initVulkan(); + errdefer self.deinitVulkan(); + + return self; +} + +pub fn deinit(self: Self) void { + self.deinitWindow(); + self.deinitVulkan(); +} diff --git a/src/main.zig b/src/main.zig index 1fd54c1..a2a712f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,75 +1,81 @@ const std = @import("std"); - const c = @import("c.zig"); - const vk = @import("vk"); -const BaseDispatch = vk.BaseWrapper(.{ - .createInstance = true, - .getInstanceProcAddr = true, -}); +const Window = @import("Window.zig"); -const InstanceDispatch = vk.InstanceWrapper(.{ - .destroyInstance = true, -}); - -const Context = struct { - vkb: BaseDispatch, - vki: InstanceDispatch, - - instance: vk.Instance, - - pub fn init(allocator: std.mem.Allocator, app_name: [*:0]const u8, window: *c.GLFWwindow) !Context { - _ = allocator; - _ = window; - - var self: Context = undefined; - self.vkb = try BaseDispatch.load(c.glfwGetInstanceProcAddress); - - var glfw_exts_count: u32 = 0; - const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count); - - const app_info = vk.ApplicationInfo{ - .p_application_name = app_name, - .application_version = vk.makeApiVersion(0, 0, 0, 0), - .p_engine_name = app_name, - .engine_version = vk.makeApiVersion(0, 0, 0, 0), - .api_version = vk.API_VERSION_1_2, - }; - - self.instance = try self.vkb.createInstance(&.{ - .p_application_info = &app_info, - .enabled_extension_count = glfw_exts_count, - .pp_enabled_extension_names = @as([*]const [*:0]const u8, @ptrCast(glfw_exts)), - }, null); - - self.vki = try InstanceDispatch.load(self.instance, self.vkb.dispatch.vkGetInstanceProcAddr); - errdefer self.vki.destroyInstance(self.instance, null); - - return self; - } - - pub fn deinit(self: Context) void { - self.vki.destroyInstance(self.instance, null); - } -}; +// const BaseDispatch = vk.BaseWrapper(.{ +// .createInstance = true, +// .getInstanceProcAddr = true, +// }); +// +// const InstanceDispatch = vk.InstanceWrapper(.{ +// .destroyInstance = true, +// }); +// +// const Context = struct { +// vkb: BaseDispatch, +// vki: InstanceDispatch, +// +// instance: vk.Instance, +// +// pub fn init(allocator: std.mem.Allocator, app_name: [*:0]const u8, window: *c.GLFWwindow) !Context { +// _ = allocator; +// _ = window; +// +// var self: Context = undefined; +// self.vkb = try BaseDispatch.load(c.glfwGetInstanceProcAddress); +// +// var glfw_exts_count: u32 = 0; +// const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count); +// +// const app_info = vk.ApplicationInfo{ +// .p_application_name = app_name, +// .application_version = vk.makeApiVersion(0, 0, 0, 0), +// .p_engine_name = app_name, +// .engine_version = vk.makeApiVersion(0, 0, 0, 0), +// .api_version = vk.API_VERSION_1_2, +// }; +// +// self.instance = try self.vkb.createInstance(&.{ +// .p_application_info = &app_info, +// .enabled_extension_count = glfw_exts_count, +// .pp_enabled_extension_names = @as([*]const [*:0]const u8, @ptrCast(glfw_exts)), +// }, null); +// +// self.vki = try InstanceDispatch.load(self.instance, self.vkb.dispatch.vkGetInstanceProcAddr); +// errdefer self.vki.destroyInstance(self.instance, null); +// +// return self; +// } +// +// pub fn deinit(self: Context) void { +// self.vki.destroyInstance(self.instance, null); +// } +// }; pub fn main() !void { - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - const allocator = gpa.allocator(); + // var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + // const allocator = gpa.allocator(); if (c.glfwInit() != c.GLFW_TRUE) { return error.GlfwInitFailed; } defer c.glfwTerminate(); - const window: *c.GLFWwindow = c.glfwCreateWindow(1280, 720, "Hello World!", null, null) orelse return error.GlfwWindowFailed; - defer c.glfwDestroyWindow(window); + const window = try Window.init(); + defer window.deinit(); - const ctx = try Context.init(allocator, "content", window); - defer ctx.deinit(); + window.mainLoop(); - while (c.glfwWindowShouldClose(window) == 0) : (c.glfwPollEvents()) { - c.glfwSwapBuffers(window); - } + // c.glfwWindowHint(c.GLFW_CLIENT_API, c.GLFW_NO_API); + // const window: *c.GLFWwindow = c.glfwCreateWindow(1280, 720, "Hello World!", null, null) orelse return error.GlfwWindowFailed; + // defer c.glfwDestroyWindow(window); + + // const ctx = try Context.init(allocator, "content", window); + // defer ctx.deinit(); + + // while (c.glfwWindowShouldClose(window) == 0) : (c.glfwPollEvents()) { + // c.glfwSwapBuffers(window); + // } }