[Xorg] Composite and ABI stability

Soeren Sandmann sandmann at daimi.au.dk
Fri Aug 6 11:33:19 PDT 2004


In bug 990, Eric Anholt reports that X server compiled with COMPOSITE
produce wrong colors and suspects that this is cause alphaMask and
alphaOffset in Visuals are not initialized.

This is correct; modfiying the i830 driver to initialize those fields
does make the problem go away. However, there is a bigger problem than
that:

typedef struct _Visual {
    VisualID		vid;
    short		class;
    short		bitsPerRGBValue;
    short		ColormapEntries;
    short		nplanes;/* = log2 (ColormapEntries). This does not
				 * imply that the screen has this many planes.
				 * it may have more or fewer */
    unsigned long	redMask, greenMask, blueMask;
    int			offsetRed, offsetGreen, offsetBlue;
#ifdef COMPOSITE
    unsigned long	alphaMask;
    int			offsetAlpha;
#endif
  } VisualRec;


The two added fields break binary compatibility because drivers are
passed arrays of Visuals though screens and are expected to initialize
them. There is a similar problem with Pixmaps which also get two
additional fields. 

If we are guaranteeing binary compatibility with existing drivers,
this has to be done in a different way.

Some possible solutions:

        1. In compinit.c simply initialzie all the existing alpha
           masks to 0. This will break compatibility and prevent
           hardware from advertising its own alpha visuals

        2. Fix all drivers to initialize the fields properly. This
           will break compatibility in the Composite case. 

        3. Rework the way composite has been integrated to now change
           the size of Visuals and Pixmaps and make composite 
           responsible for initializing the new fields.

To me, 3 seems the right solution, but I could be wrong.


Søren



More information about the xorg mailing list