[Mesa-dev] [PATCH 09/20] radeonsi: implement GL_SAMPLE_ALPHA_TO_ONE

Marek Olšák maraeo at gmail.com
Wed Aug 7 17:20:49 PDT 2013


---
 src/gallium/drivers/radeonsi/radeonsi_pipe.h   |  1 +
 src/gallium/drivers/radeonsi/radeonsi_shader.c | 14 ++++++++++++++
 src/gallium/drivers/radeonsi/radeonsi_shader.h |  1 +
 src/gallium/drivers/radeonsi/si_state.c        | 12 ++++++++++++
 src/gallium/drivers/radeonsi/si_state.h        |  3 ++-
 5 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.h b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
index fc02e38..d2e8831 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
@@ -146,6 +146,7 @@ struct r600_context {
 	struct si_vertex_element	*vertex_elements;
 	struct pipe_framebuffer_state	framebuffer;
 	unsigned			fb_log_samples;
+	unsigned			fb_cb0_is_integer;
 	unsigned			pa_sc_line_stipple;
 	unsigned			pa_su_sc_mode_cntl;
 	/* for saving when using blitter */
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index fee6262..18dde61 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -561,6 +561,17 @@ static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
 	}
 }
 
+static void si_alpha_to_one(struct lp_build_tgsi_context *bld_base,
+			    unsigned index)
+{
+	struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
+
+	/* set alpha to one */
+	LLVMBuildStore(bld_base->base.gallivm->builder,
+		       bld_base->base.one,
+		       si_shader_ctx->radeon_bld.soa.outputs[index][3]);
+}
+
 static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context * bld_base,
 				    unsigned index)
 {
@@ -703,6 +714,9 @@ handle_semantic:
 					param_count++;
 				} else {
 					target = V_008DFC_SQ_EXP_MRT + color_count;
+					if (si_shader_ctx->shader->key.ps.alpha_to_one) {
+						si_alpha_to_one(bld_base, index);
+					}
 					if (color_count == 0 &&
 					    si_shader_ctx->shader->key.ps.alpha_func != PIPE_FUNC_ALWAYS)
 						si_alpha_test(bld_base, index);
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h
index 60a48f4..051ef1f 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h
@@ -123,6 +123,7 @@ union si_shader_key {
 		unsigned	color_two_side:1;
 		unsigned	alpha_func:3;
 		unsigned	flatshade:1;
+		unsigned	alpha_to_one:1;
 		float		alpha_ref;
 	} ps;
 	struct {
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 4036d07..90c31de 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -255,6 +255,8 @@ static void *si_create_blend_state_mode(struct pipe_context *ctx,
 	if (blend == NULL)
 		return NULL;
 
+	blend->alpha_to_one = state->alpha_to_one;
+
 	color_control = S_028808_MODE(mode);
 	if (state->logicop_enable) {
 		color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4));
@@ -520,6 +522,7 @@ static void *si_create_rs_state(struct pipe_context *ctx,
 	}
 
 	rs->two_side = state->light_twoside;
+	rs->multisample_enable = state->multisample;
 	rs->clip_plane_enable = state->clip_plane_enable;
 
 	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
@@ -2247,6 +2250,8 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
 
 	si_set_msaa_state(rctx, pm4, nr_samples);
 	rctx->fb_log_samples = util_logbase2(nr_samples);
+	rctx->fb_cb0_is_integer = state->nr_cbufs &&
+				  util_format_is_pure_integer(state->cbufs[0]->format);
 
 	si_pm4_set_state(rctx, framebuffer, pm4);
 	si_update_fb_rs_state(rctx);
@@ -2277,9 +2282,16 @@ static INLINE void si_shader_selector_key(struct pipe_context *ctx,
 		if (sel->fs_write_all)
 			key->ps.nr_cbufs = rctx->framebuffer.nr_cbufs;
 		key->ps.export_16bpc = rctx->export_16bpc;
+
 		if (rctx->queued.named.rasterizer) {
 			key->ps.color_two_side = rctx->queued.named.rasterizer->two_side;
 			key->ps.flatshade = rctx->queued.named.rasterizer->flatshade;
+
+			if (rctx->queued.named.blend) {
+				key->ps.alpha_to_one = rctx->queued.named.blend->alpha_to_one &&
+						       rctx->queued.named.rasterizer->multisample_enable &&
+						       !rctx->fb_cb0_is_integer;
+			}
 		}
 		if (rctx->queued.named.dsa) {
 			key->ps.alpha_func = rctx->queued.named.dsa->alpha_func;
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
index ebe8c3f..96c1934 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -32,7 +32,7 @@
 struct si_state_blend {
 	struct si_pm4_state	pm4;
 	uint32_t		cb_target_mask;
-	uint32_t		cb_color_control;
+	bool			alpha_to_one;
 };
 
 struct si_state_viewport {
@@ -44,6 +44,7 @@ struct si_state_rasterizer {
 	struct si_pm4_state	pm4;
 	bool			flatshade;
 	bool			two_side;
+	bool			multisample_enable;
 	unsigned		sprite_coord_enable;
 	unsigned		pa_sc_line_stipple;
 	unsigned		pa_su_sc_mode_cntl;
-- 
1.8.1.2



More information about the mesa-dev mailing list