diff options
Diffstat (limited to 'src/screen/drm/frame-buffer/root.zig')
| -rw-r--r-- | src/screen/drm/frame-buffer/root.zig | 41 |
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) |