diff options
Diffstat (limited to 'src/screen/drm/crtc')
| -rw-r--r-- | src/screen/drm/crtc/root.zig | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/screen/drm/crtc/root.zig b/src/screen/drm/crtc/root.zig index 7601732..3c9d6f9 100644 --- a/src/screen/drm/crtc/root.zig +++ b/src/screen/drm/crtc/root.zig @@ -2,9 +2,11 @@ const std = @import("std"); const Card = @import("../card.zig").Card; const Drm = @import("../request.zig").Drm; const Connector = @import("../connector/root.zig").Connector; +const FrameBuffer = @import("../frame-buffer/root.zig").FrameBuffer; +const Mode = @import("../connector/mode.zig").Mode; pub const RawCrtc = extern struct { - connectors: ?*Connector, + connector_ids: ?*u32, count_connectors: u32, id: u32, buffer_id: u32, @@ -12,15 +14,19 @@ pub const RawCrtc = extern struct { y: u32, gamma_size: u32, mode_valid: u32, + mode: Mode, }; pub const Crtc = struct { const Self = @This(); + connector_ids: ?*u32, + count_connectors: u32, id: u32, buffer_id: u32, x: u32, y: u32, + mode: Mode, mode_valid: u32, gamma_size: u32, card: *Card, @@ -29,17 +35,57 @@ pub const Crtc = struct { var raw = std.mem.zeroInit(RawCrtc, .{ .id = id }); try Drm.get_crtc.request(card.file.handle, RawCrtc, &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 deinit(self: *Self) void { - _ = self; + pub fn attach(self: *Self, frame_buffer: *FrameBuffer, connector: *Connector, mode: Mode) !void { + self.connector_ids = &connector.id; + self.count_connectors = 1; + + var crtc = RawCrtc { + .id = self.id, + .x = self.x, + .y = self.y, + .buffer_id = frame_buffer.id, + .connector_ids = self.connector_ids, + .count_connectors = self.count_connectors, + .mode = mode, + .mode_valid = 1, + .gamma_size = self.gamma_size, + }; + + try Drm.set_crtc.request(self.card.file.handle, RawCrtc, &crtc); + + std.debug.print("crtc = {any}\n", .{self}); + } + + pub fn detach(self: *Self) void { + var crtc = RawCrtc { + .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, + }; + + Drm.set_crtc.request( + self.card.file.handle, + RawCrtc, + &crtc + ) catch |err| std.debug.panic("set crtc failed on detach: {}", .{err}); } }; |