1
0
Fork 0
forked from wry/wry

wl_buffer: add constructor

This commit is contained in:
Julian Orth 2026-02-10 18:51:23 +01:00
parent 3ef408b5b4
commit ca5cc67fa2
5 changed files with 65 additions and 70 deletions

View file

@ -73,16 +73,18 @@ impl WlBuffer {
self.shm self.shm
} }
pub fn new_dmabuf( fn new(
id: WlBufferId, id: WlBufferId,
client: &Rc<Client>, client: &Rc<Client>,
format: &'static Format, format: &'static Format,
dmabuf: DmaBuf, width: i32,
img: &Rc<dyn GfxImage>, height: i32,
) -> Self { dmabuf: Option<DmaBuf>,
let width = img.width(); storage: Option<WlBufferStorage>,
let height = img.height(); shm: bool,
Self { color: Option<[u32; 4]>,
) -> Rc<Self> {
Rc::new(Self {
id, id,
destroyed: Cell::new(false), destroyed: Cell::new(false),
client: client.clone(), client: client.clone(),
@ -90,17 +92,37 @@ impl WlBuffer {
format, format,
width, width,
height, height,
dmabuf: Some(dmabuf), dmabuf,
render_ctx_version: Cell::new(client.state.render_ctx_version.get()), render_ctx_version: Cell::new(client.state.render_ctx_version.get()),
storage: RefCell::new(Some(WlBufferStorage::Dmabuf { storage: RefCell::new(storage),
shm,
tracker: Default::default(),
color,
})
}
pub fn new_dmabuf(
id: WlBufferId,
client: &Rc<Client>,
format: &'static Format,
dmabuf: DmaBuf,
img: &Rc<dyn GfxImage>,
) -> Rc<Self> {
Self::new(
id,
client,
format,
img.width(),
img.height(),
Some(dmabuf),
Some(WlBufferStorage::Dmabuf {
img: img.clone(), img: img.clone(),
tex: None, tex: None,
fb: None, fb: None,
})), }),
shm: false, false,
tracker: Default::default(), None,
color: None, )
}
} }
#[expect(clippy::too_many_arguments)] #[expect(clippy::too_many_arguments)]
@ -114,7 +136,7 @@ impl WlBuffer {
format: &'static Format, format: &'static Format,
mem: &Rc<ClientMem>, mem: &Rc<ClientMem>,
udmabuf: Option<(&Rc<OwnedFd>, usize)>, udmabuf: Option<(&Rc<OwnedFd>, usize)>,
) -> Result<Self, WlBufferError> { ) -> Result<Rc<Self>, WlBufferError> {
let bytes = stride as u64 * height as u64; let bytes = stride as u64 * height as u64;
let required = bytes + offset as u64; let required = bytes + offset as u64;
if required > mem.len() as u64 { if required > mem.len() as u64 {
@ -150,25 +172,21 @@ impl WlBuffer {
tex_impossible: false, tex_impossible: false,
}, },
}; };
Ok(Self { Ok(Self::new(
id, id,
destroyed: Cell::new(false), client,
client: client.clone(),
rect: Rect::new_sized_saturating(0, 0, width, height),
format, format,
dmabuf: None, width,
render_ctx_version: Cell::new(client.state.render_ctx_version.get()), height,
storage: RefCell::new(Some(WlBufferStorage::Shm { None,
Some(WlBufferStorage::Shm {
dmabuf_buffer_params, dmabuf_buffer_params,
mem, mem,
stride, stride,
})), }),
shm: true, true,
width, None,
height, ))
tracker: Default::default(),
color: None,
})
} }
pub fn new_single_pixel( pub fn new_single_pixel(
@ -178,22 +196,18 @@ impl WlBuffer {
g: u32, g: u32,
b: u32, b: u32,
a: u32, a: u32,
) -> Self { ) -> Rc<Self> {
Self { Self::new(
id, id,
destroyed: Cell::new(false), client,
client: client.clone(), ARGB8888,
rect: Rect::new_sized_saturating(0, 0, 1, 1), 1,
format: ARGB8888, 1,
dmabuf: None, None,
render_ctx_version: Cell::new(client.state.render_ctx_version.get()), None,
storage: RefCell::new(None), false,
shm: false, Some([r, g, b, a]),
width: 1, )
height: 1,
tracker: Default::default(),
color: Some([r, g, b, a]),
}
} }
pub fn handle_gfx_context_change(&self, surface: Option<&WlSurface>) { pub fn handle_gfx_context_change(&self, surface: Option<&WlSurface>) {

View file

@ -166,13 +166,7 @@ impl WlDrmRequestHandler for WlDrm {
} }
} }
let img = ctx.dmabuf_img(&dmabuf)?; let img = ctx.dmabuf_img(&dmabuf)?;
let buffer = Rc::new(WlBuffer::new_dmabuf( let buffer = WlBuffer::new_dmabuf(req.id, &self.client, format, dmabuf, &img);
req.id,
&self.client,
format,
dmabuf,
&img,
));
track!(self.client, buffer); track!(self.client, buffer);
self.client.add_client_obj(&buffer)?; self.client.add_client_obj(&buffer)?;
Ok(()) Ok(())

