summaryrefslogtreecommitdiff
path: root/src/lx_exa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lx_exa.c')
-rw-r--r--src/lx_exa.c60
1 files changed, 32 insertions, 28 deletions
diff --git a/src/lx_exa.c b/src/lx_exa.c
index 6bc84ea..ef90d6b 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -48,6 +48,19 @@
#define F(x) IntToxFixed(x)
#define I(x) xFixedToInt(x)
+#define GEODE_TRACE_FALL 0
+
+#if GEODE_TRACE_FALL
+#define GEODE_FALLBACK(x) \
+do { \
+ ErrorF("%s: ", __FUNCTION__); \
+ ErrorF x; \
+ return FALSE; \
+} while (0)
+#else
+#define GEODE_FALLBACK(x) return FALSE
+#endif
+
static const struct exa_format_t
{
int exa;
@@ -532,10 +545,8 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
GeodeRec *pGeode = GEODEPTR_FROM_PICTURE(pDst);
const struct exa_format_t *srcFmt, *dstFmt;
- /* Check that the operation is supported */
-
if (op > PictOpAdd)
- return FALSE;
+ GEODE_FALLBACK(("Operation %d is not supported\n", op));
/* FIXME: Meet this conditions from the debug for PictOpAdd.
* Any Other possibilities? Add a judge for the future supplement */
@@ -551,15 +562,13 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
pDst->format == PICT_a8 && !pMsk)
return TRUE;
- /* We need the off-screen buffer to do the multipass work */
-
if (usesPasses(op)) {
if (pGeode->exaBfrOffset == 0 || !pMsk)
- return FALSE;
+ GEODE_FALLBACK(("Multipass operation requires off-screen buffer\n"));
}
if (pMsk && op == PictOpAdd)
- return FALSE;
+ GEODE_FALLBACK(("PictOpAdd with mask is not supported\n"));
/* Check that the filter matches what we support */
@@ -571,17 +580,15 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
break;
default:
- /* WE don't support bilinear or convolution filters */
- return FALSE;
+ GEODE_FALLBACK(("Bilinear or convolution filters are not supported\n"));
}
- /* We don't support any mask transforms */
if (pMsk && pMsk->transform)
- return FALSE;
+ GEODE_FALLBACK(("Mask transforms are not supported\n"));
/* XXX - don't know if we can do any hwaccel on solid fills or gradient types */
if (pSrc->pSourcePict || (pMsk && pMsk->pSourcePict))
- return FALSE;
+ GEODE_FALLBACK(("Solid fills or gradient types are not supported\n"));
/* Keep an eye out for source rotation transforms - those we can
* do something about */
@@ -590,13 +597,12 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
exaScratch.transform = NULL;
if (pSrc->transform && !lx_process_transform(pSrc))
- return FALSE;
+ GEODE_FALLBACK(("Transform operation is non-trivial\n"));
/* XXX - I don't understand PICT_a8 enough - so I'm punting */
-
if ((op != PictOpAdd) && (pSrc->format == PICT_a8 ||
pDst->format == PICT_a8))
- return FALSE;
+ GEODE_FALLBACK(("PICT_a8 as src or dst format is unsupported\n"));
if (pMsk && op != PictOpClear) {
struct blend_ops_t *opPtr = &lx_alpha_ops[op * 2];
@@ -605,21 +611,21 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
/* Direction 0 indicates src->dst, 1 indiates dst->src */
if (((direction == 0) && (pSrc->pDrawable->bitsPerPixel < 16)) ||
((direction == 1) && (pDst->pDrawable->bitsPerPixel < 16))) {
- ErrorF("Can't do mask blending with less then 16bpp\n");
+ ErrorF("Mask blending unsupported with <16bpp\n");
return FALSE;
}
- /* We can only do masks with a 8bpp or a 4bpp mask */
if (pMsk->format != PICT_a8 && pMsk->format != PICT_a4)
- return FALSE;
+ GEODE_FALLBACK(("Masks can be only done with a 8bpp or 4bpp depth\n"));
+
/* The pSrc should be 1x1 pixel if the pMsk is not zero */
if (pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1)
- return FALSE;
+ GEODE_FALLBACK(("pSrc should be 1x1 pixel if pMsk is not zero\n"));
/* FIXME: In lx_prepare_composite, there are no variables to record the
* one pixel source's width and height when the mask is not zero.
* That will lead to bigger region to render instead of one pixel in lx
* _do_composite, so we should fallback currently to avoid this */
if (!pSrc->repeat)
- return FALSE;
+ GEODE_FALLBACK(("FIXME: unzero mask might lead to bigger rendering region than 1x1 pixels\n"));
}
/* Get the formats for the source and destination */
@@ -630,7 +636,7 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
}
if ((dstFmt = lx_get_format(pDst)) == NULL) {
- ErrorF("EXA: Invalid destination format %x\n", pDst->format);
+ ErrorF("EXA: Invalid destination format %x\n", pDst->format);
return FALSE;
}
@@ -638,21 +644,19 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
/* If a mask is enabled, the alpha will come from there */
if (!pMsk && (!srcFmt->alphabits && usesSrcAlpha(op)))
- return FALSE;
+ GEODE_FALLBACK(("Operation requires src alpha, but alphabits is unset\n"));
if (!pMsk && (!dstFmt->alphabits && usesDstAlpha(op)))
- return FALSE;
-
- /* FIXME: See a way around this! */
+ GEODE_FALLBACK(("Operation requires dst alpha, but alphabits is unset\n"));
+ /* FIXME: See a way around this! */
if (srcFmt->alphabits == 0 && dstFmt->alphabits != 0)
- return FALSE;
+ GEODE_FALLBACK(("src_alphabits=0, dst_alphabits!=0\n"));
/* If this is a rotate operation, then make sure the src and dst
* formats are the same */
-
if (exaScratch.rotate != RR_Rotate_0 && srcFmt != dstFmt) {
- ErrorF("EXA: Can't rotate and convert formats at the same time\n");
+ ErrorF("EXA: Unable to rotate and convert formats at the same time\n");
return FALSE;
}
return TRUE;