diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 16:00:15 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-02 16:00:15 +0100 |
| commit | 8d062a90b1ffbe9e00334fa3e9e939406bd32141 (patch) | |
| tree | 20951bba89bbcdc3090e24d99eb9f91c0043f28e /src/screen/drm/crtc | |
| parent | 0b6ee849722002a8bc7cc5374e3136bee4be2ccd (diff) | |
screen: add vsync and double buffering
Diffstat (limited to 'src/screen/drm/crtc')
| -rw-r--r-- | src/screen/drm/crtc/root.zig | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/screen/drm/crtc/root.zig b/src/screen/drm/crtc/root.zig index 3c9d6f9..f1f1d5c 100644 --- a/src/screen/drm/crtc/root.zig +++ b/src/screen/drm/crtc/root.zig @@ -2,7 +2,9 @@ const std = @import("std"); const Card = @import("../card.zig").Card; const Drm = @import("../request.zig").Drm; const Connector = @import("../connector/root.zig").Connector; -const FrameBuffer = @import("../frame-buffer/root.zig").FrameBuffer; +const fb = @import("../frame-buffer/root.zig"); +const FrameBuffer = fb.FrameBuffer; +const DoubleBuffer = fb.DoubleBuffer; const Mode = @import("../connector/mode.zig").Mode; pub const RawCrtc = extern struct { @@ -17,6 +19,22 @@ pub const RawCrtc = extern struct { mode: Mode, }; +const PageFlipEvent = packed struct(u32) { + 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, +}; + pub const Crtc = struct { const Self = @This(); @@ -65,8 +83,18 @@ pub const Crtc = struct { }; try Drm.set_crtc.request(self.card.file.handle, RawCrtc, &crtc); + } + + 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 }), + }); - std.debug.print("crtc = {any}\n", .{self}); + try Drm.page_flip.request(self.card.file.handle, PageFlip, &flip); } pub fn detach(self: *Self) void { |