Mesa (master): st/xa: Fix format conversion copy alpha channel

Thomas Hellstrom thomash at kemper.freedesktop.org
Thu Dec 15 07:29:18 UTC 2011


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

Author: Thomas Hellstrom <thellstrom at vmware.com>
Date:   Wed Dec 14 16:02:54 2011 +0100

st/xa: Fix format conversion copy alpha channel

When doing format conversion copies between a format without an
alpha channel and a format with an alpha channel, make sure the
destination alpha is set to 1.

Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob at vmware.com>

---

 src/gallium/state_trackers/xa/xa_context.c  |    4 +++-
 src/gallium/state_trackers/xa/xa_priv.h     |    5 ++++-
 src/gallium/state_trackers/xa/xa_renderer.c |    7 ++++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/gallium/state_trackers/xa/xa_context.c b/src/gallium/state_trackers/xa/xa_context.c
index 8290e0f..8da7c31 100644
--- a/src/gallium/state_trackers/xa/xa_context.c
+++ b/src/gallium/state_trackers/xa/xa_context.c
@@ -220,7 +220,9 @@ xa_copy_prepare(struct xa_context *ctx,
 	int ret = xa_ctx_srf_create(ctx, dst);
 	if (ret != XA_ERR_NONE)
 	    return ret;
-	renderer_copy_prepare(ctx, ctx->srf, src->tex);
+	renderer_copy_prepare(ctx, ctx->srf, src->tex,
+			      src->fdesc.xa_format,
+			      dst->fdesc.xa_format);
 	ctx->simple_copy = 0;
     } else
 	ctx->simple_copy = 1;
diff --git a/src/gallium/state_trackers/xa/xa_priv.h b/src/gallium/state_trackers/xa/xa_priv.h
index d00114f..de4639a 100644
--- a/src/gallium/state_trackers/xa/xa_priv.h
+++ b/src/gallium/state_trackers/xa/xa_priv.h
@@ -237,7 +237,10 @@ void renderer_bind_destination(struct xa_context *r,
 void renderer_init_state(struct xa_context *r);
 void renderer_copy_prepare(struct xa_context *r,
 			   struct pipe_surface *dst_surface,
-			   struct pipe_resource *src_texture);
+			   struct pipe_resource *src_texture,
+			   const enum xa_formats src_xa_format,
+			   const enum xa_formats dst_xa_format);
+
 void renderer_copy(struct xa_context *r, int dx,
 		   int dy,
 		   int sx,
diff --git a/src/gallium/state_trackers/xa/xa_renderer.c b/src/gallium/state_trackers/xa/xa_renderer.c
index ef762f0..5496fc0 100644
--- a/src/gallium/state_trackers/xa/xa_renderer.c
+++ b/src/gallium/state_trackers/xa/xa_renderer.c
@@ -413,7 +413,9 @@ renderer_set_constants(struct xa_context *r,
 void
 renderer_copy_prepare(struct xa_context *r,
 		      struct pipe_surface *dst_surface,
-		      struct pipe_resource *src_texture)
+		      struct pipe_resource *src_texture,
+		      const enum xa_formats src_xa_format,
+		      const enum xa_formats dst_xa_format)
 {
     struct pipe_context *pipe = r->pipe;
     struct pipe_screen *screen = pipe->screen;
@@ -474,6 +476,9 @@ renderer_copy_prepare(struct xa_context *r,
 	fs_traits |= FS_SRC_LUMINANCE;
     if (dst_surface->format == PIPE_FORMAT_L8_UNORM)
 	fs_traits |= FS_DST_LUMINANCE;
+    if (xa_format_a(dst_xa_format) != 0 &&
+	xa_format_a(src_xa_format) == 0)
+	fs_traits |= FS_SRC_SET_ALPHA;
 
     shader = xa_shaders_get(r->shaders, VS_COMPOSITE, fs_traits);
     cso_set_vertex_shader_handle(r->cso, shader.vs);




More information about the mesa-commit mailing list