diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_composite.c | 96 |
1 files changed, 36 insertions, 60 deletions
diff --git a/src/gallium/state_trackers/xorg/xorg_composite.c b/src/gallium/state_trackers/xorg/xorg_composite.c index 297b6c5f5d2..e039bb12b6d 100644 --- a/src/gallium/state_trackers/xorg/xorg_composite.c +++ b/src/gallium/state_trackers/xorg/xorg_composite.c @@ -68,64 +68,48 @@ pixel_to_float4(Pixel pixel, float *color) color[3] = ((float)a) / 255.; } -struct acceleration_info { - int op : 16; -}; -static const struct acceleration_info accelerated_ops[] = { - {PictOpClear, }, - {PictOpSrc, }, - {PictOpDst, }, - {PictOpOver, }, - {PictOpOverReverse, }, - {PictOpIn, }, - {PictOpInReverse, }, - {PictOpOut, }, - {PictOpOutReverse, }, - {PictOpAtop, }, - {PictOpAtopReverse, }, - {PictOpXor, }, - {PictOpAdd, }, - {PictOpSaturate, }, -}; - -static struct xorg_composite_blend -blend_for_op(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, +static boolean +blend_for_op(struct xorg_composite_blend *blend, + int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) { const int num_blends = sizeof(xorg_blends)/sizeof(struct xorg_composite_blend); int i; - struct xorg_composite_blend blend = xorg_blends[BLEND_OP_OVER]; + boolean supported = FALSE; + + /* our default in case something goes wrong */ + *blend = xorg_blends[BLEND_OP_OVER]; for (i = 0; i < num_blends; ++i) { - if (xorg_blends[i].op == op) - blend = xorg_blends[i]; + if (xorg_blends[i].op == op) { + *blend = xorg_blends[i]; + supported = TRUE; + } } /* If there's no dst alpha channel, adjust the blend op so that we'll treat - * it as always 1. - */ + * it as always 1. */ if (pDstPicture && - PICT_FORMAT_A(pDstPicture->format) == 0 && blend.alpha_dst) { - if (blend.rgb_src == PIPE_BLENDFACTOR_DST_ALPHA) - blend.rgb_src = PIPE_BLENDFACTOR_ONE; - else if (blend.rgb_src == PIPE_BLENDFACTOR_INV_DST_ALPHA) - blend.rgb_src = PIPE_BLENDFACTOR_ZERO; + PICT_FORMAT_A(pDstPicture->format) == 0 && blend->alpha_dst) { + if (blend->rgb_src == PIPE_BLENDFACTOR_DST_ALPHA) + blend->rgb_src = PIPE_BLENDFACTOR_ONE; + else if (blend->rgb_src == PIPE_BLENDFACTOR_INV_DST_ALPHA) + blend->rgb_src = PIPE_BLENDFACTOR_ZERO; } /* If the source alpha is being used, then we should only be in a case where * the source blend factor is 0, and the source blend value is the mask - * channels multiplied by the source picture's alpha. - */ + * channels multiplied by the source picture's alpha. */ if (pMaskPicture && pMaskPicture->componentAlpha && - PICT_FORMAT_RGB(pMaskPicture->format) && blend.alpha_src) { - if (blend.rgb_dst == PIPE_BLENDFACTOR_SRC_ALPHA) { - blend.rgb_dst = PIPE_BLENDFACTOR_SRC_COLOR; - } else if (blend.rgb_dst == PIPE_BLENDFACTOR_INV_SRC_ALPHA) { - blend.rgb_dst = PIPE_BLENDFACTOR_INV_SRC_COLOR; + PICT_FORMAT_RGB(pMaskPicture->format) && blend->alpha_src) { + if (blend->rgb_dst == PIPE_BLENDFACTOR_SRC_ALPHA) { + blend->rgb_dst = PIPE_BLENDFACTOR_SRC_COLOR; + } else if (blend->rgb_dst == PIPE_BLENDFACTOR_INV_SRC_ALPHA) { + blend->rgb_dst = PIPE_BLENDFACTOR_INV_SRC_COLOR; } } - return blend; + return supported; } static INLINE int @@ -191,9 +175,7 @@ boolean xorg_composite_accelerated(int op, ScreenPtr pScreen = pDstPicture->pDrawable->pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; modesettingPtr ms = modesettingPTR(pScrn); - unsigned i; - unsigned accel_ops_count = - sizeof(accelerated_ops)/sizeof(struct acceleration_info); + struct xorg_composite_blend blend; if (!is_filter_accelerated(pSrcPicture) || !is_filter_accelerated(pMaskPicture)) { @@ -205,24 +187,18 @@ boolean xorg_composite_accelerated(int op, XORG_FALLBACK("Gradients not enabled (haven't been well tested)"); } - for (i = 0; i < accel_ops_count; ++i) { - if (op == accelerated_ops[i].op) { - struct xorg_composite_blend blend = blend_for_op(op, - pSrcPicture, - pMaskPicture, - pDstPicture); - /* Check for component alpha */ - if (pMaskPicture && pMaskPicture->componentAlpha && - PICT_FORMAT_RGB(pMaskPicture->format)) { - if (blend.alpha_src && - blend.rgb_src != PIPE_BLENDFACTOR_ZERO) { - XORG_FALLBACK("Component alpha not supported with source " - "alpha and source value blending. (op=%d)", - op); - } + if (blend_for_op(&blend, op, + pSrcPicture, pMaskPicture, pDstPicture)) { + /* Check for component alpha */ + if (pMaskPicture && pMaskPicture->componentAlpha && + PICT_FORMAT_RGB(pMaskPicture->format)) { + if (blend.alpha_src && blend.rgb_src != PIPE_BLENDFACTOR_ZERO) { + XORG_FALLBACK("Component alpha not supported with source " + "alpha and source value blending. (op=%d)", + op); } - return TRUE; } + return TRUE; } XORG_FALLBACK("Unsupported composition operation = %d", op); } @@ -236,7 +212,7 @@ bind_blend_state(struct exa_context *exa, int op, struct xorg_composite_blend blend_opt; struct pipe_blend_state blend; - blend_opt = blend_for_op(op, pSrcPicture, pMaskPicture, pDstPicture); + blend_for_op(&blend_opt, op, pSrcPicture, pMaskPicture, pDstPicture); memset(&blend, 0, sizeof(struct pipe_blend_state)); blend.blend_enable = 1; |