summaryrefslogtreecommitdiff
path: root/src/screen/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen/main.zig')
-rw-r--r--src/screen/main.zig62
1 files changed, 57 insertions, 5 deletions
diff --git a/src/screen/main.zig b/src/screen/main.zig
index b0e5b2e..1a33fd0 100644
--- a/src/screen/main.zig
+++ b/src/screen/main.zig
@@ -5,16 +5,68 @@ pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
- var card = try drm.Card.open("card1", allocator);
+ var card = try drm.Card.open("card0", allocator);
defer card.close();
var resources = try card.resources();
defer resources.deinit();
- std.debug.print("id: {}\n", .{resources.crtc_ids[0]});
+ var connector = try card.connector(resources.connector_ids[0]);
+ defer connector.deinit();
- var crtc = try card.crtc(resources.crtc_ids[0]);
- defer crtc.deinit();
+ std.debug.print("connector = {}\n", .{ connector.id });
- std.debug.print("crtc: {any}\n", .{crtc});
+ const mode = connector.modes[0];
+
+ 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();
+
+ for (resources.crtc_ids, 0..) |crtc_id, index| {
+ if ((encoder.possible_crtcs & (@as(u32, 1) << @intCast(index))) != 0) {
+ break :crtc card.crtc(crtc_id);
+ }
+ }
+ }
+
+ break :crtc error.CrtcNotFound;
+ };
+ defer crtc.detach();
+
+ std.debug.print("crtc = {}\n", .{ crtc.id });
+
+ var framebuffer = try card.create_frame_buffer(mode.horizontal.size, mode.vertical.size, 32);
+ defer framebuffer.deinit();
+
+ std.debug.print("framebuffer = {}, {}\n", .{ framebuffer.id, framebuffer.canvas_size });
+
+ try crtc.attach(&framebuffer, &connector, mode);
+
+ var frame: u24 = 0;
+
+ while (true) {
+ for (0..framebuffer.width) |x| {
+ for (0..framebuffer.height) |y| {
+ const raster_x = (frame + x) / 100 * 100;
+ const raster_y = y / 100 * 100;
+ const color = ((raster_x + raster_y) + 0x129453) * 0x329120;
+ framebuffer.set(@intCast(x), @intCast(y), .{
+ .red = @intCast(color & 0xff),
+ .green = @intCast((color >> 8) & 0xff),
+ .blue = @intCast((color >> 16) & 0xff),
+ });
+ }
+ }
+
+ frame, _ = @addWithOverflow(frame, 1);
+
+ try crtc.attach(&framebuffer, &connector, mode);
+
+ std.time.sleep(@intFromFloat(1000000000 / mode.frame_rate()));
+ }
+
+ while (true) { std.time.sleep(5000000000); }
}