summaryrefslogtreecommitdiff
path: root/src/screen/drm/request
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen/drm/request')
-rw-r--r--src/screen/drm/request/connector.zig24
-rw-r--r--src/screen/drm/request/crtc.zig29
-rw-r--r--src/screen/drm/request/encoder.zig9
-rw-r--r--src/screen/drm/request/frame-buffer.zig29
-rw-r--r--src/screen/drm/request/resources.zig15
-rw-r--r--src/screen/drm/request/root.zig55
6 files changed, 161 insertions, 0 deletions
diff --git a/src/screen/drm/request/connector.zig b/src/screen/drm/request/connector.zig
new file mode 100644
index 0000000..7f0b788
--- /dev/null
+++ b/src/screen/drm/request/connector.zig
@@ -0,0 +1,24 @@
+const drm = @import("../root.zig");
+const Mode = drm.Connector.Mode;
+const Kind = drm.Connector.Kind;
+const Status = drm.Connector.Status;
+
+pub const Connector = extern struct {
+ encoder_ids: ?*u32,
+ modes: ?*Mode,
+ prop_ids: ?*u32,
+ prop_value_ids: ?*u64,
+ count_modes: u32,
+ count_props: u32,
+ count_encoders: u32,
+ encoder_id: u32,
+ id: u32,
+ type: Kind,
+ type_id: u32,
+ connection: Status,
+ mm_width: u32,
+ mm_height: u32,
+ subpixel: u32,
+ pad: u32,
+};
+
diff --git a/src/screen/drm/request/crtc.zig b/src/screen/drm/request/crtc.zig
new file mode 100644
index 0000000..f52a9ff
--- /dev/null
+++ b/src/screen/drm/request/crtc.zig
@@ -0,0 +1,29 @@
+const Mode = @import("../connector/mode.zig").Mode;
+
+pub const Crtc = extern struct {
+ connector_ids: ?*u32,
+ count_connectors: u32,
+ id: u32,
+ buffer_id: u32,
+ x: u32,
+ y: u32,
+ gamma_size: u32,
+ mode_valid: u32,
+ mode: Mode,
+};
+
+pub const PageFlip = extern struct {
+ pub const Event = packed struct(u32) {
+ event: bool,
+ is_async: bool,
+ absolute: bool,
+ relative: bool,
+ __padding: u28,
+ };
+
+ crtc_id: u32,
+ buffer_id: u32,
+ flags: Event,
+ __reserved: u32,
+ user_data: u64,
+};
diff --git a/src/screen/drm/request/encoder.zig b/src/screen/drm/request/encoder.zig
new file mode 100644
index 0000000..3cf7985
--- /dev/null
+++ b/src/screen/drm/request/encoder.zig
@@ -0,0 +1,9 @@
+const drm = @import("../root.zig");
+
+pub const Encoder = extern struct {
+ id: u32,
+ type: drm.Encoder.Kind,
+ crtc_id: u32,
+ possible_crtcs: u32,
+ possible_clones: u32,
+};
diff --git a/src/screen/drm/request/frame-buffer.zig b/src/screen/drm/request/frame-buffer.zig
new file mode 100644
index 0000000..8f93862
--- /dev/null
+++ b/src/screen/drm/request/frame-buffer.zig
@@ -0,0 +1,29 @@
+const drm = @import("../root.zig");
+
+pub const CreateDumb = extern struct {
+ height: u32,
+ width: u32,
+ bpp: u32,
+ flags: u32,
+ handle: u32,
+ pitch: u32,
+ size: u32,
+};
+
+pub const FrameBufferCmd2 = extern struct {
+ id: u32,
+ width: u32,
+ height: u32,
+ pixel_format: drm.Pixel.Format,
+ flags: u32,
+ handles: [4]u32,
+ pitches: [4]u32,
+ offsets: [4]u32,
+ modifier: [4]u32,
+};
+
+pub const MapDumb = extern struct {
+ handle: u32,
+ __padding: u32,
+ offset: i64,
+};
diff --git a/src/screen/drm/request/resources.zig b/src/screen/drm/request/resources.zig
new file mode 100644
index 0000000..bc3ce3c
--- /dev/null
+++ b/src/screen/drm/request/resources.zig
@@ -0,0 +1,15 @@
+pub const Resources = extern struct {
+ fb_ids: ?*u32,
+ crtc_ids: ?*u32,
+ connector_ids: ?*u32,
+ encoder_ids: ?*u32,
+ count_fbs: u32,
+ count_crtcs: u32,
+ count_connectors: u32,
+ count_encoders: u32,
+ min_width: u32,
+ max_width: u32,
+ min_height: u32,
+ max_height: u32,
+};
+
diff --git a/src/screen/drm/request/root.zig b/src/screen/drm/request/root.zig
new file mode 100644
index 0000000..7576893
--- /dev/null
+++ b/src/screen/drm/request/root.zig
@@ -0,0 +1,55 @@
+const std = @import("std");
+const os = std.os.linux;
+const cerror = @import("../../cerror.zig");
+
+pub const Resources = @import("resources.zig").Resources;
+pub const Encoder = @import("encoder.zig").Encoder;
+pub const Connector = @import("connector.zig").Connector;
+
+const crtc = @import("crtc.zig");
+pub const Crtc = crtc.Crtc;
+pub const PageFlip = crtc.PageFlip;
+
+const frame_buffer = @import("frame-buffer.zig");
+pub const CreateDumb = frame_buffer.CreateDumb;
+pub const FrameBufferCmd2 = frame_buffer.FrameBufferCmd2;
+pub const MapDumb = frame_buffer.MapDumb;
+
+
+pub const Kind = enum(u8) {
+ const Self = @This();
+
+ get_resources = 0xa0,
+ get_crtc = 0xa1,
+ set_crtc = 0xa2,
+ get_encoder = 0xa6,
+ get_connector = 0xa7,
+ remove_frame_buffer = 0xaf,
+ page_flip = 0xb0,
+ create_dumb = 0xb2,
+ map_dumb = 0xb3,
+ destroy_dumb = 0xb4,
+ add_frame_buffer2 = 0xb8,
+
+ pub fn payload(comptime self: *const Self) type {
+ return comptime switch (self.*) {
+ .get_resources => Resources,
+ .get_crtc => Crtc,
+ .set_crtc => Crtc,
+ .get_encoder => Encoder,
+ .get_connector => Connector,
+ .remove_frame_buffer => u32,
+ .page_flip => PageFlip,
+ .create_dumb => CreateDumb,
+ .map_dumb => MapDumb,
+ .destroy_dumb => u32,
+ .add_frame_buffer2 => FrameBufferCmd2,
+ };
+ }
+
+ pub fn id(comptime self: *const Self, comptime pointer_type: type) u32 {
+ const payload_type = self.payload();
+ comptime std.debug.assert(*payload_type == pointer_type);
+ return comptime os.IOCTL.IOWR('d', @intFromEnum(self.*), payload_type);
+ }
+};