diff --git a/Cargo.lock b/Cargo.lock index 67ed69189d..117632ba3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 68a5b89898..c41de7b05d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/drivers/graphics/driver-graphics/Cargo.toml b/drivers/graphics/driver-graphics/Cargo.toml index 31e02335c8..fee6246dd3 100644 --- a/drivers/graphics/driver-graphics/Cargo.toml +++ b/drivers/graphics/driver-graphics/Cargo.toml @@ -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 diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 156b32af2e..805cea1386 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -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 { pub struct KmsFramebuffer { pub width: u32, pub height: u32, + pub pixel_format: DrmFourcc, pub pitch: u32, - pub bpp: u32, - pub depth: u32, pub buffer: Arc, pub driver_data: T::Framebuffer, } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 71f9f8caef..5652986b22 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -771,28 +771,42 @@ impl SchemeSync for GraphicsSchemeInner { 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 SchemeSync for GraphicsSchemeInner { 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 SchemeSync for GraphicsSchemeInner { 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) diff --git a/drivers/graphics/ihdgd/Cargo.toml b/drivers/graphics/ihdgd/Cargo.toml index 25d04eac8b..a76ec92e98 100644 --- a/drivers/graphics/ihdgd/Cargo.toml +++ b/drivers/graphics/ihdgd/Cargo.toml @@ -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 diff --git a/drivers/graphics/ihdgd/src/device/mod.rs b/drivers/graphics/ihdgd/src/device/mod.rs index a30b4f7ab7..607dcea0ab 100644 --- a/drivers/graphics/ihdgd/src/device/mod.rs +++ b/drivers/graphics/ihdgd/src/device/mod.rs @@ -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: (), }; diff --git a/drivers/graphics/ihdgd/src/device/pipe.rs b/drivers/graphics/ihdgd/src/device/pipe.rs index f36b0730a5..dde76a1f2a 100644 --- a/drivers/graphics/ihdgd/src/device/pipe.rs +++ b/drivers/graphics/ihdgd/src/device/pipe.rs @@ -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: (), }