st/xorg: Flesh out EXA PrepareComposite hook a little.
authorMichel Dänzer <daenzer@vmware.com>
Fri, 25 Sep 2009 18:38:49 +0000 (20:38 +0200)
committerMichel Dänzer <daenzer@vmware.com>
Fri, 25 Sep 2009 18:38:49 +0000 (20:38 +0200)
Check that the formats are supported, and don't crash with source-only
pictures.

src/gallium/state_trackers/xorg/xorg_exa.c

index 94f4ea2c3868a5e90f9b30076c2d05dc9b02dcd9..c3fff95466567d11191e55024b1044a879448305 100644 (file)
@@ -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
 }