const std = @import("std"); const drm = @import("drm/root.zig"); const graphics = @import("estd").graphics; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); var card = try drm.Card.open("card0", allocator); defer card.close(); var resources = try card.resources(); defer resources.deinit(); var connector = try resources.connector(0); defer connector.deinit(); const mode = connector.modes[12]; std.debug.print("using mode: {s}@{d:.2}\n", .{mode.name, mode.frame_rate()}); var crtc = try resources.crtc( connector.compatible_crtc() orelse @panic("no crtc found") ); defer crtc.detach(); var buffer = try card.create_buffer(mode.horizontal.size, mode.vertical.size); defer buffer.deinit(); try crtc.attach(&buffer, &connector, mode); const center_x: i64 = @intCast(buffer.current.width / 2 - 100); const center_y: i64 = @intCast(buffer.current.height / 2 - 100); var box = graphics.Box { .x = @intCast(center_x), .y = @intCast(center_y), .width = 200, .height = 200, .color = .{ .red = 0xff, .green = 0x05, .blue = 0x07 }, .radius = 0, }; var last_duration: f64 = 0; var dir: f64 = 1; var delta: f64 = 0; var radius: f64 = 0; while (true) { const start = try std.time.Instant.now(); const canvas = buffer.canvas(); canvas.fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 }); box.render(&canvas); radius += delta * dir; if (radius > 100) { std.debug.print("HERE\n", .{}); radius = 100; dir = -1; } else if (radius < 0) { radius = 0; dir = 1; } box.radius = @intFromFloat(radius); const end = try std.time.Instant.now(); const duration: f64 = @floatFromInt(end.since(start)); const average = (duration + last_duration) / 2; last_duration = duration; std.debug.print("@FPS: {d:.3}\r", .{ std.time.ns_per_s / average }); delta = 60 * last_duration / std.time.ns_per_s; try crtc.page_flip(&buffer); while (true) { var event: ?drm.Event = null; while (event == null) { event = try card.poll_event(5000); } switch ((event orelse unreachable).kind) { .page_flip_complete => break, else => {}, } } } }