exa: check whether the op is accelerated
authorZack Rusin <zackr@vmware.com>
Tue, 25 Aug 2009 17:22:20 +0000 (13:22 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 25 Aug 2009 17:23:08 +0000 (13:23 -0400)
src/gallium/state_trackers/xorg/xorg_composite.c
src/gallium/state_trackers/xorg/xorg_exa_tgsi.c

index 05143ad11a7d59d1f5e40524fd3df2d064b8730e..bf9c82a70746076bd42b870a5abac9af33bc5391 100644 (file)
@@ -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;
 }
 
index 85451e40343c64ca8b758bc821eff5ba6dd07d5a..9896d067b2400ae994e48c5170eb4af456c80fa9 100644 (file)
@@ -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)