summaryrefslogtreecommitdiff
path: root/src/screen/drm/frame-buffer/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/frame-buffer/root.zig
parent0b6ee849722002a8bc7cc5374e3136bee4be2ccd (diff)
screen: add vsync and double buffering
Diffstat (limited to 'src/screen/drm/frame-buffer/root.zig')
-rw-r--r--src/screen/drm/frame-buffer/root.zig41
1 files changed, 41 insertions, 0 deletions
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)