vulkan-tutorial 01

This commit is contained in:
David Allemang
2024-03-20 18:49:46 -04:00
parent 90f3ecda90
commit 872323bf2a
2 changed files with 125 additions and 59 deletions

60
src/Window.zig Normal file
View File

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

View File

@@ -1,75 +1,81 @@
const std = @import("std"); const std = @import("std");
const c = @import("c.zig"); const c = @import("c.zig");
const vk = @import("vk"); const vk = @import("vk");
const BaseDispatch = vk.BaseWrapper(.{ const Window = @import("Window.zig");
.createInstance = true,
.getInstanceProcAddr = true,
});
const InstanceDispatch = vk.InstanceWrapper(.{ // const BaseDispatch = vk.BaseWrapper(.{
.destroyInstance = true, // .createInstance = true,
}); // .getInstanceProcAddr = true,
// });
const Context = struct { //
vkb: BaseDispatch, // const InstanceDispatch = vk.InstanceWrapper(.{
vki: InstanceDispatch, // .destroyInstance = true,
// });
instance: vk.Instance, //
// const Context = struct {
pub fn init(allocator: std.mem.Allocator, app_name: [*:0]const u8, window: *c.GLFWwindow) !Context { // vkb: BaseDispatch,
_ = allocator; // vki: InstanceDispatch,
_ = window; //
// instance: vk.Instance,
var self: Context = undefined; //
self.vkb = try BaseDispatch.load(c.glfwGetInstanceProcAddress); // pub fn init(allocator: std.mem.Allocator, app_name: [*:0]const u8, window: *c.GLFWwindow) !Context {
// _ = allocator;
var glfw_exts_count: u32 = 0; // _ = window;
const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count); //
// var self: Context = undefined;
const app_info = vk.ApplicationInfo{ // self.vkb = try BaseDispatch.load(c.glfwGetInstanceProcAddress);
.p_application_name = app_name, //
.application_version = vk.makeApiVersion(0, 0, 0, 0), // var glfw_exts_count: u32 = 0;
.p_engine_name = app_name, // const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count);
.engine_version = vk.makeApiVersion(0, 0, 0, 0), //
.api_version = vk.API_VERSION_1_2, // const app_info = vk.ApplicationInfo{
}; // .p_application_name = app_name,
// .application_version = vk.makeApiVersion(0, 0, 0, 0),
self.instance = try self.vkb.createInstance(&.{ // .p_engine_name = app_name,
.p_application_info = &app_info, // .engine_version = vk.makeApiVersion(0, 0, 0, 0),
.enabled_extension_count = glfw_exts_count, // .api_version = vk.API_VERSION_1_2,
.pp_enabled_extension_names = @as([*]const [*:0]const u8, @ptrCast(glfw_exts)), // };
}, null); //
// self.instance = try self.vkb.createInstance(&.{
self.vki = try InstanceDispatch.load(self.instance, self.vkb.dispatch.vkGetInstanceProcAddr); // .p_application_info = &app_info,
errdefer self.vki.destroyInstance(self.instance, null); // .enabled_extension_count = glfw_exts_count,
// .pp_enabled_extension_names = @as([*]const [*:0]const u8, @ptrCast(glfw_exts)),
return self; // }, null);
} //
// self.vki = try InstanceDispatch.load(self.instance, self.vkb.dispatch.vkGetInstanceProcAddr);
pub fn deinit(self: Context) void { // errdefer self.vki.destroyInstance(self.instance, null);
self.vki.destroyInstance(self.instance, null); //
} // return self;
}; // }
//
// pub fn deinit(self: Context) void {
// self.vki.destroyInstance(self.instance, null);
// }
// };
pub fn main() !void { pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; // var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator(); // const allocator = gpa.allocator();
if (c.glfwInit() != c.GLFW_TRUE) { if (c.glfwInit() != c.GLFW_TRUE) {
return error.GlfwInitFailed; return error.GlfwInitFailed;
} }
defer c.glfwTerminate(); defer c.glfwTerminate();
const window: *c.GLFWwindow = c.glfwCreateWindow(1280, 720, "Hello World!", null, null) orelse return error.GlfwWindowFailed; const window = try Window.init();
defer c.glfwDestroyWindow(window); defer window.deinit();
const ctx = try Context.init(allocator, "content", window); window.mainLoop();
defer ctx.deinit();
while (c.glfwWindowShouldClose(window) == 0) : (c.glfwPollEvents()) { // c.glfwWindowHint(c.GLFW_CLIENT_API, c.GLFW_NO_API);
c.glfwSwapBuffers(window); // 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);
// }
} }