diff options
Diffstat (limited to 'src/screen/drm/crtc.zig')
| -rw-r--r-- | src/screen/drm/crtc.zig | 89 |
1 files changed, 89 insertions, 0 deletions
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}); + } +}; |