feat: capabilities and property blobs

This commit is contained in:
Jackson Netherwood-Imig
2026-01-28 16:35:16 -08:00
parent 16cd09d7c2
commit 7707a52d34
2 changed files with 70 additions and 3 deletions
+31 -1
View File
@@ -5,6 +5,7 @@ const log = std.log.scoped(.drm);
pub const sys = @import("sys.zig"); pub const sys = @import("sys.zig");
pub const Format = fmt.Format; pub const Format = fmt.Format;
pub const FormatModifiers = fmt.FormatModifiers; pub const FormatModifiers = fmt.FormatModifiers;
pub const ModeInfo = sys.mode.ModeInfo;
pub const Card = struct { pub const Card = struct {
handle: std.Io.File, handle: std.Io.File,
@@ -64,11 +65,40 @@ pub const Card = struct {
} }
} }
pub fn setClientCapability(self: Card, capability: sys.ClientCapability, value: u64) sys.IoctlError!void {
var set_cap = sys.SetClientCap{
.capability = capability,
.value = value,
};
try sys.ioctl(self.handle.handle, .set_client_cap, &set_cap);
}
pub fn getCapability(self: Card, capability: sys.Capability) sys.IoctlError!u64 {
var get_cap = sys.GetCap{
.capability = capability,
.value = 0,
};
try sys.ioctl(self.handle.handle, .get_cap, &get_cap);
return get_cap.value;
}
pub fn createModesettingPropertyBlob(self: Card, data: []const u8) sys.IoctlError!u32 {
var create = std.mem.zeroInit(sys.mode.CreateBlob, .{
.length = @as(u32, @intCast(data.len)),
.data = @intFromPtr(data.ptr),
});
try sys.ioctl(self.handle.handle, .mode_createpropblob, &create);
return create.blob_id;
}
// BEGIN MODESETTING API // BEGIN MODESETTING API
pub const GetResourcesError = sys.IoctlError || error{OutOfMemory}; pub const GetResourcesError = sys.IoctlError || error{OutOfMemory};
pub fn getModesettingResourcesAlloc(self: Card, gpa: std.mem.Allocator) GetResourcesError!ModesettingResources { pub fn getModesettingResourcesAlloc(
self: Card,
gpa: std.mem.Allocator,
) GetResourcesError!ModesettingResources {
while (true) { while (true) {
var res = std.mem.zeroes(sys.mode.CardRes); var res = std.mem.zeroes(sys.mode.CardRes);
try sys.ioctl(self.handle.handle, .mode_getresources, &res); try sys.ioctl(self.handle.handle, .mode_getresources, &res);
+39 -2
View File
@@ -32,8 +32,8 @@ pub const Request = enum(u32) {
// gem_close = drm_iow(0x09, drm_gem_close), // gem_close = drm_iow(0x09, drm_gem_close),
// gem_flink = drm_iowr(0x0a, drm_gem_flink), // gem_flink = drm_iowr(0x0a, drm_gem_flink),
// gem_open = drm_iowr(0x0b, drm_gem_open), // gem_open = drm_iowr(0x0b, drm_gem_open),
// get_cap = drm_iowr(0x0c, drm_get_cap), get_cap = drm_iowr(0x0c, GetCap),
// set_client_cap = drm_iow(0x0d, drm_set_client_cap), set_client_cap = drm_iow(0x0d, SetClientCap),
set_unique = drm_iow(0x10, Unique), set_unique = drm_iow(0x10, Unique),
auth_magic = drm_iow(0x11, Auth), auth_magic = drm_iow(0x11, Auth),
// block = drm_iowr(0x12, drm_block), // block = drm_iowr(0x12, drm_block),
@@ -254,6 +254,43 @@ pub const SetVersion = extern struct {
dd_minor: c_int, dd_minor: c_int,
}; };
pub const GetCap = extern struct {
capability: Capability,
value: u64,
};
pub const Capability = enum(u64) {
dumb_buffer = 0x1,
vblank_high_crtc = 0x2,
dumb_preferred_depth = 0x3,
dumb_buffer_shadow = 0x4,
prime = 0x5,
timestamp_monotonic = 0x6,
async_page_flip = 0x7,
cursor_width = 0x8,
cursor_height = 0x9,
addfbd_modifiers = 0x10,
page_flip_target = 0x11,
crtc_in_vblank_event = 0x12,
syncobj = 0x13,
syncobj_timeline = 0x14,
atomic_async_page_flip = 0x15,
};
pub const SetClientCap = extern struct {
capability: ClientCapability,
value: u64,
};
pub const ClientCapability = enum(u64) {
stereo_3d = 1,
universal_planes = 2,
atomic = 3,
aspect_ratio = 4,
writeback_connectors = 5,
cursor_plane_hotspot = 6,
};
pub const Ctx = extern struct { pub const Ctx = extern struct {
handle: Context, handle: Context,
flags: CtxFlags, flags: CtxFlags,