[cairo] More on the future of cairo's X11 backends
bryce at osg.samsung.com
Fri Jan 27 01:55:05 UTC 2017
On Wed, Jan 25, 2017 at 12:02:47PM +0100, Uli Schlachter wrote:
> a while ago  I proposed merging the implementations of cairo-xcb and
> cairo-xlib into one. Back then there were concerns about a performance
> loss  and I have to admit this demotivated me a bit. I don't want to
> invest lots of work just to figure out that in the end the result is too
Sympathes, performance worries have held me back on things too. :-/
But maintainability should also be a factor we need to consider for the
long term health of the project.
> Anyway, let me take a step back: There are Xlib and XCB for talking to
> an X11 server. Both are being used and for both cairo offers an API.
> There are several ways how to implement something like this:
> A) Have two completely separate backends with their own code paths.
> B) Implement one ontop of the other.
> C) Have common code and some thin wrapper around Xlib/XCB to make this work.
> D) I don't know. Did I miss a further possibility?
I suppose a degenerate possibility would be to deprecate the Xlib
backend with XCB the recommended default. Then in a later release drop
Xlib entirely. But that would break far too much code...
> Currently cairo has (A), which is bad for maintainability. The XCB
> backend started as a copy of the Xlib backend and since then the two
> diverged quite a bit. So, some things work in one, but not the other,
> some bugs are only present in one of the two etcetera.
> In 2013 I proposed (B): Use XGetXCBConnection() to get an
> xcb_connection_t out of a Display. However, this means that control of
> the X11 socket is handed back and forth between XCB and Xlib quite a
> lot(?) and thus can lead to poorer performance.
> Since I see no other possibilities, this means that (C) is left. What I
> propose is to have thin wrappers around the X11 protocol and to add
> function pointers to the cairo device struct for calling these. As an
> example, XCopyArea(device->display, ....) would be replaced with
> device->functions->copy_area(device, ....).
> For data types (Drawable vs xcb_drawable_t etc) it does not really
> matter in most cases which one is used, because both are just typedefs
> for some integer type. I would plan to use the Xlib typedef.
This seems like a sensible strategy to me.
> Something like the following:
> - Introduce these function pointers in cairo-xlib and make use of them
> - Add an xcb-xlib-backend that implements the xcb API ontop of these
> function pointers
> - Eventually remove the current cairo-xcb and cairo-xlib-xcb code and
> only leave the above.
> Of course this is all still a bit rough around the edges, but what do
> you think?
So do I understand this would (temporarily) add a third backend, that
implements this strategy, with the mid-range goal of eliminating two xcb
backends? Long term does this leave us with a single X backend we have
Props for looking at this, simplifying these codebases would eliminate
confusing options for folks.
> Q: Because it reverses the logical flow of conversation.
> A: Why is putting a reply at the top of the message frowned upon?
> cairo mailing list
> cairo at cairographics.org
More information about the cairo