summaryrefslogtreecommitdiff
path: root/src/screen/drm/crtc.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen/drm/crtc.zig')
-rw-r--r--src/screen/drm/crtc.zig89
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});
+ }
+};