Resizable window
This commit is contained in:
parent
f404232edb
commit
408adc5623
7 changed files with 94 additions and 3 deletions
|
|
@ -28,6 +28,7 @@ pub const GPUMaterial = struct { // TODO: Should prob create Material Cache inst
|
||||||
//
|
//
|
||||||
|
|
||||||
pipelines: gtl.KeyedSlotMap(Material.Unique, GPUPipeline),
|
pipelines: gtl.KeyedSlotMap(Material.Unique, GPUPipeline),
|
||||||
|
materials: gtl.SlotMap(GPUMaterial),
|
||||||
shader_cache: *ShaderCache,
|
shader_cache: *ShaderCache,
|
||||||
queue: *wgpu.WGPUQueueImpl,
|
queue: *wgpu.WGPUQueueImpl,
|
||||||
device: *wgpu.WGPUDeviceImpl,
|
device: *wgpu.WGPUDeviceImpl,
|
||||||
|
|
@ -43,6 +44,7 @@ pub fn init(
|
||||||
) Self {
|
) Self {
|
||||||
return .{
|
return .{
|
||||||
.pipelines = .init(alloc),
|
.pipelines = .init(alloc),
|
||||||
|
.materials = .init(alloc),
|
||||||
.shader_cache = shader_cache,
|
.shader_cache = shader_cache,
|
||||||
.queue = queue,
|
.queue = queue,
|
||||||
.device = device,
|
.device = device,
|
||||||
|
|
@ -58,8 +60,15 @@ pub fn deinit(self: *Self) void {
|
||||||
wgpu.wgpuRenderPipelineRelease(entry.value.raw);
|
wgpu.wgpuRenderPipelineRelease(entry.value.raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- FREE MATERIALS ---
|
||||||
|
for (self.materials.items()) |gpu| {
|
||||||
|
wgpu.wgpuBufferRelease(gpu.buffer);
|
||||||
|
wgpu.wgpuBindGroupRelease(gpu.bind_group);
|
||||||
|
}
|
||||||
|
|
||||||
// --- # ---
|
// --- # ---
|
||||||
self.pipelines.deinit();
|
self.pipelines.deinit();
|
||||||
|
self.materials.deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ----------------------------------------------------
|
/// ----------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,53 @@
|
||||||
//! ----------------------------------------------------
|
//! ----------------------------------------------------
|
||||||
//! ----------------------------------------------------
|
//! ----------------------------------------------------
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
const sdl = @import("sdl");
|
const sdl = @import("sdl");
|
||||||
|
const sdl_glue = @import("sdl_glue");
|
||||||
|
const wgpu = @import("wgpu");
|
||||||
const App = @import("app");
|
const App = @import("app");
|
||||||
|
|
||||||
|
const Window = @import("../../window/resource/window.zig");
|
||||||
|
const Resized = @import("../../window/event/resized.zig");
|
||||||
|
const WGPUInstance = @import("../../platform/resource/wgpu_instance.zig");
|
||||||
|
const WGPUDevice = @import("../../device/resource/wgpu_device.zig");
|
||||||
|
|
||||||
/// ----------------------------------------------------
|
/// ----------------------------------------------------
|
||||||
/// ----------------------------------------------------
|
/// ----------------------------------------------------
|
||||||
pub fn pollEvents(app: *App) !void {
|
pub fn pollEvents(app: *App) !void {
|
||||||
|
// --- # ---
|
||||||
|
const res = try app.resources.getMany(struct {
|
||||||
|
instance: *WGPUInstance,
|
||||||
|
window: *Window,
|
||||||
|
device: *WGPUDevice,
|
||||||
|
});
|
||||||
|
|
||||||
var event: sdl.SDL_Event = undefined;
|
var event: sdl.SDL_Event = undefined;
|
||||||
while (sdl.SDL_PollEvent(&event)) {
|
while (sdl.SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
sdl.SDL_EVENT_QUIT => try app.events.send(App.event.AppExit{}),
|
sdl.SDL_EVENT_QUIT => try app.events.send(App.event.AppExit{}),
|
||||||
|
sdl.SDL_EVENT_WINDOW_RESIZED => {
|
||||||
|
// --- # ---
|
||||||
|
try app.events.send(Resized{
|
||||||
|
.width = @intCast(event.window.data1),
|
||||||
|
.height = @intCast(event.window.data2),
|
||||||
|
});
|
||||||
|
|
||||||
|
// --- RELEASE ---
|
||||||
|
sdl_glue.wgpuSurfaceUnconfigure(res.window.surface);
|
||||||
|
|
||||||
|
// --- CONFIGURE SURFACE ---
|
||||||
|
sdl_glue.wgpuSurfaceConfigure(
|
||||||
|
res.window.surface,
|
||||||
|
&sdl_glue.WGPUSurfaceConfiguration{
|
||||||
|
.device = @ptrCast(res.device.raw),
|
||||||
|
.format = 28, // TODO: Get format properly, idk, store it somewhere
|
||||||
|
.width = @intCast(event.window.data1),
|
||||||
|
.height = @intCast(event.window.data2),
|
||||||
|
.usage = sdl_glue.WGPUTextureUsage_RenderAttachment,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,14 @@ pub const DrawCMD = union(enum) {
|
||||||
begin_pass: struct {
|
begin_pass: struct {
|
||||||
camera: Handle(Camera),
|
camera: Handle(Camera),
|
||||||
color: [4]f32 = .{ 0, 0, 0, 255 },
|
color: [4]f32 = .{ 0, 0, 0, 255 },
|
||||||
|
load_op: enum {
|
||||||
|
load,
|
||||||
|
clear,
|
||||||
|
} = .clear,
|
||||||
|
store_op: enum {
|
||||||
|
store,
|
||||||
|
discard,
|
||||||
|
} = .store,
|
||||||
},
|
},
|
||||||
|
|
||||||
end_pass,
|
end_pass,
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,17 @@ pub fn begin(app: *App) !void {
|
||||||
.material = .{},
|
.material = .{},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // TEST
|
||||||
|
// --- DRAW ---
|
||||||
|
try res.renderer.draw(.{
|
||||||
|
.begin_pass = .{
|
||||||
|
.camera = undefined,
|
||||||
|
.load_op = .load,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
defer res.renderer.draw(.end_pass) catch unreachable;
|
||||||
|
|
||||||
// --- # ---
|
// --- # ---
|
||||||
try res.renderer.draw(.{
|
try res.renderer.draw(.{
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ const wgpu = @import("wgpu");
|
||||||
const App = @import("app");
|
const App = @import("app");
|
||||||
|
|
||||||
const Window = @import("../../window/resource/window.zig");
|
const Window = @import("../../window/resource/window.zig");
|
||||||
|
const Resized = @import("../../window/event/resized.zig");
|
||||||
const Device = @import("../../device/resource/wgpu_device.zig");
|
const Device = @import("../../device/resource/wgpu_device.zig");
|
||||||
const Renderer = @import("../resource/renderer.zig");
|
const Renderer = @import("../resource/renderer.zig");
|
||||||
const PipelineCache = @import("../../cache/resource/pipeline_cache.zig");
|
const PipelineCache = @import("../../cache/resource/pipeline_cache.zig");
|
||||||
|
|
@ -23,6 +24,11 @@ pub fn draw(app: *App) !void {
|
||||||
mesh_cache: *MeshCache,
|
mesh_cache: *MeshCache,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// --- DO NONE ON WINDOW RESIZE ---
|
||||||
|
if (app.events.consume(Resized)) |_| {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// --- SURFACE TEXTURE ---
|
// --- SURFACE TEXTURE ---
|
||||||
var surface_texture: wgpu.WGPUSurfaceTexture = .{};
|
var surface_texture: wgpu.WGPUSurfaceTexture = .{};
|
||||||
defer wgpu.wgpuTextureRelease(surface_texture.texture);
|
defer wgpu.wgpuTextureRelease(surface_texture.texture);
|
||||||
|
|
@ -33,6 +39,17 @@ pub fn draw(app: *App) !void {
|
||||||
&surface_texture,
|
&surface_texture,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// --- DEBUG ---
|
||||||
|
switch (surface_texture.status) {
|
||||||
|
wgpu.WGPUSurfaceGetCurrentTextureStatus_Error => {
|
||||||
|
std.debug.print("\x1b[31m[SURFACE_TEXTURE_ERROR]\x1b[0m\n", .{});
|
||||||
|
},
|
||||||
|
wgpu.WGPUSurfaceGetCurrentTextureStatus_Outdated => {
|
||||||
|
std.debug.print("\x1b[31m[SURFACE_TEXTURE_OUTDATED]\x1b[0m\n", .{});
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
|
||||||
// --- GET SURFACE COLOR VIEW ---
|
// --- GET SURFACE COLOR VIEW ---
|
||||||
const target_view = wgpu.wgpuTextureCreateView(surface_texture.texture, &wgpu.WGPUTextureViewDescriptor{
|
const target_view = wgpu.wgpuTextureCreateView(surface_texture.texture, &wgpu.WGPUTextureViewDescriptor{
|
||||||
.format = wgpu.wgpuTextureGetFormat(surface_texture.texture),
|
.format = wgpu.wgpuTextureGetFormat(surface_texture.texture),
|
||||||
|
|
@ -72,8 +89,14 @@ pub fn draw(app: *App) !void {
|
||||||
.colorAttachments = &wgpu.WGPURenderPassColorAttachment{
|
.colorAttachments = &wgpu.WGPURenderPassColorAttachment{
|
||||||
.view = target_view,
|
.view = target_view,
|
||||||
.resolveTarget = null,
|
.resolveTarget = null,
|
||||||
.loadOp = wgpu.WGPULoadOp_Clear,
|
.loadOp = switch (v.load_op) {
|
||||||
.storeOp = wgpu.WGPUStoreOp_Store,
|
.load => wgpu.WGPULoadOp_Load,
|
||||||
|
.clear => wgpu.WGPULoadOp_Clear,
|
||||||
|
},
|
||||||
|
.storeOp = switch (v.store_op) {
|
||||||
|
.store => wgpu.WGPUStoreOp_Store,
|
||||||
|
.discard => wgpu.WGPUStoreOp_Discard,
|
||||||
|
},
|
||||||
.clearValue = .{
|
.clearValue = .{
|
||||||
.r = v.color[0],
|
.r = v.color[0],
|
||||||
.g = v.color[1],
|
.g = v.color[1],
|
||||||
|
|
|
||||||
2
src/plugins/window/event/resized.zig
Normal file
2
src/plugins/window/event/resized.zig
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
|
@ -17,6 +17,7 @@ const WGPUDevice = @import("../device/resource/wgpu_device.zig");
|
||||||
//
|
//
|
||||||
|
|
||||||
pub const Window = @import("resource/window.zig");
|
pub const Window = @import("resource/window.zig");
|
||||||
|
pub const Resized = @import("event/resized.zig");
|
||||||
|
|
||||||
/// ----------------------------------------------------
|
/// ----------------------------------------------------
|
||||||
/// ----------------------------------------------------
|
/// ----------------------------------------------------
|
||||||
|
|
@ -50,7 +51,7 @@ pub fn init(app: *App) !void {
|
||||||
"NYXEngine",
|
"NYXEngine",
|
||||||
800,
|
800,
|
||||||
600,
|
600,
|
||||||
0,
|
sdl.SDL_WINDOW_RESIZABLE | sdl.SDL_WINDOW_HIGH_PIXEL_DENSITY,
|
||||||
) orelse return error.CreateWindow;
|
) orelse return error.CreateWindow;
|
||||||
|
|
||||||
// --- SURFACE ---
|
// --- SURFACE ---
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue