From 811a6bd572f4c6b26e99b4e746f5d710947ee934 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 2 Feb 2025 21:54:14 +0100 Subject: screen: drm change struct layout --- src/screen/drm/request/connector.zig | 24 ++++++++++++++ src/screen/drm/request/crtc.zig | 29 +++++++++++++++++ src/screen/drm/request/encoder.zig | 9 ++++++ src/screen/drm/request/frame-buffer.zig | 29 +++++++++++++++++ src/screen/drm/request/resources.zig | 15 +++++++++ src/screen/drm/request/root.zig | 55 +++++++++++++++++++++++++++++++++ 6 files changed, 161 insertions(+) create mode 100644 src/screen/drm/request/connector.zig create mode 100644 src/screen/drm/request/crtc.zig create mode 100644 src/screen/drm/request/encoder.zig create mode 100644 src/screen/drm/request/frame-buffer.zig create mode 100644 src/screen/drm/request/resources.zig create mode 100644 src/screen/drm/request/root.zig (limited to 'src/screen/drm/request') 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); + } +}; -- cgit v1.2.3-70-g09d2