`PixmanTexture` is not `Send`
Might as well have an issue for this.
PixmanTexture not being Send makes it impossible to use with MemoryRenderBuffer (as I noticed in https://github.com/Smithay/smithay/pull/1497), and is otherwise awkward.
Looking at pixman's implementation, pixman_image_t is not thread safe since it is ref-counted. In a way that isn't thread-safe. pixman_image_ref isn't currently bound by the pixman crate. But it is used once internally in pixman: for pixman_image_set_alpha_map.
I think it should be safe to Send a pixman image that has a reference count of 1, and if it has an alpha map, that also has a reference count of 1.
I see a couple ways to achieve this:
-
PixmanTexturecouldunsafe impl Send. It can no longer implementFrom<pixman::Image<'static, 'static>>, but could offer anunsafefunction that mentions the reference count requirement.-
pixmandoesn't provide accessors for the reference count or alpha map, so we can't assert those, to make it safe.
-
- The
pixmancrate could do the same thing internally, instead.pixman::Image::set_alpha_mapwill have to be changed to take ownership of the alpha map (so the ref count goes up to two, then it drops the first reference).pixman::Image::from_ptrwill have to mention the same restriction.- Undesirable if anything using
pixmanwould want to make use of the reference counting. Though other thanset_alpha_map, it could just wrap in anRc, so it's not that bad.- It could also define a
Sendtype and a cloneable non-Sendtype, but that gets a bit complicated.
- It could also define a
- Undesirable if anything using
It seems much cleaner to implement this in the pixman crate, if it's okay to have such a restriction there. So https://github.com/cmeissl/pixman-rs/pull/18 makes the changes I think are necessary for this.
Since PixmanRenderer internally contains a solid PixmanImage this also makes DrmCompositor non-Send, if renderer_pixman is enabled, as it prefers pixman for cursor images.