summaryrefslogtreecommitdiff
path: root/src/screen/main.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-02-02 19:58:26 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-02-02 19:58:26 +0100
commit3f4375a14218796cbd7bfff1c8cfff0f7bb1f6df (patch)
tree1521b91b8f99af588156058b5f9aa12bb1626ac7 /src/screen/main.zig
parent8d062a90b1ffbe9e00334fa3e9e939406bd32141 (diff)
change .editorconfig
Diffstat (limited to 'src/screen/main.zig')
-rw-r--r--src/screen/main.zig169
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 => {},
+ }
+ }
+ }
}