diff options
author | Zack Rusin <[email protected]> | 2009-08-25 13:22:20 -0400 |
---|---|---|
committer | Zack Rusin <[email protected]> | 2009-08-25 13:23:08 -0400 |
commit | c7653a83330e5ea63ad3a566da15155e216c6cb4 (patch) | |
tree | f77657ca181cddbc8701bfb276af1a2aca3e9b8b | |
parent | c3374bf97ecd82b915fb29c7c04951e2b75d4dbc (diff) |
exa: check whether the op is accelerated
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_composite.c | 57 | ||||
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_exa_tgsi.c | 21 |
2 files changed, 57 insertions, 21 deletions
diff --git a/src/gallium/state_trackers/xorg/xorg_composite.c b/src/gallium/state_trackers/xorg/xorg_composite.c index 05143ad11a7..bf9c82a7074 100644 --- a/src/gallium/state_trackers/xorg/xorg_composite.c +++ b/src/gallium/state_trackers/xorg/xorg_composite.c @@ -32,11 +32,68 @@ static const struct xorg_composite_blend xorg_blends[] = { PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA }, }; +struct acceleration_info { + int op : 16; + int with_mask : 1; + int component_alpha : 1; +}; +static const struct acceleration_info accelerated_ops[] = { + {PictOpClear, 1, 0}, + {PictOpSrc, 1, 0}, + {PictOpDst, 1, 0}, + {PictOpOver, 1, 0}, + {PictOpOverReverse, 1, 0}, + {PictOpIn, 1, 0}, + {PictOpInReverse, 1, 0}, + {PictOpOut, 1, 0}, + {PictOpOutReverse, 1, 0}, + {PictOpAtop, 1, 0}, + {PictOpAtopReverse, 1, 0}, + {PictOpXor, 1, 0}, + {PictOpAdd, 1, 0}, + {PictOpSaturate, 1, 0}, +}; + +static void +draw_texture(struct exa_context *exa) +{ +#if 0 + if (buf) { + util_draw_vertex_buffer(pipe, buf, 0, + PIPE_PRIM_TRIANGLE_FAN, + 4, /* verts */ + 2); /* attribs/vert */ + + pipe_buffer_reference(&buf, NULL); + } +#endif +} + boolean xorg_composite_accelerated(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) { + unsigned i; + unsigned accel_ops_count = + sizeof(accelerated_ops)/sizeof(struct acceleration_info); + + if (pSrcPicture) { + /* component alpha not supported */ + if (pSrcPicture->componentAlpha) + return FALSE; + /* fills not supported */ + if (pSrcPicture->pSourcePict) + return FALSE; + } + + for (i = 0; i < accel_ops_count; ++i) { + if (op == accelerated_ops[i].op) { + if (pMaskPicture && !accelerated_ops[i].with_mask) + return FALSE; + return TRUE; + } + } return FALSE; } diff --git a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c index 85451e40343..9896d067b24 100644 --- a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c +++ b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c @@ -33,33 +33,12 @@ struct shader_id { * IN[2] = pos mask * CONST[0] = (0, 0, 0, 1) */ -struct xorg_render_ops_tgsi { - int op; -}; - static const char over_op[] = "SUB TEMP[3], CONST[0].wwww, TEMP[1].wwww\n" "MUL TEMP[3], TEMP[0], TEMP[3]\n" "ADD TEMP[0], TEMP[3], TEMP[0]\n"; -static const struct xorg_render_ops_tgsi ops_map[] = { - {PictOpClear}, - {PictOpSrc}, - {PictOpDst}, - {PictOpOver}, - {PictOpOverReverse}, - {PictOpIn}, - {PictOpInReverse}, - {PictOpOut}, - {PictOpOutReverse}, - {PictOpAtop}, - {PictOpAtopReverse}, - {PictOpXor}, - {PictOpAdd}, - {PictOpSaturate}, -}; - static INLINE void create_preamble(struct ureg_program *ureg) |