use drmkit_core::Device;
use drmkit_scene::LayerBufferSource;
use drmkit_scene_sources::GbmBufferSource;
use crate::{ProducerError, ScanoutProducer};
pub struct GbmScanoutProducer<'a> {
device: &'a Device,
}
impl std::fmt::Debug for GbmScanoutProducer<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("GbmScanoutProducer").finish_non_exhaustive()
}
}
impl<'a> GbmScanoutProducer<'a> {
#[must_use]
pub const fn new(device: &'a Device) -> Self {
Self { device }
}
}
const LINEAR: u64 = 0;
impl ScanoutProducer for GbmScanoutProducer<'_> {
fn exportable_modifiers(&mut self, _fourcc: u32) -> Vec<u64> {
vec![LINEAR]
}
fn create_buffer(
&mut self,
width: u32,
height: u32,
fourcc: u32,
allowed: &[u64],
) -> Result<Box<dyn LayerBufferSource>, ProducerError> {
if !allowed.is_empty() && !allowed.contains(&LINEAR) {
return Err(ProducerError::Unsupported);
}
let source = GbmBufferSource::create(self.device, width, height, fourcc, allowed)
.map_err(|error| ProducerError::Allocate(error.to_string()))?;
Ok(Box::new(source))
}
}