diff options
Diffstat (limited to 'src/screen/drm/frame-buffer/root.zig')
| -rw-r--r-- | src/screen/drm/frame-buffer/root.zig | 280 |
1 files changed, 140 insertions, 140 deletions
diff --git a/src/screen/drm/frame-buffer/root.zig b/src/screen/drm/frame-buffer/root.zig index 0083711..e0e51f8 100644 --- a/src/screen/drm/frame-buffer/root.zig +++ b/src/screen/drm/frame-buffer/root.zig @@ -6,183 +6,183 @@ const PixelFormat = @import("pixelformat.zig").PixelFormat; const cerror = @import("../../cerror.zig"); const CreateDumb = extern struct { - height: u32, - width: u32, - bpp: u32, - flags: u32, - handle: u32, - pitch: u32, - size: u32, + height: u32, + width: u32, + bpp: u32, + flags: u32, + handle: u32, + pitch: u32, + size: u32, }; const FrameBufferCmd2 = extern struct { - id: u32, - width: u32, - height: u32, - pixel_format: PixelFormat, - flags: u32, - handles: [4]u32, - pitches: [4]u32, - offsets: [4]u32, - modifier: [4]u32, + id: u32, + width: u32, + height: u32, + pixel_format: PixelFormat, + flags: u32, + handles: [4]u32, + pitches: [4]u32, + offsets: [4]u32, + modifier: [4]u32, }; const MapDumb = extern struct { - handle: u32, - __padding: u32, - offset: i64, + handle: u32, + __padding: u32, + offset: i64, }; pub const DoubleBuffer = struct { - const Self = @This(); + const Self = @This(); - back: FrameBuffer, - front: FrameBuffer, + 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 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; + 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; - } + 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 deinit(self: *Self) void { + self.back.deinit(); + self.front.deinit(); + } - pub fn buffer(self: *Self) *FrameBuffer { - return &self.back; - } + pub fn buffer(self: *Self) *FrameBuffer { + return &self.back; + } - pub fn crtc_buffer(self: *Self) *FrameBuffer { - return &self.front; - } + pub fn crtc_buffer(self: *Self) *FrameBuffer { + return &self.front; + } }; pub const Pixel = packed struct(u32) { - blue: u8, - green: u8, - red: u8, - _padding: u8 = 0x0, + blue: u8, + green: u8, + red: u8, + _padding: u8 = 0x0, }; pub const FrameBuffer = struct { - const Self = @This(); + const Self = @This(); - card: *Card, - id: u32, - width: u32, - height: u32, - bpp: u32, - stride: u32, - data_size: u64, - canvas_size: u64, - handle: u32, - data: [*]volatile Pixel, + card: *Card, + id: u32, + width: u32, + height: u32, + bpp: u32, + stride: u32, + data_size: u64, + canvas_size: u64, + handle: u32, + data: [*]volatile Pixel, - pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { - var create_dumb = std.mem.zeroInit(CreateDumb, .{ - .width = width, - .height = height, - .bpp = bpp, - }); - try Drm.create_dumb.request( - card.file.handle, - CreateDumb, - &create_dumb - ); + pub fn init(card: *Card, width: u32, height: u32, bpp: u32) !Self { + var create_dumb = std.mem.zeroInit(CreateDumb, .{ + .width = width, + .height = height, + .bpp = bpp, + }); + try Drm.create_dumb.request( + card.file.handle, + CreateDumb, + &create_dumb + ); - var fb = Self { - .id = 0, - .width = create_dumb.width, - .height = create_dumb.height, - .bpp = create_dumb.bpp, - .stride = create_dumb.pitch, - .data_size = create_dumb.size, - .canvas_size = create_dumb.size / (bpp / 8), - .handle = create_dumb.handle, - .data = undefined, - .card = card, - }; + var fb = Self { + .id = 0, + .width = create_dumb.width, + .height = create_dumb.height, + .bpp = create_dumb.bpp, + .stride = create_dumb.pitch, + .data_size = create_dumb.size, + .canvas_size = create_dumb.size / (bpp / 8), + .handle = create_dumb.handle, + .data = undefined, + .card = card, + }; - var buffer_cmd = FrameBufferCmd2 { - .id = 0, - .width = fb.width, - .height = fb.height, - .pixel_format = PixelFormat.xrgb8888, - .flags = 0, - .handles = [_] u32 { fb.handle, 0, 0, 0 }, - .pitches = [_] u32 { fb.stride, 0, 0, 0 }, - .offsets = [_] u32 { 0, 0, 0, 0 }, - .modifier = [_] u32 { 0, 0, 0, 0 }, - }; + var buffer_cmd = FrameBufferCmd2 { + .id = 0, + .width = fb.width, + .height = fb.height, + .pixel_format = PixelFormat.xrgb8888, + .flags = 0, + .handles = [_] u32 { fb.handle, 0, 0, 0 }, + .pitches = [_] u32 { fb.stride, 0, 0, 0 }, + .offsets = [_] u32 { 0, 0, 0, 0 }, + .modifier = [_] u32 { 0, 0, 0, 0 }, + }; - try Drm.add_frame_buffer2.request( - card.file.handle, - FrameBufferCmd2, - &buffer_cmd - ); + try Drm.add_frame_buffer2.request( + card.file.handle, + FrameBufferCmd2, + &buffer_cmd + ); - fb.id = buffer_cmd.id; + fb.id = buffer_cmd.id; - var map_dumb = std.mem.zeroInit(MapDumb, .{ .handle = fb.handle }); + var map_dumb = std.mem.zeroInit(MapDumb, .{ .handle = fb.handle }); - try Drm.map_dumb.request( - card.file.handle, - MapDumb, - &map_dumb - ); + try Drm.map_dumb.request( + card.file.handle, + MapDumb, + &map_dumb + ); - const address = os.mmap( - null, - fb.data_size, - os.PROT.READ | os.PROT.WRITE, - .{ .TYPE = os.MAP_TYPE.SHARED }, - card.file.handle, - map_dumb.offset - ); + const address = os.mmap( + null, + fb.data_size, + os.PROT.READ | os.PROT.WRITE, + .{ .TYPE = os.MAP_TYPE.SHARED }, + card.file.handle, + map_dumb.offset + ); - try cerror.from_usize(address); + try cerror.from_usize(address); - fb.data = @ptrFromInt(address); + fb.data = @ptrFromInt(address); - return fb; - } + return fb; + } - pub fn set(self: *Self, x: u32, y: u32, pixel: Pixel) void { - self.data[x + self.width * y] = pixel; - } + pub fn set(self: *Self, x: u32, y: u32, pixel: Pixel) void { + 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 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) - ) catch |err| std.debug.panic("munmap failed in frame-buffer: {}", .{err}); + pub fn deinit(self: *Self) void { + cerror.from_usize( + os.munmap(@ptrCast(@volatileCast(self.data)), self.data_size) + ) catch |err| std.debug.panic("munmap failed in frame-buffer: {}", .{err}); - Drm.remove_frame_buffer.request( - self.card.file.handle, - u32, - &self.id - ) catch @panic("failed to remove frame-buffer"); + Drm.remove_frame_buffer.request( + self.card.file.handle, + u32, + &self.id + ) catch @panic("failed to remove frame-buffer"); - Drm.destroy_dumb.request( - self.card.file.handle, - u32, - &self.handle - ) catch @panic("failed to destroy dumb-buffer"); - } + Drm.destroy_dumb.request( + self.card.file.handle, + u32, + &self.handle + ) catch @panic("failed to destroy dumb-buffer"); + } }; |