From 3f4375a14218796cbd7bfff1c8cfff0f7bb1f6df Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 2 Feb 2025 19:58:26 +0100 Subject: change .editorconfig --- src/screen/drm/card.zig | 130 +++++------ src/screen/drm/connector/connection.zig | 8 +- src/screen/drm/connector/mode.zig | 112 +++++----- src/screen/drm/connector/root.zig | 161 +++++++------- src/screen/drm/connector/type.zig | 42 ++-- src/screen/drm/crtc/root.zig | 178 +++++++-------- src/screen/drm/encoder/root.zig | 50 ++--- src/screen/drm/encoder/type.zig | 18 +- src/screen/drm/event.zig | 32 +-- src/screen/drm/frame-buffer/page-flip.zig | 11 +- src/screen/drm/frame-buffer/pixelformat.zig | 10 +- src/screen/drm/frame-buffer/root.zig | 328 ++++++++++++++-------------- src/screen/drm/request.zig | 36 +-- src/screen/drm/resources.zig | 114 +++++----- 14 files changed, 622 insertions(+), 608 deletions(-) (limited to 'src/screen/drm') diff --git a/src/screen/drm/card.zig b/src/screen/drm/card.zig index 6147cf2..f1674bb 100644 --- a/src/screen/drm/card.zig +++ b/src/screen/drm/card.zig @@ -12,69 +12,69 @@ const Event = @import("event.zig").Event; pub const Card = struct { - const Self = @This(); - - file: std.fs.File, - allocator: std.mem.Allocator, - - pub fn open(name: []const u8, allocator: std.mem.Allocator) !Self { - var dri_dir = try std.fs.openDirAbsolute("/dev/dri", .{}); - defer dri_dir.close(); - - return .{ - .file = try dri_dir.openFile(name, .{ - .mode = .read_write, - .lock_nonblocking = true, - }), - - .allocator = allocator, - }; - } - - pub fn close(self: *Card) void { - self.file.close(); - } - - pub fn is_kms(self: *Card) !bool { - const raw_info = Resources.raw_without_ids(self); - return raw_info.count_crtcs > 0 and raw_info.count_connectors > 0 and raw_info.count_encoders > 0; - } - - pub fn resources(self: *Card) !Resources { - return Resources.init(self); - } - - pub fn connector(self: *Card, id: u32) !Connector { - return Connector.init(self, id); - } - - pub fn encoder(self: *Card, id: u32) !Encoder { - return Encoder.init(self, id); - } - - pub fn crtc(self: *Card, id: u32) !Crtc { - return Crtc.init(self, id); - } - - pub fn create_double_buffer(self: *Card, width: u32, height: u32, bpp: u32) !DoubleBuffer { - return DoubleBuffer.init(self, width, height, bpp); - } - - pub fn poll_event(self: *Card, timeout: i32) !?Event { - var pollfd = os.pollfd { - .fd = self.file.handle, - .events = os.POLL.IN, - .revents = 0 - }; - - try cerror.from_usize(os.poll(@ptrCast(&pollfd), 1, timeout)); - - if ((pollfd.revents & os.POLL.IN) != 0) { - var event = std.mem.zeroes(Event); - try cerror.from_usize(os.read(self.file.handle, @ptrCast(&event), @sizeOf(Event))); - return event; - } - - return null; - } + const Self = @This(); + + file: std.fs.File, + allocator: std.mem.Allocator, + + pub fn open(name: []const u8, allocator: std.mem.Allocator) !Self { + var dri_dir = try std.fs.openDirAbsolute("/dev/dri", .{}); + defer dri_dir.close(); + + return .{ + .file = try dri_dir.openFile(name, .{ + .mode = .read_write, + .lock_nonblocking = true, + }), + + .allocator = allocator, + }; + } + + pub fn close(self: *Card) void { + self.file.close(); + } + + pub fn is_kms(self: *Card) !bool { + const raw_info = Resources.raw_without_ids(self); + return raw_info.count_crtcs > 0 and raw_info.count_connectors > 0 and raw_info.count_encoders > 0; + } + + pub fn resources(self: *Card) !Resources { + return Resources.init(self); + } + + pub fn connector(self: *Card, id: u32) !Connector { + return Connector.init(self, id); + } + + pub fn encoder(self: *Card, id: u32) !Encoder { + return Encoder.init(self, id); + } + + pub fn crtc(self: *Card, id: u32) !Crtc { + return Crtc.init(self, id); + } + + pub fn create_double_buffer(self: *Card, width: u32, height: u32, bpp: u32) !DoubleBuffer { + return DoubleBuffer.init(self, width, height, bpp); + } + + pub fn poll_event(self: *Card, timeout: i32) !?Event { + var pollfd = os.pollfd { + .fd = self.file.handle, + .events = os.POLL.IN, + .revents = 0 + }; + + try cerror.from_usize(os.poll(@ptrCast(&pollfd), 1, timeout)); + + if ((pollfd.revents & os.POLL.IN) != 0) { + var event = std.mem.zeroes(Event); + try cerror.from_usize(os.read(self.file.handle, @ptrCast(&event), @sizeOf(Event))); + return event; + } + + return null; + } }; diff --git a/src/screen/drm/connector/connection.zig b/src/screen/drm/connector/connection.zig index 9c4a8d8..7377800 100644 --- a/src/screen/drm/connector/connection.zig +++ b/src/screen/drm/connector/connection.zig @@ -1,6 +1,6 @@ pub const Connection = enum(u32) { - undefined_state = 0, - connected = 1, - disconnected = 2, - unknown = 3, + 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 index fb61b5b..1e28a23 100644 --- a/src/screen/drm/connector/mode.zig +++ b/src/screen/drm/connector/mode.zig @@ -1,70 +1,70 @@ pub const Mode = extern struct { - const Self = @This(); + const Self = @This(); - const DimensionInfo = extern struct { - const Sync = extern struct { start: u16, end: u16 }; + const DimensionInfo = extern struct { + const Sync = extern struct { start: u16, end: u16 }; - size: u16, - sync: Sync, - total: u16, - }; + size: u16, + sync: Sync, + total: u16, +}; - const Type = packed struct(u32) { - builtin: bool, - clock_c: bool, - crtc_c: bool, - preferred: bool, - default: bool, - userdef: bool, - driver: bool, - _padding: u25, - }; +const Type = packed struct(u32) { + builtin: bool, + clock_c: bool, + crtc_c: bool, + preferred: bool, + default: bool, + userdef: bool, + driver: bool, + _padding: u25, +}; - 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, - }; +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, +clock: u32, + horizontal: DimensionInfo, + skew: u16, + vertical: DimensionInfo, + line_scans: u16, + vertical_refresh: u32, - flags: Flags, - type: Type, - name: [32]u8, + flags: Flags, + type: Type, + 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; + 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.interlace) { + rate *= 2; + } - if (self.flags.dblscan) { - rate /= 2; - } + if (self.flags.dblscan) { + rate /= 2; + } - if (self.line_scans > 1) { - rate /= self.line_scans; - } + if (self.line_scans > 1) { + rate /= self.line_scans; + } - return @as(f32, @floatFromInt(rate)) / 1000.0; - } + return @as(f32, @floatFromInt(rate)) / 1000.0; + } }; diff --git a/src/screen/drm/connector/root.zig b/src/screen/drm/connector/root.zig index c104e84..6141899 100644 --- a/src/screen/drm/connector/root.zig +++ b/src/screen/drm/connector/root.zig @@ -9,89 +9,104 @@ pub const Mode = @import("mode.zig").Mode; pub const ConnectorType = @import("type.zig").Type; const RawConnector = 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: ConnectorType, - type_id: u32, - connection: Connection, - mm_width: u32, - mm_height: u32, - subpixel: u32, - pad: u32, + 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: ConnectorType, + type_id: u32, + connection: Connection, + mm_width: u32, + mm_height: u32, + subpixel: u32, + pad: u32, }; pub const Connector = struct { - const Self = @This(); + const Self = @This(); - card: *Card, + card: *Card, - encoder_ids: []u32, - modes: []Mode, - prop_ids: []u32, - prop_value_ids: []u64, - encoder_id: u32, - id: u32, - type: ConnectorType, - type_id: u32, - connection: Connection, - mm_width: u32, - mm_height: u32, - subpixel: u32, - pad: u32, + encoder_ids: []u32, + modes: []Mode, + prop_ids: []u32, + prop_value_ids: []u64, + encoder_id: u32, + id: u32, + type: ConnectorType, + type_id: u32, + connection: Connection, + mm_width: u32, + mm_height: u32, + subpixel: u32, + pad: u32, - pub fn raw_without_ids(card: *Card, id: u32) !RawConnector { - var result = std.mem.zeroInit(RawConnector, .{ .id = id }); - try Drm.get_connector.request(card.file.handle, RawConnector, &result); - return result; - } + pub fn raw_without_ids(card: *Card, id: u32) !RawConnector { + var result = std.mem.zeroInit(RawConnector, .{ .id = id }); + try Drm.get_connector.request(card.file.handle, RawConnector, &result); + return result; + } - // NOTE: This function does not take in account - // that there might be some hot-plugging going - // on. This might have to change in the future. - pub fn init(card: *Card, id: u32) !Self { - 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(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, - .id = raw.id, - .type = raw.type, - .type_id = raw.type_id, - .connection = raw.connection, - .mm_width = raw.mm_width, - .mm_height = raw.mm_height, - .subpixel = raw.subpixel, - .pad = raw.pad, - .card = card, - }; + // NOTE: This function does not take in account + // that there might be some hot-plugging going + // on. This might have to change in the future. + pub fn init(card: *Card, id: u32) !Self { + 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(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, + .id = raw.id, + .type = raw.type, + .type_id = raw.type_id, + .connection = raw.connection, + .mm_width = raw.mm_width, + .mm_height = raw.mm_height, + .subpixel = raw.subpixel, + .pad = raw.pad, + .card = card, + }; - @memset(resources.encoder_ids, 0); - @memset(resources.modes, std.mem.zeroes(Mode)); - @memset(resources.prop_ids, 0); - @memset(resources.prop_value_ids, 0); + @memset(resources.encoder_ids, 0); + @memset(resources.modes, std.mem.zeroes(Mode)); + @memset(resources.prop_ids, 0); + @memset(resources.prop_value_ids, 0); - raw.encoder_ids = @ptrCast(resources.encoder_ids); - raw.modes = @ptrCast(resources.modes); - raw.prop_ids = @ptrCast(resources.prop_ids); - raw.prop_value_ids = @ptrCast(resources.prop_value_ids); + raw.encoder_ids = @ptrCast(resources.encoder_ids); + raw.modes = @ptrCast(resources.modes); + raw.prop_ids = @ptrCast(resources.prop_ids); + raw.prop_value_ids = @ptrCast(resources.prop_value_ids); - try Drm.get_connector.request(card.file.handle, RawConnector, &raw); + try Drm.get_connector.request(card.file.handle, RawConnector, &raw); - return resources; - } + return resources; + } - pub fn deinit(self: *Self) void { - self.card.allocator.free(self.encoder_ids); - self.card.allocator.free(self.modes); - self.card.allocator.free(self.prop_ids); - } + pub fn deinit(self: *Self) void { + self.card.allocator.free(self.encoder_ids); + self.card.allocator.free(self.modes); + self.card.allocator.free(self.prop_ids); + } + + pub fn compatible_crtc(self: *Self) ?usize { + for (self.encoder_ids) |encoder_id| { + var encoder = self.card.encoder(encoder_id) catch continue; + defer encoder.deinit(); + + for (0..32) |index| { + if ((encoder.possible_crtcs & (@as(u32, 1) << @intCast(index))) != 0) { + return index; + } + } + } + + return null; + } }; diff --git a/src/screen/drm/connector/type.zig b/src/screen/drm/connector/type.zig index 15db753..c813c66 100644 --- a/src/screen/drm/connector/type.zig +++ b/src/screen/drm/connector/type.zig @@ -1,23 +1,23 @@ pub const Type = enum(u32) { - unknown = 0, - vga = 1, - dvi_i = 2, - dvi_d = 3, - dvi_a = 4, - composite = 5, - s_video = 6, - lvds = 7, - component = 8, - nine_pin_din = 9, - display_port = 10, - hdmi_a = 11, - hdmi_b = 12, - tv = 13, - edp = 14, - virtual = 15, - dsi = 16, - dpi = 17, - writeback = 18, - spi = 19, - usb = 20, + unknown = 0, + vga = 1, + dvi_i = 2, + dvi_d = 3, + dvi_a = 4, + composite = 5, + s_video = 6, + lvds = 7, + component = 8, + nine_pin_din = 9, + display_port = 10, + hdmi_a = 11, + hdmi_b = 12, + tv = 13, + edp = 14, + virtual = 15, + dsi = 16, + dpi = 17, + writeback = 18, + spi = 19, + usb = 20, }; diff --git a/src/screen/drm/crtc/root.zig b/src/screen/drm/crtc/root.zig index f1f1d5c..bbb72cb 100644 --- a/src/screen/drm/crtc/root.zig +++ b/src/screen/drm/crtc/root.zig @@ -8,112 +8,112 @@ const DoubleBuffer = fb.DoubleBuffer; const Mode = @import("../connector/mode.zig").Mode; pub const RawCrtc = 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, + connector_ids: ?*u32, + count_connectors: u32, + id: u32, + buffer_id: u32, + x: u32, + y: u32, + gamma_size: u32, + mode_valid: u32, + mode: Mode, }; const PageFlipEvent = packed struct(u32) { - event: bool, - is_async: bool, - absolute: bool, - relative: bool, - __padding: u28, + event: bool, + is_async: bool, + absolute: bool, + relative: bool, + __padding: u28, }; const PageFlip = extern struct { - crtc_id: u32, - buffer_id: u32, - flags: PageFlipEvent, - __reserved: u32, - user_data: u64, + crtc_id: u32, + buffer_id: u32, + flags: PageFlipEvent, + __reserved: u32, + user_data: u64, }; pub const Crtc = struct { - const Self = @This(); + const Self = @This(); - connector_ids: ?*u32, - count_connectors: u32, - id: u32, - buffer_id: u32, - x: u32, - y: u32, - mode: Mode, - mode_valid: u32, - gamma_size: u32, - card: *Card, + connector_ids: ?*u32, + count_connectors: u32, + id: u32, + buffer_id: u32, + x: u32, + y: u32, + mode: Mode, + mode_valid: u32, + gamma_size: u32, + card: *Card, - pub fn init(card: *Card, id: u32) !Self { - var raw = std.mem.zeroInit(RawCrtc, .{ .id = id }); - try Drm.get_crtc.request(card.file.handle, RawCrtc, &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 init(card: *Card, id: u32) !Self { + var raw = std.mem.zeroInit(RawCrtc, .{ .id = id }); + try Drm.get_crtc.request(card.file.handle, RawCrtc, &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, frame_buffer: *FrameBuffer, connector: *Connector, mode: Mode) !void { - self.connector_ids = &connector.id; - self.count_connectors = 1; + pub fn attach(self: *Self, frame_buffer: *FrameBuffer, connector: *Connector, mode: Mode) !void { + self.connector_ids = &connector.id; + self.count_connectors = 1; - var crtc = RawCrtc { - .id = self.id, - .x = self.x, - .y = self.y, - .buffer_id = frame_buffer.id, - .connector_ids = self.connector_ids, - .count_connectors = self.count_connectors, - .mode = mode, - .mode_valid = 1, - .gamma_size = self.gamma_size, - }; + var crtc = RawCrtc { + .id = self.id, + .x = self.x, + .y = self.y, + .buffer_id = frame_buffer.id, + .connector_ids = self.connector_ids, + .count_connectors = self.count_connectors, + .mode = mode, + .mode_valid = 1, + .gamma_size = self.gamma_size, + }; - try Drm.set_crtc.request(self.card.file.handle, RawCrtc, &crtc); - } + try Drm.set_crtc.request(self.card.file.handle, RawCrtc, &crtc); + } - pub fn page_flip(self: *Self, double_buffer: *DoubleBuffer) !void { - double_buffer.swap(); + pub fn page_flip(self: *Self, double_buffer: *DoubleBuffer) !void { + double_buffer.swap(); - var flip = std.mem.zeroInit(PageFlip, .{ - .buffer_id = double_buffer.crtc_buffer().id, - .crtc_id = self.id, - .flags = std.mem.zeroInit(PageFlipEvent, .{ .event = true }), - }); + var flip = std.mem.zeroInit(PageFlip, .{ + .buffer_id = double_buffer.crtc_buffer().id, + .crtc_id = self.id, + .flags = std.mem.zeroInit(PageFlipEvent, .{ .event = true }), + }); - try Drm.page_flip.request(self.card.file.handle, PageFlip, &flip); - } + try Drm.page_flip.request(self.card.file.handle, PageFlip, &flip); + } - pub fn detach(self: *Self) void { - var crtc = RawCrtc { - .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, - }; + pub fn detach(self: *Self) void { + var crtc = RawCrtc { + .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, + }; - Drm.set_crtc.request( - self.card.file.handle, - RawCrtc, - &crtc - ) catch |err| std.debug.panic("set crtc failed on detach: {}", .{err}); - } + Drm.set_crtc.request( + self.card.file.handle, + RawCrtc, + &crtc + ) catch |err| std.debug.panic("set crtc failed on detach: {}", .{err}); + } }; diff --git a/src/screen/drm/encoder/root.zig b/src/screen/drm/encoder/root.zig index 0712c76..7b8932a 100644 --- a/src/screen/drm/encoder/root.zig +++ b/src/screen/drm/encoder/root.zig @@ -5,36 +5,36 @@ const Card = @import("../card.zig").Card; const Type = @import("type.zig").Type; pub const RawEncoder = extern struct { - id: u32, - type: Type, - crtc_id: u32, - possible_crtcs: u32, - possible_clones: u32, + id: u32, + type: Type, + crtc_id: u32, + possible_crtcs: u32, + possible_clones: u32, }; pub const Encoder = struct { - const Self = @This(); + const Self = @This(); - id: u32, - type: Type, - possible_crtcs: u32, - possible_clones: u32, - card: *Card, + id: u32, + type: Type, + possible_crtcs: u32, + possible_clones: u32, + card: *Card, - pub fn init(card: *Card, id: u32) !Self { - var raw = std.mem.zeroInit(RawEncoder, .{ .id = id }); - try Drm.get_encoder.request(card.file.handle, RawEncoder, &raw); + pub fn init(card: *Card, id: u32) !Self { + var raw = std.mem.zeroInit(RawEncoder, .{ .id = id }); + try Drm.get_encoder.request(card.file.handle, RawEncoder, &raw); - return .{ - .id = raw.id, - .type = raw.type, - .possible_crtcs = raw.possible_crtcs, - .possible_clones = raw.possible_clones, - .card = card - }; - } + return .{ + .id = raw.id, + .type = raw.type, + .possible_crtcs = raw.possible_crtcs, + .possible_clones = raw.possible_clones, + .card = card + }; + } - pub fn deinit(self: *Self) void { - _ = self; - } + pub fn deinit(self: *Self) void { + _ = self; + } }; diff --git a/src/screen/drm/encoder/type.zig b/src/screen/drm/encoder/type.zig index a26dc9c..12246d2 100644 --- a/src/screen/drm/encoder/type.zig +++ b/src/screen/drm/encoder/type.zig @@ -1,11 +1,11 @@ pub const Type = enum(u32) { - none = 0, - dac = 1, - tmds = 2, - lvds = 3, - tvdac = 4, - virtual = 5, - dsi = 6, - dpmst = 7, - dpi = 8, + none = 0, + dac = 1, + tmds = 2, + lvds = 3, + tvdac = 4, + virtual = 5, + dsi = 6, + dpmst = 7, + dpi = 8, }; diff --git a/src/screen/drm/event.zig b/src/screen/drm/event.zig index 201ced3..d60af57 100644 --- a/src/screen/drm/event.zig +++ b/src/screen/drm/event.zig @@ -1,31 +1,31 @@ pub const EventType = enum(u32) { - vblank = 1, - page_flip_complete = 2, - crtc_sequence = 3, + vblank = 1, + page_flip_complete = 2, + crtc_sequence = 3, }; pub const VBlankEvent = extern struct { - user_data: u64, - tv_sec: u32, - tv_usec: u32, - sequence: u32, - crtc_id: u32, + user_data: u64, + tv_sec: u32, + tv_usec: u32, + sequence: u32, + crtc_id: u32, }; pub const CrtcSequenceEvent = extern struct { - user_data: u64, - time_ns: i64, - sequence: u64, + user_data: u64, + time_ns: i64, + sequence: u64, }; pub const EventPayload = extern union { - vblank: VBlankEvent, - crtc_sequence: CrtcSequenceEvent, + vblank: VBlankEvent, + crtc_sequence: CrtcSequenceEvent, }; pub const Event = extern struct { - type: EventType, - length: u32, - payload: EventPayload, + type: EventType, + length: u32, + payload: EventPayload, }; diff --git a/src/screen/drm/frame-buffer/page-flip.zig b/src/screen/drm/frame-buffer/page-flip.zig index 2e41e61..c6eb836 100644 --- a/src/screen/drm/frame-buffer/page-flip.zig +++ b/src/screen/drm/frame-buffer/page-flip.zig @@ -1,8 +1,7 @@ - pub const PageFlip = packed struct(u32) { - event: bool, - is_async: bool, - absolute: bool, - relative: bool, - _padding: u28, + event: bool, + is_async: bool, + absolute: bool, + relative: bool, + _padding: u28, } diff --git a/src/screen/drm/frame-buffer/pixelformat.zig b/src/screen/drm/frame-buffer/pixelformat.zig index a4b3f9a..ec98900 100644 --- a/src/screen/drm/frame-buffer/pixelformat.zig +++ b/src/screen/drm/frame-buffer/pixelformat.zig @@ -1,11 +1,11 @@ fn pixel_format_code(comptime a: u8, comptime b: u8, comptime c: u8, comptime d: u8) u32 { - return @as(u32, @intCast(a)) | - (@as(u32, @intCast(b)) << 8) | - (@as(u32, @intCast(c)) << 16) | - (@as(u32, @intCast(d)) << 24); + return @as(u32, @intCast(a)) | + (@as(u32, @intCast(b)) << 8) | + (@as(u32, @intCast(c)) << 16) | + (@as(u32, @intCast(d)) << 24); } pub const PixelFormat = enum(u32) { - xrgb8888 = pixel_format_code('X', 'R', '2', '4'), + xrgb8888 = pixel_format_code('X', 'R', '2', '4'), }; diff --git a/src/screen/drm/frame-buffer/root.zig b/src/screen/drm/frame-buffer/root.zig index 0083711..e0e51f8 100644 --- a/src/screen/drm/frame-buffer/root.zig +++ b/src/screen/drm/frame-buffer/root.zig @@ -6,183 +6,183 @@ const PixelFormat = @import("pixelformat.zig").PixelFormat; const cerror = @import("../../cerror.zig"); const CreateDumb = extern struct { - height: u32, - width: u32, - bpp: u32, - flags: u32, - handle: u32, - pitch: u32, - size: u32, + height: u32, + width: u32, + bpp: u32, + flags: u32, + handle: u32, + pitch: u32, + size: u32, }; const FrameBufferCmd2 = extern struct { - id: u32, - width: u32, - height: u32, - pixel_format: PixelFormat, - flags: u32, - handles: [4]u32, - pitches: [4]u32, - offsets: [4]u32, - modifier: [4]u32, + id: u32, + width: u32, + height: u32, + pixel_format: PixelFormat, + flags: u32, + handles: [4]u32, + pitches: [4]u32, + offsets: [4]u32, + modifier: [4]u32, }; const MapDumb = extern struct { - handle: u32, - __padding: u32, - offset: i64, + handle: u32, + __padding: u32, + offset: i64, }; pub const DoubleBuffer = struct { - const Self = @This(); - - back: FrameBuffer, - front: FrameBuffer, - - pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { - return .{ - .back = try FrameBuffer.init(card, width, height, bpp), - .front = try FrameBuffer.init(card, width, height, bpp), - }; - } - - pub fn swap(self: *Self) void { - const back_data = self.back.data; - self.back.data = self.front.data; - self.front.data = back_data; - - const back_id = self.back.id; - self.back.id = self.front.id; - self.front.id = back_id; - } - - pub fn deinit(self: *Self) void { - self.back.deinit(); - self.front.deinit(); - } - - pub fn buffer(self: *Self) *FrameBuffer { - return &self.back; - } - - pub fn crtc_buffer(self: *Self) *FrameBuffer { - return &self.front; - } + const Self = @This(); + + back: FrameBuffer, + front: FrameBuffer, + + pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { + return .{ + .back = try FrameBuffer.init(card, width, height, bpp), + .front = try FrameBuffer.init(card, width, height, bpp), + }; + } + + pub fn swap(self: *Self) void { + const back_data = self.back.data; + self.back.data = self.front.data; + self.front.data = back_data; + + const back_id = self.back.id; + self.back.id = self.front.id; + self.front.id = back_id; + } + + pub fn deinit(self: *Self) void { + self.back.deinit(); + self.front.deinit(); + } + + pub fn buffer(self: *Self) *FrameBuffer { + return &self.back; + } + + pub fn crtc_buffer(self: *Self) *FrameBuffer { + return &self.front; + } }; pub const Pixel = packed struct(u32) { - blue: u8, - green: u8, - red: u8, - _padding: u8 = 0x0, + blue: u8, + green: u8, + red: u8, + _padding: u8 = 0x0, }; pub const FrameBuffer = struct { - const Self = @This(); - - card: *Card, - id: u32, - width: u32, - height: u32, - bpp: u32, - stride: u32, - data_size: u64, - canvas_size: u64, - handle: u32, - data: [*]volatile Pixel, - - pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { - var create_dumb = std.mem.zeroInit(CreateDumb, .{ - .width = width, - .height = height, - .bpp = bpp, - }); - try Drm.create_dumb.request( - card.file.handle, - CreateDumb, - &create_dumb - ); - - var fb = Self { - .id = 0, - .width = create_dumb.width, - .height = create_dumb.height, - .bpp = create_dumb.bpp, - .stride = create_dumb.pitch, - .data_size = create_dumb.size, - .canvas_size = create_dumb.size / (bpp / 8), - .handle = create_dumb.handle, - .data = undefined, - .card = card, - }; - - var buffer_cmd = FrameBufferCmd2 { - .id = 0, - .width = fb.width, - .height = fb.height, - .pixel_format = PixelFormat.xrgb8888, - .flags = 0, - .handles = [_] u32 { fb.handle, 0, 0, 0 }, - .pitches = [_] u32 { fb.stride, 0, 0, 0 }, - .offsets = [_] u32 { 0, 0, 0, 0 }, - .modifier = [_] u32 { 0, 0, 0, 0 }, - }; - - try Drm.add_frame_buffer2.request( - card.file.handle, - FrameBufferCmd2, - &buffer_cmd - ); - - fb.id = buffer_cmd.id; - - var map_dumb = std.mem.zeroInit(MapDumb, .{ .handle = fb.handle }); - - try Drm.map_dumb.request( - card.file.handle, - MapDumb, - &map_dumb - ); - - const address = os.mmap( - null, - fb.data_size, - os.PROT.READ | os.PROT.WRITE, - .{ .TYPE = os.MAP_TYPE.SHARED }, - card.file.handle, - map_dumb.offset - ); - - try cerror.from_usize(address); - - fb.data = @ptrFromInt(address); - - return fb; - } - - pub fn set(self: *Self, x: u32, y: u32, pixel: Pixel) void { - self.data[x + self.width * y] = pixel; - } - - pub fn fill(self: *Self, pixel: Pixel) void { - @memset(self.data[0..self.canvas_size], pixel); - } - - pub fn deinit(self: *Self) void { - cerror.from_usize( - os.munmap(@ptrCast(@volatileCast(self.data)), self.data_size) - ) catch |err| std.debug.panic("munmap failed in frame-buffer: {}", .{err}); - - Drm.remove_frame_buffer.request( - self.card.file.handle, - u32, - &self.id - ) catch @panic("failed to remove frame-buffer"); - - Drm.destroy_dumb.request( - self.card.file.handle, - u32, - &self.handle - ) catch @panic("failed to destroy dumb-buffer"); - } + const Self = @This(); + + card: *Card, + id: u32, + width: u32, + height: u32, + bpp: u32, + stride: u32, + data_size: u64, + canvas_size: u64, + handle: u32, + data: [*]volatile Pixel, + + pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { + var create_dumb = std.mem.zeroInit(CreateDumb, .{ + .width = width, + .height = height, + .bpp = bpp, + }); + try Drm.create_dumb.request( + card.file.handle, + CreateDumb, + &create_dumb + ); + + var fb = Self { + .id = 0, + .width = create_dumb.width, + .height = create_dumb.height, + .bpp = create_dumb.bpp, + .stride = create_dumb.pitch, + .data_size = create_dumb.size, + .canvas_size = create_dumb.size / (bpp / 8), + .handle = create_dumb.handle, + .data = undefined, + .card = card, + }; + + var buffer_cmd = FrameBufferCmd2 { + .id = 0, + .width = fb.width, + .height = fb.height, + .pixel_format = PixelFormat.xrgb8888, + .flags = 0, + .handles = [_] u32 { fb.handle, 0, 0, 0 }, + .pitches = [_] u32 { fb.stride, 0, 0, 0 }, + .offsets = [_] u32 { 0, 0, 0, 0 }, + .modifier = [_] u32 { 0, 0, 0, 0 }, + }; + + try Drm.add_frame_buffer2.request( + card.file.handle, + FrameBufferCmd2, + &buffer_cmd + ); + + fb.id = buffer_cmd.id; + + var map_dumb = std.mem.zeroInit(MapDumb, .{ .handle = fb.handle }); + + try Drm.map_dumb.request( + card.file.handle, + MapDumb, + &map_dumb + ); + + const address = os.mmap( + null, + fb.data_size, + os.PROT.READ | os.PROT.WRITE, + .{ .TYPE = os.MAP_TYPE.SHARED }, + card.file.handle, + map_dumb.offset + ); + + try cerror.from_usize(address); + + fb.data = @ptrFromInt(address); + + return fb; + } + + pub fn set(self: *Self, x: u32, y: u32, pixel: Pixel) void { + self.data[x + self.width * y] = pixel; + } + + pub fn fill(self: *Self, pixel: Pixel) void { + @memset(self.data[0..self.canvas_size], pixel); + } + + pub fn deinit(self: *Self) void { + cerror.from_usize( + os.munmap(@ptrCast(@volatileCast(self.data)), self.data_size) + ) catch |err| std.debug.panic("munmap failed in frame-buffer: {}", .{err}); + + Drm.remove_frame_buffer.request( + self.card.file.handle, + u32, + &self.id + ) catch @panic("failed to remove frame-buffer"); + + Drm.destroy_dumb.request( + self.card.file.handle, + u32, + &self.handle + ) catch @panic("failed to destroy dumb-buffer"); + } }; diff --git a/src/screen/drm/request.zig b/src/screen/drm/request.zig index 5daf92f..9a70c7d 100644 --- a/src/screen/drm/request.zig +++ b/src/screen/drm/request.zig @@ -3,27 +3,27 @@ const os = std.os.linux; const cerror = @import("../cerror.zig"); fn ioctl(fd: os.fd_t, request: u32, arg: usize) !void { - try cerror.from_usize(os.ioctl(fd, request, arg)); + try cerror.from_usize(os.ioctl(fd, request, arg)); } pub const Drm = enum(u8) { - const Self = @This(); + 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, - dirty_frame_buffer = 0xb1, - create_dumb = 0xb2, - map_dumb = 0xb3, - destroy_dumb = 0xb4, - add_frame_buffer2 = 0xb8, + get_resources = 0xa0, + get_crtc = 0xa1, + set_crtc = 0xa2, + get_encoder = 0xa6, + get_connector = 0xa7, + remove_frame_buffer = 0xaf, + page_flip = 0xb0, + dirty_frame_buffer = 0xb1, + create_dumb = 0xb2, + map_dumb = 0xb3, + destroy_dumb = 0xb4, + add_frame_buffer2 = 0xb8, - pub fn request(self: Self, fd: os.fd_t, T: type, arg: *T) !void { - const id = os.IOCTL.IOWR('d', @intFromEnum(self), T); - try ioctl(fd, id, @intFromPtr(arg)); - } + pub fn request(self: Self, fd: os.fd_t, T: type, arg: *T) !void { + const id = os.IOCTL.IOWR('d', @intFromEnum(self), T); + try ioctl(fd, id, @intFromPtr(arg)); + } }; diff --git a/src/screen/drm/resources.zig b/src/screen/drm/resources.zig index 6128f37..fdd5042 100644 --- a/src/screen/drm/resources.zig +++ b/src/screen/drm/resources.zig @@ -5,72 +5,72 @@ const Card = @import("card.zig").Card; const Drm = @import("request.zig").Drm; const RawResources = 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, + 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, }; pub const Resources = struct { - const Self = @This(); - const Range = struct { min: u32, max: u32 }; + const Self = @This(); + const Range = struct { min: u32, max: u32 }; - card: *Card, + card: *Card, - fb_ids: []u32, - crtc_ids: []u32, - connector_ids: []u32, - encoder_ids: []u32, - width: Range, - height: Range, + fb_ids: []u32, + crtc_ids: []u32, + connector_ids: []u32, + encoder_ids: []u32, + width: Range, + height: Range, - pub fn raw_without_ids(card: *Card) !RawResources { - var result = std.mem.zeroes(RawResources); - try Drm.get_resources.request(card.file.handle, RawResources, &result); - return result; - } + pub fn raw_without_ids(card: *Card) !RawResources { + var result = std.mem.zeroes(RawResources); + try Drm.get_resources.request(card.file.handle, RawResources, &result); + return result; + } - // NOTE: This function does not take in account - // that there might be some hot-plugging going - // on. This might have to change in the future. - pub fn init(card: *Card) !Self { - var raw = try Self.raw_without_ids(card); - const resources = .{ - .fb_ids = try card.allocator.alloc(u32, raw.count_fbs), - .crtc_ids = try card.allocator.alloc(u32, raw.count_crtcs), - .connector_ids = try card.allocator.alloc(u32, raw.count_connectors), - .encoder_ids = try card.allocator.alloc(u32, raw.count_encoders), - .width = .{ .min = raw.min_width, .max = raw.max_width }, - .height = .{ .min = raw.min_height, .max = raw.max_height }, - .card = card, - }; + // NOTE: This function does not take in account + // that there might be some hot-plugging going + // on. This might have to change in the future. + pub fn init(card: *Card) !Self { + var raw = try Self.raw_without_ids(card); + const resources = .{ + .fb_ids = try card.allocator.alloc(u32, raw.count_fbs), + .crtc_ids = try card.allocator.alloc(u32, raw.count_crtcs), + .connector_ids = try card.allocator.alloc(u32, raw.count_connectors), + .encoder_ids = try card.allocator.alloc(u32, raw.count_encoders), + .width = .{ .min = raw.min_width, .max = raw.max_width }, + .height = .{ .min = raw.min_height, .max = raw.max_height }, + .card = card, + }; - @memset(resources.fb_ids, 0); - @memset(resources.crtc_ids, 0); - @memset(resources.connector_ids, 0); - @memset(resources.encoder_ids, 0); + @memset(resources.fb_ids, 0); + @memset(resources.crtc_ids, 0); + @memset(resources.connector_ids, 0); + @memset(resources.encoder_ids, 0); - raw.fb_ids = @ptrCast(resources.fb_ids); - raw.crtc_ids = @ptrCast(resources.crtc_ids); - raw.connector_ids = @ptrCast(resources.connector_ids); - raw.encoder_ids = @ptrCast(resources.encoder_ids); - try Drm.get_resources.request(card.file.handle, RawResources, &raw); + raw.fb_ids = @ptrCast(resources.fb_ids); + raw.crtc_ids = @ptrCast(resources.crtc_ids); + raw.connector_ids = @ptrCast(resources.connector_ids); + raw.encoder_ids = @ptrCast(resources.encoder_ids); + try Drm.get_resources.request(card.file.handle, RawResources, &raw); - return resources; - } + return resources; + } - pub fn deinit(self: *Self) void { - self.card.allocator.free(self.fb_ids); - self.card.allocator.free(self.crtc_ids); - self.card.allocator.free(self.connector_ids); - self.card.allocator.free(self.encoder_ids); - } + pub fn deinit(self: *Self) void { + self.card.allocator.free(self.fb_ids); + self.card.allocator.free(self.crtc_ids); + self.card.allocator.free(self.connector_ids); + self.card.allocator.free(self.encoder_ids); + } }; -- cgit v1.2.3-70-g09d2