diff --git a/engine/imgui/src/sgpu/backend_impl.zig b/engine/imgui/src/sgpu/backend_impl.zig index 8380788..3944b06 100644 --- a/engine/imgui/src/sgpu/backend_impl.zig +++ b/engine/imgui/src/sgpu/backend_impl.zig @@ -42,18 +42,36 @@ pub const Impl = struct { c.Imgui_SDL3_PrepareRender(@ptrCast(self.drawData), @ptrCast(cmd)); } - pub fn postRender(p: *anyopaque, cmd: *gpu.GPUCommandBuffer, renderPass: *gpu.GPURenderPass) void { + pub fn postRender(p: *anyopaque, cmd: *gpu.GPUCommandBuffer) void { const self: *@This() = @ptrCast(@alignCast(p)); + //const renderpass = cmd.beginGPURenderPass(color_target_infos: [*c]const GPUColorTargetInfo, num_color_targets: u32, depth_stencil_target_info: [*c]const GPUDepthStencilTargetInfo); + + var targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroes(gpu.GPUColorTargetInfo); + targetInfo.texture = rend.context().swapchainTexture; + targetInfo.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 0.0 }; + targetInfo.load_op = .loadopDontCare; + targetInfo.store_op = .storeopStore; + const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null); + // SDL_GPUColorTargetInfo target_info = {}; + // target_info.texture = swapchain_texture; + // target_info.clear_color = SDL_FColor { clear_color.x, clear_color.y, clear_color.z, clear_color.w }; + // target_info.load_op = SDL_GPU_LOADOP_CLEAR; + // target_info.store_op = SDL_GPU_STOREOP_STORE; + // target_info.mip_level = 0; + // target_info.layer_or_depth_plane = 0; + // target_info.cycle = false; + c.ImGui_SDLGPU3_RenderDrawData( @ptrCast(self.drawData), @ptrCast(cmd), - @ptrCast(renderPass), + @ptrCast(renderpass), ); + + renderpass.endGPURenderPass(); } pub fn preTick(_: *@This(), _: f64) core.EngineDataEventError!void { - core.engine_logs("imgui pretick"); c.Imgui_SDL3_NewFrame(); c.igNewFrame(); } diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 463955d..08b824d 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -31,12 +31,15 @@ pub const Renderer = struct { uploads: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque, *gpu.GPUCopyPass) void }) = .{}, uploadCleanup: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque) void }) = .{}, - postRenders: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque, *gpu.GPUCommandBuffer, *gpu.GPURenderPass) void }) = .{}, + postRenders: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque, *gpu.GPUCommandBuffer) void }) = .{}, destroys: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque) void }) = .{}, preDraws: std.ArrayListUnmanaged(struct { ptr: *anyopaque, func: *const fn (*anyopaque, *gpu.GPUCommandBuffer) void }) = .{}, depthTexture: *gpu.GPUTexture = undefined, + // transients DO NOT TOUCH + swapchainTexture: *gpu.GPUTexture = undefined, + pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This()); pub const MaxObjectCount = 50000; @@ -374,10 +377,9 @@ pub const Renderer = struct { interface.func(interface.ptr, cmd); } - var swapchainTexture: *gpu.GPUTexture = undefined; - if (cmd.waitAndAcquireGPUSwapchainTexture(self.window, &swapchainTexture, null, null)) { + if (cmd.waitAndAcquireGPUSwapchainTexture(self.window, &self.swapchainTexture, null, null)) { var targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroes(gpu.GPUColorTargetInfo); - targetInfo.texture = swapchainTexture; + targetInfo.texture = self.swapchainTexture; targetInfo.clear_color = .{ .r = 0.1, .g = 0.1, .b = 0.1, .a = 1.0 }; targetInfo.load_op = .loadopClear; targetInfo.store_op = .storeopStore; @@ -420,13 +422,14 @@ pub const Renderer = struct { } } + renderpass.endGPURenderPass(); + for (self.postRenders.items) |interface| { - interface.func(interface.ptr, cmd, renderpass); + interface.func(interface.ptr, cmd); } // renderpass.drawGPUPrimitives(3, 1, 0, 0); - renderpass.endGPURenderPass(); } _ = cmd.submitGPUCommandBuffer(); @@ -439,6 +442,8 @@ pub const Renderer = struct { d.func(d.ptr); } self.uploadCleanup.deinit(self.allocator); + self.preDraws.deinit(self.allocator); + self.postRenders.deinit(self.allocator); self.uploads.deinit(self.allocator); self.destroys.deinit(self.allocator); self.allocator.destroy(self);