diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 19:58:26 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 19:58:26 +0100 |
| commit | 3f4375a14218796cbd7bfff1c8cfff0f7bb1f6df (patch) | |
| tree | 1521b91b8f99af588156058b5f9aa12bb1626ac7 /src/screen/main.zig | |
| parent | 8d062a90b1ffbe9e00334fa3e9e939406bd32141 (diff) | |
change .editorconfig
Diffstat (limited to 'src/screen/main.zig')
| -rw-r--r-- | src/screen/main.zig | 169 |
1 files changed, 79 insertions, 90 deletions
diff --git a/src/screen/main.zig b/src/screen/main.zig index f11f628..03ef75a 100644 --- a/src/screen/main.zig +++ b/src/screen/main.zig @@ -3,118 +3,107 @@ const drm = @import("drm/card.zig"); const Event = @import("drm/event.zig").Event; pub fn main() !void { - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - const allocator = gpa.allocator(); + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); - var card = try drm.Card.open("card0", allocator); - defer card.close(); + var card = try drm.Card.open("card1", allocator); + defer card.close(); - var resources = try card.resources(); - defer resources.deinit(); + var resources = try card.resources(); + defer resources.deinit(); - var connector = try card.connector(resources.connector_ids[0]); - defer connector.deinit(); + var connector = try card.connector(resources.connector_ids[1]); + defer connector.deinit(); - std.debug.print("connector = {}\n", .{ connector.id }); + std.debug.print("connector = {}\n", .{ connector.id }); - const mode = connector.modes[0]; + const mode = connector.modes[0]; - std.debug.print("mode = {s}@{d}Hz\n", .{ mode.name, mode.frame_rate() }); + std.debug.print("mode = {s}@{d}Hz\n", .{ mode.name, mode.frame_rate() }); - var crtc = try crtc: { - for (connector.encoder_ids) |encoder_id| { - var encoder = try card.encoder(encoder_id); - defer encoder.deinit(); + var crtc = try card.crtc(resources.crtc_ids[ + connector.compatible_crtc() orelse @panic("no crtc found") + ]); + defer crtc.detach(); - for (resources.crtc_ids, 0..) |crtc_id, index| { - if ((encoder.possible_crtcs & (@as(u32, 1) << @intCast(index))) != 0) { - break :crtc card.crtc(crtc_id); - } - } - } + std.debug.print("crtc = {}\n", .{ crtc.id }); - break :crtc error.CrtcNotFound; - }; - defer crtc.detach(); + var double_buffer = try card.create_double_buffer(mode.horizontal.size, mode.vertical.size, 32); + defer double_buffer.deinit(); - std.debug.print("crtc = {}\n", .{ crtc.id }); + std.debug.print("buffer = {}, {}x{}, stride = {}\n", .{ + double_buffer.buffer().id, + double_buffer.buffer().width, + double_buffer.buffer().height, + double_buffer.buffer().stride, + }); - var double_buffer = try card.create_double_buffer(mode.horizontal.size, mode.vertical.size, 32); - defer double_buffer.deinit(); + try crtc.attach(double_buffer.crtc_buffer(), &connector, mode); - std.debug.print("buffer = {}, {}x{}, stride = {}\n", .{ - double_buffer.buffer().id, - double_buffer.buffer().width, - double_buffer.buffer().height, - double_buffer.buffer().stride, - }); + const Pos = struct { x: f32, y: f32 }; - try crtc.attach(double_buffer.crtc_buffer(), &connector, mode); + var vec = Pos { .x = 10, .y = 10 }; + var pos = Pos { .x = 0, .y = 0 }; + var delta: f32 = 0; + const size = 100; - const Pos = struct { x: f32, y: f32 }; + const width: f32 = @floatFromInt(double_buffer.buffer().width); + const height: f32 = @floatFromInt(double_buffer.buffer().height); - var vec = Pos { .x = 10, .y = 10 }; - var pos = Pos { .x = 0, .y = 0 }; - var delta: f32 = 0; - const size = 100; + while (true) { + const start = try std.time.Instant.now(); - const width: f32 = @floatFromInt(double_buffer.buffer().width); - const height: f32 = @floatFromInt(double_buffer.buffer().height); + double_buffer.buffer().fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 }); - while (true) { - const start = try std.time.Instant.now(); + pos.x += vec.x * delta; + pos.y += vec.y * delta; - double_buffer.buffer().fill(.{ .red = 0, .green = 0, .blue = 0 }); + 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; + } - pos.x += vec.x * delta; - pos.y += vec.y * delta; + 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; + } - 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; - } + for (0..size) |w| { + for (0..size) |h| { + double_buffer.buffer().set( + @as(u32, @intFromFloat(pos.x)) + @as(u32, @intCast(w)), + @as(u32, @intFromFloat(pos.y)) + @as(u32, @intCast(h)), + .{ + .red = 0xff, + .green = 0, + .blue = 0, + }); + } + } - 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; - } + const end = try std.time.Instant.now(); + const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s); + std.debug.print("FPS: {d:.2}\r", .{ 1 / elapsed }); + delta = elapsed * 60; - for (0..size) |w| { - for (0..size) |h| { - double_buffer.buffer().set( - @as(u32, @intFromFloat(pos.x)) + @as(u32, @intCast(w)), - @as(u32, @intFromFloat(pos.y)) + @as(u32, @intCast(h)), - .{ - .red = 0xff, - .green = 0, - .blue = 0, - }); - } - } + try crtc.page_flip(&double_buffer); - const end = try std.time.Instant.now(); - const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s); - std.debug.print("FPS: {d:.2}\r", .{ 1 / elapsed }); - delta = elapsed * 60; + while (true) { + var event: ?Event = null; + while (event == null) { + event = try card.poll_event(5000); + } - try crtc.page_flip(&double_buffer); - - while (true) { - var event: ?Event = null; - while (event == null) { - event = try card.poll_event(5000); - } - - switch ((event orelse unreachable).type) { - .page_flip_complete => break, - else => {}, - } - } - } + switch ((event orelse unreachable).type) { + .page_flip_complete => break, + else => {}, + } + } + } } |