drivers/graphics/driver-graphics: Implement MODE_ADD_FB2

This commit is contained in:
bjorn3
2026-05-14 14:56:33 +02:00
parent 0eb6390fe1
commit 5f4e5016a8
8 changed files with 52 additions and 14 deletions
Generated
+2 -1
View File
@@ -1073,6 +1073,7 @@ dependencies = [
"common",
"daemon",
"driver-graphics",
"drm-fourcc",
"drm-sys",
"edid",
"embedded-hal",
@@ -1823,7 +1824,7 @@ dependencies = [
[[package]]
name = "redox-ioctl"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#36d2efa33444d26a584d3e6cb17ba108079c24ea"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#546bc6fb21b990ca9195a1115717c9a842fe4909"
dependencies = [
"drm-sys",
"redox_syscall 0.7.5",
+1
View File
@@ -79,6 +79,7 @@ anyhow = "1"
bitflags = "2"
clap = "4"
drm = "0.15.0"
drm-fourcc = "2.2.0"
drm-sys = "0.8.1"
edid = "0.3.0" #TODO: edid is abandoned, fork it and maintain?
fdt = "0.1.5"
+1 -1
View File
@@ -5,7 +5,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
drm-fourcc = "2.2.0"
drm-fourcc.workspace = true
drm-sys.workspace = true
edid.workspace = true #TODO: edid is abandoned, fork it and maintain?
log.workspace = true
@@ -3,6 +3,7 @@ use std::fmt::Debug;
use std::marker::PhantomData;
use std::sync::{Arc, Mutex};
use drm_fourcc::DrmFourcc;
use drm_sys::{
drm_mode_modeinfo, DRM_MODE_OBJECT_BLOB, DRM_MODE_OBJECT_CONNECTOR, DRM_MODE_OBJECT_CRTC,
DRM_MODE_OBJECT_ENCODER, DRM_MODE_OBJECT_FB, DRM_MODE_OBJECT_PROPERTY,
@@ -235,9 +236,8 @@ define_object_props!(object, KmsCrtc<T: GraphicsAdapter> {
pub struct KmsFramebuffer<T: GraphicsAdapter> {
pub width: u32,
pub height: u32,
pub pixel_format: DrmFourcc,
pub pitch: u32,
pub bpp: u32,
pub depth: u32,
pub buffer: Arc<T::Buffer>,
pub driver_data: T::Framebuffer,
}
+41 -6
View File
@@ -771,28 +771,42 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
ipc::MODE_GET_FB => ipc::DrmModeFbCmd::with(payload, |mut data| {
let fb = self.objects.get_framebuffer(KmsObjectId(data.fb_id()))?;
let (bpp, depth) = match fb.pixel_format {
DrmFourcc::Xrgb8888 => (32, 24),
DrmFourcc::Argb8888 => (32, 32),
_ => todo!(),
};
*next_id += 1;
buffers.insert(*next_id, fb.buffer.clone());
data.set_width(fb.width);
data.set_height(fb.height);
data.set_pitch(fb.pitch);
data.set_bpp(fb.bpp);
data.set_depth(fb.depth);
data.set_bpp(bpp);
data.set_depth(depth);
data.set_handle(*next_id);
Ok(0)
}),
ipc::MODE_ADD_FB => ipc::DrmModeFbCmd::with(payload, |mut data| {
let buffer = buffers.get(&data.handle()).ok_or(Error::new(EINVAL))?;
if data.bpp() != 32 {
return Err(Error::new(EINVAL));
}
let pixel_format = match data.depth() {
24 => DrmFourcc::Xrgb8888,
32 => DrmFourcc::Argb8888,
_ => return Err(Error::new(EINVAL)),
};
let fb = self.adapter.create_framebuffer(buffer);
let id = self.objects.add_framebuffer(objects::KmsFramebuffer {
width: data.width(),
height: data.height(),
pixel_format,
pitch: data.pitch(),
bpp: data.bpp(),
depth: data.depth(),
buffer: buffer.clone(),
driver_data: fb,
});
@@ -915,6 +929,27 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
data.set_plane_id_ptr(&ids);
Ok(0)
}),
ipc::MODE_ADD_FB2 => ipc::DrmModeFbCmd2::with(payload, |mut data| {
// FIXME handle multi-plane framebuffers
let buffer = buffers.get(&data.handles()[0]).ok_or(Error::new(EINVAL))?;
let fb = self.adapter.create_framebuffer(buffer);
let id = self.objects.add_framebuffer(objects::KmsFramebuffer {
width: data.width(),
height: data.height(),
pixel_format: DrmFourcc::try_from(data.pixel_format())
.map_err(|_| Error::new(EINVAL))?,
pitch: data.pitches()[0],
buffer: buffer.clone(),
driver_data: fb,
});
data.set_fb_id(id.0);
Ok(0)
}),
ipc::MODE_GET_PLANE => ipc::DrmModeGetPlane::with(payload, |mut data| {
let i = id_index(data.plane_id());
let crtc_id = self.objects.crtc_ids()[i as usize];
@@ -987,9 +1022,9 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
data.set_width(fb.width);
data.set_height(fb.height);
data.set_pixel_format(DrmFourcc::Argb8888 as u32);
data.set_pixel_format(fb.pixel_format as u32);
data.set_handles([*next_id, 0, 0, 0]);
data.set_pitches([fb.width * 4, 0, 0, 0]);
data.set_pitches([fb.pitch, 0, 0, 0]);
data.set_offsets([0; 4]);
data.set_modifier([0; 4]);
Ok(0)
+1
View File
@@ -6,6 +6,7 @@ edition = "2021"
[dependencies]
bitbang-hal = "0.3"
drm-fourcc.workspace = true
drm-sys.workspace = true
edid.workspace = true #TODO: edid is abandoned, fork it and maintain?
#TODO: waiting for bitbang-hal to update to embedded-hal 1.0
+2 -2
View File
@@ -4,6 +4,7 @@ use common::{
};
use driver_graphics::kms::connector::KmsConnectorStatus;
use driver_graphics::kms::objects::{KmsFramebuffer, KmsObjects};
use drm_fourcc::DrmFourcc;
use pcid_interface::{PciFunction, PciFunctionHandle};
use range_alloc::RangeAllocator;
use std::{collections::VecDeque, fmt, mem, sync::Arc};
@@ -766,9 +767,8 @@ impl Device {
let fb = KmsFramebuffer {
width,
height,
pixel_format: DrmFourcc::Argb8888,
pitch: stride,
bpp: 32,
depth: 32,
buffer: Arc::new(buffer),
driver_data: (),
};
+2 -2
View File
@@ -2,6 +2,7 @@ use std::sync::Arc;
use common::io::{Io, MmioPtr};
use driver_graphics::kms::objects::KmsFramebuffer;
use drm_fourcc::DrmFourcc;
use range_alloc::RangeAllocator;
use syscall::error::Result;
use syscall::{Error, EIO};
@@ -94,9 +95,8 @@ impl Plane {
KmsFramebuffer {
width,
height,
pixel_format: DrmFourcc::Argb8888,
pitch: stride,
bpp: 32,
depth: 32,
buffer: Arc::new(buffer),
driver_data: (),
}