summaryrefslogtreecommitdiff
path: root/src/screen/drm/crtc.zig
blob: 6130c86bf529a8c011acbf65545049c5465467b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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});
	}
};