View file

@ -62,7 +62,7 @@ impl WlShmPoolRequestHandler for WlShmPool {
if req.height < 0 || req.width < 0 || req.stride < 0 || req.offset < 0 { if req.height < 0 || req.width < 0 || req.stride < 0 || req.offset < 0 {
return Err(WlShmPoolError::NegativeParameters); return Err(WlShmPoolError::NegativeParameters);
} }
let buffer = Rc::new(WlBuffer::new_shm( let buffer = WlBuffer::new_shm(
req.id, req.id,
&self.client, &self.client,
req.offset as usize, req.offset as usize,
@ -72,7 +72,7 @@ impl WlShmPoolRequestHandler for WlShmPool {
format, format,
&self.mem.get(), &self.mem.get(),
None, None,
)?); )?;
track!(self.client, buffer); track!(self.client, buffer);
self.client.add_client_obj(&buffer)?; self.client.add_client_obj(&buffer)?;
Ok(()) Ok(())

View file

@ -76,14 +76,7 @@ impl WpSinglePixelBufferManagerV1RequestHandler for WpSinglePixelBufferManagerV1
req: CreateU32RgbaBuffer, req: CreateU32RgbaBuffer,
_slf: &Rc<Self>, _slf: &Rc<Self>,
) -> Result<(), Self::Error> { ) -> Result<(), Self::Error> {
let buffer = Rc::new(WlBuffer::new_single_pixel( let buffer = WlBuffer::new_single_pixel(req.id, &self.client, req.r, req.g, req.b, req.a);
req.id,
&self.client,
req.r,
req.g,
req.b,
req.a,
));
track!(self.client, buffer); track!(self.client, buffer);
self.client.add_client_obj(&buffer)?; self.client.add_client_obj(&buffer)?;
Ok(()) Ok(())

View file

@ -125,7 +125,7 @@ impl ZwpLinuxBufferParamsV1 {
) )
.map(Rc::new) .map(Rc::new)
.map_err(ZwpLinuxBufferParamsV1Error::CreateClientMem)?; .map_err(ZwpLinuxBufferParamsV1Error::CreateClientMem)?;
Rc::new(WlBuffer::new_shm( WlBuffer::new_shm(
get_id()?, get_id()?,
&self.parent.client, &self.parent.client,
p.offset as usize, p.offset as usize,
@ -135,16 +135,10 @@ impl ZwpLinuxBufferParamsV1 {
format.format, format.format,
&client_mem, &client_mem,
Some((&p.fd, size)), Some((&p.fd, size)),
)?) )?
} else { } else {
let img = ctx.dmabuf_img(&dmabuf)?; let img = ctx.dmabuf_img(&dmabuf)?;
Rc::new(WlBuffer::new_dmabuf( WlBuffer::new_dmabuf(get_id()?, &self.parent.client, format.format, dmabuf, &img)
get_id()?,
&self.parent.client,
format.format,
dmabuf,
&img,
))
}; };
track!(self.parent.client, buffer); track!(self.parent.client, buffer);
if buffer_id.is_some() { if buffer_id.is_some() {