Added Plugins [Platform, Window, Device]

This commit is contained in:
abux 2026-07-28 22:37:49 +02:00
parent d00fdbdbcc
commit 0d72225229
7 changed files with 320 additions and 0 deletions

View file

@ -0,0 +1,4 @@
const wgpu = @import("wgpu");
raw: *wgpu.WGPUDeviceImpl,
queue: *wgpu.WGPUQueueImpl,

View file

@ -0,0 +1,32 @@
//! ----------------------------------------------------
//! ----------------------------------------------------
//
// PRIVATE
//
const App = @import("app");
const lifetime = @import("system/lifetime.zig");
//
// PUBLIC
//
pub const WGPUDevice = @import("resource/wgpu_device.zig");
/// ----------------------------------------------------
/// ----------------------------------------------------
pub const plugin: App.plugin.Plugin = .{
.name = "Device",
.build = build,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
fn build(
_: *App.plugin.Plugin,
app: *App,
) !void {
try app.schedules.add(App.stage.init, lifetime.init);
try app.schedules.add(App.stage.deinit, lifetime.deinit);
}

View file

@ -0,0 +1,161 @@
//! ----------------------------------------------------
//! ----------------------------------------------------
const std = @import("std");
const wgpu = @import("wgpu");
const App = @import("app");
const WGPUInstance = @import("../../platform/resource/wgpu_instance.zig");
const WGPUDevice = @import("../resource/wgpu_device.zig");
/// ----------------------------------------------------
/// ----------------------------------------------------
const AdapterUD = struct {
adapter: ?*wgpu.WGPUAdapterImpl = null,
ended: bool = false,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
const DeviceUD = struct {
device: ?*wgpu.WGPUDeviceImpl = null,
ended: bool = false,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
pub fn init(app: *App) !void {
// --- GET WGPU INSTANCE ---
const instance = app.resources.getPtr(
WGPUInstance,
) orelse return error.WGPUInstanceNotSet;
//
// ADAPTER
//
// TODO: Mabe Mabe add other backends n stuff
var adapter_userdata: AdapterUD = .{};
_ = wgpu.wgpuInstanceRequestAdapter(
instance.raw,
&wgpu.WGPURequestAdapterOptions{
.backendType = wgpu.WGPUBackendType_Vulkan,
},
wgpu.WGPURequestAdapterCallbackInfo{
.callback = adapterCallback,
.userdata1 = &adapter_userdata,
},
);
// --- ADAPTER ---
const adapter = if (adapter_userdata.adapter) |v| v else return error.NoAdapter;
defer wgpu.wgpuAdapterRelease(adapter);
//
// DEVICE
//
// --- REQUEST DEVICE ---
var device_userdata: DeviceUD = .{};
_ = wgpu.wgpuAdapterRequestDevice(
adapter,
&wgpu.WGPUDeviceDescriptor{
.label = .{ .data = "MainDevice", .length = wgpu.WGPU_STRLEN },
.uncapturedErrorCallbackInfo = .{
.callback = uncapturedErrorCallback,
},
},
.{
.callback = deviceCallback,
.userdata1 = &device_userdata,
},
);
// --- NEW WGPU DEVICE ---
try app.resources.set(WGPUDevice{
.raw = device_userdata.device orelse return error.DeviceIsBeginRetarded,
.queue = wgpu.wgpuDeviceGetQueue(
device_userdata.device,
) orelse return error.FailedToGetDeviceQueue,
});
}
/// ----------------------------------------------------
/// ----------------------------------------------------
pub fn deinit(app: *App) !void {
// --- # ---
const device = app.resources.getPtr(
WGPUDevice,
) orelse return error.WGPUDeviceNotSet;
// --- # ---
wgpu.wgpuQueueRelease(device.queue);
wgpu.wgpuDeviceRelease(device.raw);
}
/// ----------------------------------------------------
/// ----------------------------------------------------
fn uncapturedErrorCallback(
_: [*c]const wgpu.WGPUDevice,
err_type: wgpu.WGPUErrorType,
message: wgpu.WGPUStringView,
_: ?*anyopaque,
_: ?*anyopaque,
) callconv(.c) void {
std.debug.print("[{s}] {s}\n", .{
switch (err_type) {
wgpu.WGPUErrorType_Validation => "\x1b[33mVALIDATION\x1b[0m",
wgpu.WGPUErrorType_OutOfMemory => "\x1b[31mOUT_OF_MEMORY\x1b[0m",
else => "IDK",
},
message.data,
});
}
/// ----------------------------------------------------
/// ----------------------------------------------------
fn adapterCallback(
status: wgpu.WGPURequestAdapterStatus,
adapter: wgpu.WGPUAdapter,
message: wgpu.WGPUStringView,
raw_userdata: ?*anyopaque,
_: ?*anyopaque,
) callconv(.c) void {
// --- USERDATA ---
const userdata: *AdapterUD = @ptrCast(@alignCast(raw_userdata));
defer userdata.ended = true;
// --- STATUS ---
switch (status) {
wgpu.WGPURequestAdapterStatus_Success => userdata.adapter = adapter,
else => {
std.debug.print("Failed to get WebGPU adapter: {s}\n", .{
message.data,
});
},
}
}
/// ----------------------------------------------------
/// ----------------------------------------------------
fn deviceCallback(
status: wgpu.WGPURequestDeviceStatus,
device: wgpu.WGPUDevice,
message: wgpu.WGPUStringView,
raw_userdata: ?*anyopaque,
_: ?*anyopaque,
) callconv(.c) void {
// --- USERDATA ---
const userdata: *DeviceUD = @ptrCast(@alignCast(raw_userdata));
defer userdata.ended = true;
// --- STATUS ---
switch (status) {
wgpu.WGPURequestDeviceStatus_Success => userdata.device = device,
else => {
std.debug.print("Failed to get WebGPU adapter: {s}\n", .{
message.data,
});
},
}
}

View file

@ -0,0 +1,3 @@
const wgpu = @import("wgpu");
raw: *wgpu.WGPUInstanceImpl,

View file

@ -0,0 +1,64 @@
//! ----------------------------------------------------
//! ----------------------------------------------------
//
// PRIVATE
//
const std = @import("std");
const sdl = @import("sdl");
const wgpu = @import("wgpu");
const App = @import("app");
//
// PUBLIC
//
pub const WGPUInstance = @import("resource/wgpu_instance.zig");
/// ----------------------------------------------------
/// ----------------------------------------------------
pub const plugin: App.plugin.Plugin = .{
.name = "Platform",
.build = build,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
fn build(
_: *App.plugin.Plugin,
app: *App,
) !void {
try app.schedules.add(App.stage.init, init);
try app.schedules.add(App.stage.deinit, deinit);
}
/// ----------------------------------------------------
/// ----------------------------------------------------
pub fn init(app: *App) !void {
// --- SDL3 INIT ---
if (!sdl.SDL_Init(sdl.SDL_INIT_VIDEO)) {
std.debug.print("[SDL_ERROR] SDL_Init: {s}\n", .{sdl.SDL_GetError()});
return error.SDL_INIT;
}
// --- WGPU INIT ---
try app.resources.set(WGPUInstance{
.raw = wgpu.wgpuCreateInstance(&wgpu.WGPUInstanceDescriptor{}) orelse return {
return error.WGPU_Init;
},
});
}
/// ----------------------------------------------------
/// ----------------------------------------------------
pub fn deinit(app: *App) !void {
// --- # ---
const res = try app.resources.getMany(struct {
instance: *WGPUInstance,
});
// --- # ---
wgpu.wgpuInstanceRelease(res.instance.raw);
sdl.SDL_Quit();
}

View file

@ -0,0 +1,28 @@
//! ----------------------------------------------------
//! ----------------------------------------------------
//
// PRIVATE
//
const App = @import("app");
//
// PUBLIC
//
/// ----------------------------------------------------
/// ----------------------------------------------------
pub const plugin: App.plugin.Plugin = .{
.name = "Template",
.build = build,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
fn build(
_: *App.plugin.Plugin,
app: *App,
) !void {
_ = app;
}

View file

@ -0,0 +1,28 @@
//! ----------------------------------------------------
//! ----------------------------------------------------
//
// PRIVATE
//
const App = @import("app");
//
// PUBLIC
//
/// ----------------------------------------------------
/// ----------------------------------------------------
pub const plugin: App.plugin.Plugin = .{
.name = "Window",
.build = build,
};
/// ----------------------------------------------------
/// ----------------------------------------------------
fn build(
_: *App.plugin.Plugin,
app: *App,
) !void {
_ = app;
}