diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 21:54:14 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 21:54:14 +0100 |
| commit | 811a6bd572f4c6b26e99b4e746f5d710947ee934 (patch) | |
| tree | 3ff6375ce2d7ea13e0d49f7800757a1b42604884 /src/screen/drm/request | |
| parent | 3f4375a14218796cbd7bfff1c8cfff0f7bb1f6df (diff) | |
screen: drm change struct layout
Diffstat (limited to 'src/screen/drm/request')
| -rw-r--r-- | src/screen/drm/request/connector.zig | 24 | ||||
| -rw-r--r-- | src/screen/drm/request/crtc.zig | 29 | ||||
| -rw-r--r-- | src/screen/drm/request/encoder.zig | 9 | ||||
| -rw-r--r-- | src/screen/drm/request/frame-buffer.zig | 29 | ||||
| -rw-r--r-- | src/screen/drm/request/resources.zig | 15 | ||||
| -rw-r--r-- | src/screen/drm/request/root.zig | 55 |
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); + } +}; |