summaryrefslogtreecommitdiff
path: root/src/screen/drm/crtc/root.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-02-02 16:00:15 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-02-02 16:00:15 +0100
commit8d062a90b1ffbe9e00334fa3e9e939406bd32141 (patch)
tree20951bba89bbcdc3090e24d99eb9f91c0043f28e /src/screen/drm/crtc/root.zig
parent0b6ee849722002a8bc7cc5374e3136bee4be2ccd (diff)
screen: add vsync and double buffering
Diffstat (limited to 'src/screen/drm/crtc/root.zig')
-rw-r--r--src/screen/drm/crtc/root.zig32
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 {