const std = @import("std"); const drm = @import("root.zig"); pub const Crtc = struct { const Self = @This(); card: drm.Card, 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, 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}); } };