diff --git a/src/ifs/wl_buffer.rs b/src/ifs/wl_buffer.rs index 127c656c..eda76c12 100644 --- a/src/ifs/wl_buffer.rs +++ b/src/ifs/wl_buffer.rs @@ -73,16 +73,18 @@ impl WlBuffer { self.shm } - pub fn new_dmabuf( + fn new( id: WlBufferId, client: &Rc, format: &'static Format, - dmabuf: DmaBuf, - img: &Rc, - ) -> Self { - let width = img.width(); - let height = img.height(); - Self { + width: i32, + height: i32, + dmabuf: Option, + storage: Option, + shm: bool, + color: Option<[u32; 4]>, + ) -> Rc { + Rc::new(Self { id, destroyed: Cell::new(false), client: client.clone(), @@ -90,17 +92,37 @@ impl WlBuffer { format, width, height, - dmabuf: Some(dmabuf), + dmabuf, 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, + format: &'static Format, + dmabuf: DmaBuf, + img: &Rc, + ) -> Rc { + Self::new( + id, + client, + format, + img.width(), + img.height(), + Some(dmabuf), + Some(WlBufferStorage::Dmabuf { img: img.clone(), tex: None, fb: None, - })), - shm: false, - tracker: Default::default(), - color: None, - } + }), + false, + None, + ) } #[expect(clippy::too_many_arguments)] @@ -114,7 +136,7 @@ impl WlBuffer { format: &'static Format, mem: &Rc, udmabuf: Option<(&Rc, usize)>, - ) -> Result { + ) -> Result, WlBufferError> { let bytes = stride as u64 * height as u64; let required = bytes + offset as u64; if required > mem.len() as u64 { @@ -150,25 +172,21 @@ impl WlBuffer { tex_impossible: false, }, }; - Ok(Self { + Ok(Self::new( id, - destroyed: Cell::new(false), - client: client.clone(), - rect: Rect::new_sized_saturating(0, 0, width, height), + client, format, - dmabuf: None, - render_ctx_version: Cell::new(client.state.render_ctx_version.get()), - storage: RefCell::new(Some(WlBufferStorage::Shm { + width, + height, + None, + Some(WlBufferStorage::Shm { dmabuf_buffer_params, mem, stride, - })), - shm: true, - width, - height, - tracker: Default::default(), - color: None, - }) + }), + true, + None, + )) } pub fn new_single_pixel( @@ -178,22 +196,18 @@ impl WlBuffer { g: u32, b: u32, a: u32, - ) -> Self { - Self { + ) -> Rc { + Self::new( id, - destroyed: Cell::new(false), - client: client.clone(), - rect: Rect::new_sized_saturating(0, 0, 1, 1), - format: ARGB8888, - dmabuf: None, - render_ctx_version: Cell::new(client.state.render_ctx_version.get()), - storage: RefCell::new(None), - shm: false, - width: 1, - height: 1, - tracker: Default::default(), - color: Some([r, g, b, a]), - } + client, + ARGB8888, + 1, + 1, + None, + None, + false, + Some([r, g, b, a]), + ) } pub fn handle_gfx_context_change(&self, surface: Option<&WlSurface>) { diff --git a/src/ifs/wl_drm.rs b/src/ifs/wl_drm.rs index c26e4512..624cf89d 100644 --- a/src/ifs/wl_drm.rs +++ b/src/ifs/wl_drm.rs @@ -166,13 +166,7 @@ impl WlDrmRequestHandler for WlDrm { } } let img = ctx.dmabuf_img(&dmabuf)?; - let buffer = Rc::new(WlBuffer::new_dmabuf( - req.id, - &self.client, - format, - dmabuf, - &img, - )); + let buffer = WlBuffer::new_dmabuf(req.id, &self.client, format, dmabuf, &img); track!(self.client, buffer); self.client.add_client_obj(&buffer)?; Ok(()) diff --git a/src/ifs/wl_shm_pool.rs b/src/ifs/wl_shm_pool.rs index 8f24db96..fbfec69b 100644 --- a/src/ifs/wl_shm_pool.rs +++ b/src/ifs/wl_shm_pool.rs @@ -62,7 +62,7 @@ impl WlShmPoolRequestHandler for WlShmPool { if req.height < 0 || req.width < 0 || req.stride < 0 || req.offset < 0 { return Err(WlShmPoolError::NegativeParameters); } - let buffer = Rc::new(WlBuffer::new_shm( + let buffer = WlBuffer::new_shm( req.id, &self.client, req.offset as usize, @@ -72,7 +72,7 @@ impl WlShmPoolRequestHandler for WlShmPool { format, &self.mem.get(), None, - )?); + )?; track!(self.client, buffer); self.client.add_client_obj(&buffer)?; Ok(()) diff --git a/src/ifs/wp_single_pixel_buffer_manager_v1.rs b/src/ifs/wp_single_pixel_buffer_manager_v1.rs index 007735e3..7a5b321c 100644 --- a/src/ifs/wp_single_pixel_buffer_manager_v1.rs +++ b/src/ifs/wp_single_pixel_buffer_manager_v1.rs @@ -76,14 +76,7 @@ impl WpSinglePixelBufferManagerV1RequestHandler for WpSinglePixelBufferManagerV1 req: CreateU32RgbaBuffer, _slf: &Rc, ) -> Result<(), Self::Error> { - let buffer = Rc::new(WlBuffer::new_single_pixel( - req.id, - &self.client, - req.r, - req.g, - req.b, - req.a, - )); + let buffer = WlBuffer::new_single_pixel(req.id, &self.client, req.r, req.g, req.b, req.a); track!(self.client, buffer); self.client.add_client_obj(&buffer)?; Ok(()) diff --git a/src/ifs/zwp_linux_buffer_params_v1.rs b/src/ifs/zwp_linux_buffer_params_v1.rs index f9e62719..269cd02c 100644 --- a/src/ifs/zwp_linux_buffer_params_v1.rs +++ b/src/ifs/zwp_linux_buffer_params_v1.rs @@ -125,7 +125,7 @@ impl ZwpLinuxBufferParamsV1 { ) .map(Rc::new) .map_err(ZwpLinuxBufferParamsV1Error::CreateClientMem)?; - Rc::new(WlBuffer::new_shm( + WlBuffer::new_shm( get_id()?, &self.parent.client, p.offset as usize, @@ -135,16 +135,10 @@ impl ZwpLinuxBufferParamsV1 { format.format, &client_mem, Some((&p.fd, size)), - )?) + )? } else { let img = ctx.dmabuf_img(&dmabuf)?; - Rc::new(WlBuffer::new_dmabuf( - get_id()?, - &self.parent.client, - format.format, - dmabuf, - &img, - )) + WlBuffer::new_dmabuf(get_id()?, &self.parent.client, format.format, dmabuf, &img) }; track!(self.parent.client, buffer); if buffer_id.is_some() {