const std = @import("std"); const drm = @import("drm/root.zig"); 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 card.connector(resources.connector_ids[0]); defer connector.deinit(); const mode = connector.modes[0]; var crtc = try card.crtc(resources.crtc_ids[ 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 Pos = struct { x: f32, y: f32 }; var vec = Pos { .x = 10, .y = 10 }; var pos = Pos { .x = 0, .y = 0 }; var delta: f32 = 0; const size = 100; const width: f32 = @floatFromInt(buffer.current.width); const height: f32 = @floatFromInt(buffer.current.height); while (true) { const start = try std.time.Instant.now(); @memset( buffer.current.pixels, .{ .red = 0x25, .green = 0x25, .blue = 0x25 } ); pos.x += vec.x * delta; pos.y += vec.y * delta; if (pos.x < 0) { pos.x = -pos.x; vec.x = -vec.x; } else if (pos.x + size >= width) { pos.x = width - size; vec.x = -vec.x; } if (pos.y < 0) { pos.y = -pos.y; vec.y = -vec.y; } else if (pos.y + size >= height) { pos.y = height - size; vec.y = -vec.y; } for (0..size) |w| { for (0..size) |h| { const x = @as(usize, @intFromFloat(pos.x)) + w; const y = @as(usize, @intFromFloat(pos.y)) + h; buffer.current.pixels[x + buffer.current.width * y] = .{ .red = 0xff, .green = 0, .blue = 0, }; } } const end = try std.time.Instant.now(); const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s); delta = elapsed * 60; 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 => {}, } } } }