summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-02-01 13:06:31 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-02-01 13:06:31 +0100
commit740281072f9e53e5ce62590a352f35d8cc02770a (patch)
tree903dd76feed6e640872a83bfeaeb6239c0870b6f /src
parent85bcada8cf78bdf2bfb3be583289686026e0f25e (diff)
reorganize drm connector
Diffstat (limited to 'src')
-rw-r--r--src/screen/drm/card.zig2
-rw-r--r--src/screen/drm/connector/connection.zig6
-rw-r--r--src/screen/drm/connector/mode.zig59
-rw-r--r--src/screen/drm/connector/root.zig (renamed from src/screen/drm/connector.zig)79
-rw-r--r--src/screen/main.zig2
5 files changed, 76 insertions, 72 deletions
diff --git a/src/screen/drm/card.zig b/src/screen/drm/card.zig
index 67f81f3..9ad34fb 100644
--- a/src/screen/drm/card.zig
+++ b/src/screen/drm/card.zig
@@ -4,7 +4,7 @@ const os = std.os.linux;
const cerror = @import("../cerror.zig");
const Resources = @import("resources.zig").Resources;
-const Connector = @import("connector.zig").Connector;
+const Connector = @import("connector/root.zig").Connector;
pub const Card = struct {
diff --git a/src/screen/drm/connector/connection.zig b/src/screen/drm/connector/connection.zig
new file mode 100644
index 0000000..9c4a8d8
--- /dev/null
+++ b/src/screen/drm/connector/connection.zig
@@ -0,0 +1,6 @@
+pub const Connection = enum(u32) {
+ undefined_state = 0,
+ connected = 1,
+ disconnected = 2,
+ unknown = 3,
+};
diff --git a/src/screen/drm/connector/mode.zig b/src/screen/drm/connector/mode.zig
new file mode 100644
index 0000000..9f4dfc4
--- /dev/null
+++ b/src/screen/drm/connector/mode.zig
@@ -0,0 +1,59 @@
+pub const Mode = extern struct {
+ const Self = @This();
+
+ const DimensionInfo = extern struct {
+ const Sync = extern struct { start: u16, end: u16 };
+
+ size: u16,
+ sync: Sync,
+ total: u16,
+ };
+
+ const Flags = packed struct(u32) {
+ phsync: bool,
+ nhsync: bool,
+ pvsync: bool,
+ nvsync: bool,
+ interlace: bool,
+ dblscan: bool,
+ csync: bool,
+ pcsync: bool,
+ ncsync: bool,
+ hskew: bool,
+ bcast: bool,
+ pixmux: bool,
+ dblclk: bool,
+ clkdiv2: bool,
+ _padding: u18,
+ };
+
+ clock: u32,
+ horizontal: DimensionInfo,
+ skew: u16,
+ vertical: DimensionInfo,
+ line_scans: u16,
+ vertical_refresh: u32,
+
+ flags: Flags,
+ type: u32,
+ name: [32]u8,
+
+ pub fn frame_rate(self: *const Self) f32 {
+ var rate = (@as(u64, @intCast(self.clock)) * 1000000 / self.horizontal.total + self.vertical.total / 2) / self.vertical.total;
+
+ if (self.flags.interlace) {
+ rate *= 2;
+ }
+
+ if (self.flags.dblscan) {
+ rate /= 2;
+ }
+
+ if (self.line_scans > 1) {
+ rate /= self.line_scans;
+ }
+
+ return @as(f32, @floatFromInt(rate)) / 1000.0;
+ }
+};
+
diff --git a/src/screen/drm/connector.zig b/src/screen/drm/connector/root.zig
index 9d7f9ad..8883d29 100644
--- a/src/screen/drm/connector.zig
+++ b/src/screen/drm/connector/root.zig
@@ -1,11 +1,14 @@
const std = @import("std");
const os = std.os.linux;
-const Drm = @import("request.zig").Drm;
-const Card = @import("card.zig").Card;
+const Drm = @import("../request.zig").Drm;
+const Card = @import("../card.zig").Card;
+
+pub const Connection = @import("connection.zig").Connection;
+pub const Mode = @import("mode.zig").Mode;
const RawConnector = extern struct {
encoder_ids: ?*u32,
- modes: ?*ModeInfo,
+ modes: ?*Mode,
prop_ids: ?*u32,
prop_value_ids: ?*u64,
count_modes: u32,
@@ -22,77 +25,13 @@ const RawConnector = extern struct {
pad: u32,
};
-const Connection = enum(u32) {
- undefined_state = 0,
- connected = 1,
- disconnected = 2,
- unknown = 3,
-};
-
-const ModeInfo = extern struct {
- const Self = @This();
- const Flags = packed struct(u32) {
- phsync: bool,
- nhsync: bool,
- pvsync: bool,
- nvsync: bool,
- interlace: bool,
- dblscan: bool,
- csync: bool,
- pcsync: bool,
- ncsync: bool,
- hskew: bool,
- bcast: bool,
- pixmux: bool,
- dblclk: bool,
- clkdiv2: bool,
- _padding: u18,
- };
-
- clock: u32,
- hdisplay: u16,
- hsync_start: u16,
- hsync_end: u16,
- htotal: u16,
- hskew: u16,
- vdisplay: u16,
- vsync_start: u16,
- vsync_end: u16,
- vtotal: u16,
- vscan: u16,
-
- vrefresh: u32,
-
- flags: Flags,
- type: u32,
- name: [32]u8,
-
- pub fn frame_rate(self: *const Self) f32 {
- var rate = (@as(u64, @intCast(self.clock)) * 1000000 / self.htotal + self.vtotal / 2) / self.vtotal;
-
- if (self.flags.interlace) {
- rate *= 2;
- }
-
- if (self.flags.dblscan) {
- rate /= 2;
- }
-
- if (self.vscan > 1) {
- rate /= self.vscan;
- }
-
- return @as(f32, @floatFromInt(rate)) / 1000.0;
- }
-};
-
pub const Connector = struct {
const Self = @This();
card: *Card,
encoder_ids: []u32,
- modes: []ModeInfo,
+ modes: []Mode,
prop_ids: []u32,
prop_value_ids: []u64,
encoder_id: u32,
@@ -118,7 +57,7 @@ pub const Connector = struct {
var raw = try Self.raw_without_ids(card, id);
const resources = .{
.encoder_ids = try card.allocator.alloc(u32, raw.count_encoders),
- .modes = try card.allocator.alloc(ModeInfo, raw.count_modes),
+ .modes = try card.allocator.alloc(Mode, raw.count_modes),
.prop_ids = try card.allocator.alloc(u32, raw.count_props),
.prop_value_ids = try card.allocator.alloc(u64, raw.count_props),
.encoder_id = raw.encoder_id,
@@ -134,7 +73,7 @@ pub const Connector = struct {
};
@memset(resources.encoder_ids, 0);
- @memset(resources.modes, std.mem.zeroes(ModeInfo));
+ @memset(resources.modes, std.mem.zeroes(Mode));
@memset(resources.prop_ids, 0);
@memset(resources.prop_value_ids, 0);
diff --git a/src/screen/main.zig b/src/screen/main.zig
index c23e7c5..6dacf4b 100644
--- a/src/screen/main.zig
+++ b/src/screen/main.zig
@@ -15,6 +15,6 @@ pub fn main() !void {
defer connector.deinit();
for (connector.modes) |mode| {
- std.debug.print("{d}x{d}@{d}\n", .{mode.hdisplay, mode.vdisplay, mode.frame_rate()});
+ std.debug.print("{d}x{d}@{d}\n", .{mode.horizontal.size, mode.vertical.size, mode.frame_rate()});
}
}