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/frame-buffer | |
| parent | 0b6ee849722002a8bc7cc5374e3136bee4be2ccd (diff) | |
screen: add vsync and double buffering
Diffstat (limited to 'src/screen/drm/frame-buffer')
| -rw-r--r-- | src/screen/drm/frame-buffer/page-flip.zig | 8 | ||||
| -rw-r--r-- | src/screen/drm/frame-buffer/root.zig | 41 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/screen/drm/frame-buffer/page-flip.zig b/src/screen/drm/frame-buffer/page-flip.zig new file mode 100644 index 0000000..2e41e61 --- /dev/null +++ b/src/screen/drm/frame-buffer/page-flip.zig @@ -0,0 +1,8 @@ + +pub const PageFlip = packed struct(u32) { + event: bool, + is_async: bool, + absolute: bool, + relative: bool, + _padding: u28, +} diff --git a/src/screen/drm/frame-buffer/root.zig b/src/screen/drm/frame-buffer/root.zig index eb7b47b..0083711 100644 --- a/src/screen/drm/frame-buffer/root.zig +++ b/src/screen/drm/frame-buffer/root.zig @@ -33,6 +33,43 @@ const MapDumb = extern struct { 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; + } +}; + pub const Pixel = packed struct(u32) { blue: u8, green: u8, @@ -127,6 +164,10 @@ pub const FrameBuffer = struct { 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) |