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