Mesa (master): st/xa: Various fixes for composite.

Thomas Hellstrom thomash at kemper.freedesktop.org
Mon Jul 4 08:32:36 UTC 2011


Module: Mesa
Branch: master
Commit: ab3587f70d9af5eada0c52defe1de13d77f556a6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ab3587f70d9af5eada0c52defe1de13d77f556a6

Author: Thomas Hellstrom <thellstrom at vmware.com>
Date:   Thu Jun 23 11:15:59 2011 +0200

st/xa: Various fixes for composite.

Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>

---

 src/gallium/state_trackers/xa/xa_composite.c |   32 ++++++++++++++-----------
 src/gallium/state_trackers/xa/xa_composite.h |   11 ++++++++-
 src/gallium/state_trackers/xa/xa_symbols     |    2 +-
 3 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/gallium/state_trackers/xa/xa_composite.c b/src/gallium/state_trackers/xa/xa_composite.c
index b307284..5389af6 100644
--- a/src/gallium/state_trackers/xa/xa_composite.c
+++ b/src/gallium/state_trackers/xa/xa_composite.c
@@ -111,7 +111,7 @@ blend_for_op(struct xa_composite_blend *blend,
      */
 
     if (dst_pic &&
-	xa_format_a(xa_surface_format(dst_pic->srf)) == 0 &&
+	xa_format_a(dst_pic->pict_format) == 0 &&
 	blend->alpha_dst) {
 	if (blend->rgb_src == PIPE_BLENDFACTOR_DST_ALPHA)
 	    blend->rgb_src = PIPE_BLENDFACTOR_ONE;
@@ -125,7 +125,7 @@ blend_for_op(struct xa_composite_blend *blend,
      * channels multiplied by the source picture's alpha.
      */
     if (mask_pic && mask_pic->component_alpha &&
-	xa_format_rgb(xa_surface_format(mask_pic->srf)) &&
+	xa_format_rgb(mask_pic->pict_format) &&
 	blend->alpha_src) {
 	if (blend->rgb_dst == PIPE_BLENDFACTOR_SRC_ALPHA) {
 	    blend->rgb_dst = PIPE_BLENDFACTOR_SRC_COLOR;
@@ -184,34 +184,34 @@ xa_is_filter_accelerated(struct xa_picture *pic)
 }
 
 int
-xa_composite_is_accelerated(const struct xa_composite *comp)
+xa_composite_check_accelerated(const struct xa_composite *comp)
 {
     struct xa_composite_blend blend;
     struct xa_picture *src_pic = comp->src;
 
     if (!xa_is_filter_accelerated(src_pic) ||
 	!xa_is_filter_accelerated(comp->mask)) {
-	return 0;
+	return XA_ERR_INVAL;
     }
 
 
     if (src_pic->src_pict) {
 	if (src_pic->src_pict->type != xa_src_pict_solid_fill)
-	    return 0;
+	    return XA_ERR_INVAL;
     }
 
     if (blend_for_op(&blend, comp->op, comp->src, comp->mask, comp->dst)) {
 	struct xa_picture *mask = comp->mask;
 	if (mask && mask->component_alpha &&
-	    xa_format_rgb(xa_surface_format(mask->srf))) {
+	    xa_format_rgb(mask->pict_format)) {
 	    if (blend.alpha_src && blend.rgb_src != PIPE_BLENDFACTOR_ZERO) {
-		return 0;
+		return XA_ERR_INVAL;
 	    }
 	}
 
-	return 1;
+	return XA_ERR_NONE;
     }
-    return 0;
+    return XA_ERR_INVAL;
 }
 
 static void
@@ -247,11 +247,14 @@ picture_format_fixups(struct xa_picture *src_pic,
     enum xa_formats src_hw_format, src_pic_format;
     enum xa_surface_type src_hw_type, src_pic_type;
 
+    if (!src)
+	return 0;
+
     src_hw_format = xa_surface_format(src);
     src_pic_format = src_pic->pict_format;
 
-    if (src_hw_format == src_pic_format) {
-	if (src_pic->pict_format == xa_format_a8) {
+    if (!src || src_hw_format == src_pic_format) {
+	if (src_pic_format == xa_format_a8) {
 	    if (mask)
 		return FS_MASK_LUMINANCE;
 	    else if (dst_pic->pict_format != xa_format_a8) {
@@ -279,8 +282,8 @@ picture_format_fixups(struct xa_picture *src_pic,
     if (!swizzle && (src_hw_type != src_pic_type))
 	return 0;
 
-    set_alpha = (xa_format_type_is_color(src_hw_type) &&
-		 xa_format_a(src_hw_type) == 0);
+    set_alpha = (xa_format_type_is_color(src_pic_format) &&
+		 xa_format_a(src_pic_type) == 0);
 
     if (set_alpha)
 	ret |= mask ? FS_MASK_SET_ALPHA : FS_SRC_SET_ALPHA;
@@ -442,6 +445,7 @@ xa_composite_prepare(struct xa_context *ctx,
 	renderer_begin_solid(ctx);
     } else {
 	renderer_begin_textures(ctx);
+	ctx->comp = comp;
     }
 
     xa_surface_psurf_destroy(dst_srf);
@@ -463,7 +467,7 @@ void xa_composite_rect(struct xa_context *ctx,
 
 	if (comp->src->has_transform)
 	    src_matrix = comp->src->transform;
-	if (comp->mask->has_transform)
+	if (comp->mask && comp->mask->has_transform)
 	    mask_matrix = comp->mask->transform;
 
 	renderer_texture(ctx, pos, width, height,
diff --git a/src/gallium/state_trackers/xa/xa_composite.h b/src/gallium/state_trackers/xa/xa_composite.h
index 63174a4..d16ef89 100644
--- a/src/gallium/state_trackers/xa/xa_composite.h
+++ b/src/gallium/state_trackers/xa/xa_composite.h
@@ -103,6 +103,7 @@ struct xa_picture {
 struct xa_composite {
     struct xa_picture *src, *mask, *dst;
     int op;
+    int no_solid;
 };
 
 struct xa_composite_allocation {
@@ -117,10 +118,18 @@ struct xa_composite_allocation {
 
 extern const struct xa_composite_allocation *
 xa_composite_allocation(void);
+
+/*
+ * This function checks most things except the format of the hardware
+ * surfaces, since they are generally not available at the time this
+ * function is called. Returns usual XA error codes.
+ */
 extern int
-xa_composite_is_accelerated(const struct xa_composite *comp);
+xa_composite_check_accelerated(const struct xa_composite *comp);
+
 extern int
 xa_composite_prepare(struct xa_context *ctx, const struct xa_composite *comp);
+
 extern void
 xa_composite_rect(struct xa_context *ctx,
 		  int srcX, int srcY, int maskX, int maskY,
diff --git a/src/gallium/state_trackers/xa/xa_symbols b/src/gallium/state_trackers/xa/xa_symbols
index 7fa6c94..f1eabea 100644
--- a/src/gallium/state_trackers/xa/xa_symbols
+++ b/src/gallium/state_trackers/xa/xa_symbols
@@ -22,7 +22,7 @@ xa_solid_prepare
 xa_solid
 xa_solid_done
 xa_composite_allocation
-xa_composite_is_accelerated
+xa_composite_check_accelerated
 xa_composite_prepare
 xa_composite_rect
 xa_composite_done




More information about the mesa-commit mailing list