From: Michel Dänzer Date: Fri, 25 Sep 2009 18:38:49 +0000 (+0200) Subject: st/xorg: Flesh out EXA PrepareComposite hook a little. X-Git-Tag: 062012170305~16161^2~144 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac2e0ddcd8f33505aee20e94dd64a804812f07fb;p=profile%2Fivi%2Fmesa.git st/xorg: Flesh out EXA PrepareComposite hook a little. Check that the formats are supported, and don't crash with source-only pictures. --- diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c index 94f4ea2..c3fff95 100644 --- a/src/gallium/state_trackers/xorg/xorg_exa.c +++ b/src/gallium/state_trackers/xorg/xorg_exa.c @@ -438,17 +438,43 @@ ExaPrepareComposite(int op, PicturePtr pSrcPicture, ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; modesettingPtr ms = modesettingPTR(pScrn); struct exa_context *exa = ms->exa; + struct exa_pixmap_priv *priv; debug_printf("ExaPrepareComposite\n"); + priv = exaGetPixmapDriverPrivate(pDst); + if (!priv || !priv->tex || + !exa->scrn->is_format_supported(exa->scrn, priv->tex->format, + priv->tex->target, + PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) + return FALSE; + + if (pSrc) { + priv = exaGetPixmapDriverPrivate(pSrc); + if (!priv || !priv->tex || + !exa->scrn->is_format_supported(exa->scrn, priv->tex->format, + priv->tex->target, + PIPE_TEXTURE_USAGE_SAMPLER, 0)) + return FALSE; + } + + if (pMask) { + priv = exaGetPixmapDriverPrivate(pMask); + if (!priv || !priv->tex || + !exa->scrn->is_format_supported(exa->scrn, priv->tex->format, + priv->tex->target, + PIPE_TEXTURE_USAGE_SAMPLER, 0)) + return FALSE; + } + #if DISABLE_ACCEL (void) exa; return FALSE; #else return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture, pDstPicture, - exaGetPixmapDriverPrivate(pSrc), - exaGetPixmapDriverPrivate(pMask), + pSrc ? exaGetPixmapDriverPrivate(pSrc) : NULL, + pMask ? exaGetPixmapDriverPrivate(pMask) : NULL, exaGetPixmapDriverPrivate(pDst)); #endif }