From 811a6bd572f4c6b26e99b4e746f5d710947ee934 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 2 Feb 2025 21:54:14 +0100 Subject: screen: drm change struct layout --- src/screen/drm/crtc.zig | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/screen/drm/crtc.zig (limited to 'src/screen/drm/crtc.zig') diff --git a/src/screen/drm/crtc.zig b/src/screen/drm/crtc.zig new file mode 100644 index 0000000..6130c86 --- /dev/null +++ b/src/screen/drm/crtc.zig @@ -0,0 +1,89 @@ +const std = @import("std"); +const drm = @import("root.zig"); + +pub const Crtc = struct { + const Self = @This(); + + connector_ids: ?*u32, + count_connectors: u32, + id: u32, + buffer_id: u32, + x: u32, + y: u32, + mode: drm.Connector.Mode, + mode_valid: u32, + gamma_size: u32, + card: *drm.Card, + + pub fn init(card: *drm.Card, id: u32) !Self { + var raw = std.mem.zeroInit(drm.request.Crtc, .{ .id = id }); + try card.request(.get_crtc, &raw); + return .{ + .connector_ids = raw.connector_ids, + .count_connectors = raw.count_connectors, + .id = raw.id, + .buffer_id = raw.buffer_id, + .x = raw.x, + .y = raw.y, + .mode = raw.mode, + .mode_valid = raw.mode_valid, + .gamma_size = raw.gamma_size, + .card = card, + }; + } + + pub fn attach( + self: *Self, + buffer: *drm.Buffer, + connector: *drm.Connector, + mode: drm.Connector.Mode + ) !void { + self.connector_ids = &connector.id; + self.count_connectors = 1; + + var crtc = drm.request.Crtc { + .id = self.id, + .x = self.x, + .y = self.y, + .buffer_id = buffer.crtc.id, + .connector_ids = self.connector_ids, + .count_connectors = self.count_connectors, + .mode = mode, + .mode_valid = 1, + .gamma_size = self.gamma_size, + }; + + try self.card.request(.set_crtc, &crtc); + } + + pub fn page_flip(self: *Self, buffer: *drm.Buffer) !void { + buffer.swap(); + + var flip = std.mem.zeroInit(drm.request.PageFlip, .{ + .buffer_id = buffer.crtc.id, + .crtc_id = self.id, + .flags = std.mem.zeroInit(drm.request.PageFlip.Event, .{ .event = true }), + }); + + try self.card.request(.page_flip, &flip); + } + + pub fn detach(self: *Self) void { + var crtc = drm.request.Crtc { + .id = self.id, + .x = self.x, + .y = self.y, + .buffer_id = self.buffer_id, + .connector_ids = self.connector_ids, + .count_connectors = self.count_connectors, + .mode = self.mode, + .mode_valid = self.mode_valid, + .gamma_size = self.gamma_size, + }; + + self.card.request( + .set_crtc, + &crtc + ) catch |err| std.debug.panic("set crtc failed on detach: {}", .{err}); + } +}; -- cgit v1.2.3-70-g09d2