[PATCH 2/7] composite: Add exception mechanism for implicit redirection policy
Jasper St. Pierre
jstpierre at mecheye.net
Tue Apr 1 06:45:14 PDT 2014
Does this mean this mean that reparenting an RGB24 visual window into an
ARGB32 visual window will only be copy-free on Xwayland and not Xorg?
On Tue, Apr 1, 2014 at 2:53 AM, Kristian Høgsberg <krh at bitplanet.net> wrote:
> Normally composite will decide to add implicit redirection when a
> window with an alternate visual is a parent of a window with a regular
> visual or vice versa. This uses extra pixmap memory and incurs an extra
> copy. This exception mechanism provides a way for a DDX to override this
> if the DDX knows that its acceleration architecture will render correctly.
>
> The relevant case is that of an RGB window reparented into a ARGB parent
> frame window. If the DDX knows that the acceleration architecture in use
> will pad the alpha channel to opaque when rendering to the RGB window,
> the implicit redirection can be avoided.
>
> This patch adds a new composite function:
>
> CompositeRegisterImplicitRedirectionException()
>
> which lets a DDX register a pair of parent and child window visuals, that
> will not be implicitly redirected even if the normal policy would have
> made that choice.
>
> Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
> Reviewed-by: Keith Packard <keithp at keithp.com>
> ---
> composite/compinit.c | 24 ++++++++++++++++++++++++
> composite/compint.h | 7 +++++++
> composite/compositeext.h | 4 ++++
> composite/compwindow.c | 18 ++++++++++++++++++
> 4 files changed, 53 insertions(+)
>
> diff --git a/composite/compinit.c b/composite/compinit.c
> index 1db9e0b..48e938f 100644
> --- a/composite/compinit.c
> +++ b/composite/compinit.c
> @@ -229,6 +229,28 @@ CompositeRegisterAlternateVisuals(ScreenPtr pScreen,
> VisualID * vids,
> return compRegisterAlternateVisuals(cs, vids, nVisuals);
> }
>
> +Bool
> +CompositeRegisterImplicitRedirectionException(ScreenPtr pScreen,
> + VisualID parentVisual,
> + VisualID winVisual)
> +{
> + CompScreenPtr cs = GetCompScreen(pScreen);
> + CompImplicitRedirectException *p;
> +
> + p = realloc(cs->implicitRedirectExceptions,
> + sizeof(p[0]) * (cs->numImplicitRedirectExceptions + 1));
> + if (p == NULL)
> + return FALSE;
> +
> + p[cs->numImplicitRedirectExceptions].parentVisual = parentVisual;
> + p[cs->numImplicitRedirectExceptions].winVisual = winVisual;
> +
> + cs->implicitRedirectExceptions = p;
> + cs->numImplicitRedirectExceptions++;
> +
> + return TRUE;
> +}
> +
> typedef struct _alternateVisual {
> int depth;
> CARD32 format;
> @@ -349,6 +371,8 @@ compScreenInit(ScreenPtr pScreen)
>
> cs->numAlternateVisuals = 0;
> cs->alternateVisuals = NULL;
> + cs->numImplicitRedirectExceptions = 0;
> + cs->implicitRedirectExceptions = NULL;
>
> if (!compAddAlternateVisuals(pScreen, cs)) {
> free(cs);
> diff --git a/composite/compint.h b/composite/compint.h
> index 12dc8b3..56b76c5 100644
> --- a/composite/compint.h
> +++ b/composite/compint.h
> @@ -119,6 +119,11 @@ typedef struct _CompOverlayClientRec {
> XID resource;
> } CompOverlayClientRec;
>
> +typedef struct _CompImplicitRedirectException {
> + XID parentVisual;
> + XID winVisual;
> +} CompImplicitRedirectException;
> +
> typedef struct _CompScreen {
> PositionWindowProcPtr PositionWindow;
> CopyWindowProcPtr CopyWindow;
> @@ -155,6 +160,8 @@ typedef struct _CompScreen {
> CloseScreenProcPtr CloseScreen;
> int numAlternateVisuals;
> VisualID *alternateVisuals;
> + int numImplicitRedirectExceptions;
> + CompImplicitRedirectException *implicitRedirectExceptions;
>
> WindowPtr pOverlayWin;
> Window overlayWid;
> diff --git a/composite/compositeext.h b/composite/compositeext.h
> index 0b148f0..b96cb1d 100644
> --- a/composite/compositeext.h
> +++ b/composite/compositeext.h
> @@ -35,6 +35,10 @@ extern _X_EXPORT Bool
> CompositeRegisterAlternateVisuals(ScreenPtr pScreen,
> VisualID * vids,
> int nVisuals);
>
> +extern _X_EXPORT Bool
> CompositeRegisterImplicitRedirectionException(ScreenPtr pScreen,
> +
> VisualID parentVisual,
> +
> VisualID winVisual);
> +
> extern _X_EXPORT RESTYPE CompositeClientWindowType;
>
> #endif /* _COMPOSITEEXT_H_ */
> diff --git a/composite/compwindow.c b/composite/compwindow.c
> index 6c24349..8824294 100644
> --- a/composite/compwindow.c
> +++ b/composite/compwindow.c
> @@ -336,6 +336,21 @@ compIsAlternateVisual(ScreenPtr pScreen, XID visual)
> }
>
> static Bool
> +compIsImplicitRedirectException(ScreenPtr pScreen,
> + XID parentVisual, XID winVisual)
> +{
> + CompScreenPtr cs = GetCompScreen(pScreen);
> + int i;
> +
> + for (i = 0; i < cs->numImplicitRedirectExceptions; i++)
> + if (cs->implicitRedirectExceptions[i].parentVisual ==
> parentVisual &&
> + cs->implicitRedirectExceptions[i].winVisual == winVisual)
> + return TRUE;
> +
> + return FALSE;
> +}
> +
> +static Bool
> compImplicitRedirect(WindowPtr pWin, WindowPtr pParent)
> {
> if (pParent) {
> @@ -343,6 +358,9 @@ compImplicitRedirect(WindowPtr pWin, WindowPtr pParent)
> XID winVisual = wVisual(pWin);
> XID parentVisual = wVisual(pParent);
>
> + if (compIsImplicitRedirectException(pScreen, parentVisual,
> winVisual))
> + return FALSE;
> +
> if (winVisual != parentVisual &&
> (compIsAlternateVisual(pScreen, winVisual) ||
> compIsAlternateVisual(pScreen, parentVisual)))
> --
> 1.9.0
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
--
Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140401/cb4b5008/attachment.html>
More information about the xorg-devel
mailing list