[Mesa-dev] [PATCH] r600g: allow viewport index/layer to be sent to fs

Ilia Mirkin imirkin at alum.mit.edu
Tue Jun 24 16:23:20 PDT 2014


In order to support ARB_fragment_layer_viewport, we need to explicitly
send these along to the fragment shader, since it has no other way to
retrieve them.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
Tested-by: Tobias Droste <tdroste at gmx.de>
---

Note: I have no knowledge of how r600 works, this is all written based on
advice given to me in #radeon by Alex Deucher and Jermoe Glisse. Basically
looked at how clipvertex was being handled, and copied that. Tobias says that
my piglit tests pass now. (There is no write-gl_Layer-in-vs test yet, I'll
make that later. All the existing tests just write from GS.)

It's unclear to me whether these outputs will be eliminated in the
(overwhelmingly common) case where the fragment shader does not actually
consume them, but I was told they would be.

 src/gallium/drivers/r600/r600_shader.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index b3d1998..3a18656 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -498,8 +498,6 @@ static int r600_spi_sid(struct r600_shader_io * io)
 	if (name == TGSI_SEMANTIC_POSITION ||
 	    name == TGSI_SEMANTIC_PSIZE ||
 	    name == TGSI_SEMANTIC_EDGEFLAG ||
-	    name == TGSI_SEMANTIC_LAYER ||
-	    name == TGSI_SEMANTIC_VIEWPORT_INDEX ||
 	    name == TGSI_SEMANTIC_FACE)
 		index = 0;
 	else {
@@ -1337,6 +1335,12 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
 			ctx.shader->vs_out_point_size = 1;
 			break;
 		case TGSI_SEMANTIC_LAYER:
+			if (out->spi_sid) {
+				/* duplicate it as PARAM to pass to the pixel shader */
+				output.array_base = next_param++;
+				r600_bytecode_add_output(ctx.bc, &output);
+				last_exp_param = ctx.bc->cf_last;
+			}
 			output.array_base = 61;
 			if (next_clip_pos == 61)
 				next_clip_pos = 62;
@@ -1349,6 +1353,12 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
 			ctx.shader->vs_out_layer = 1;
 			break;
 		case TGSI_SEMANTIC_VIEWPORT_INDEX:
+			if (out->spi_sid) {
+				/* duplicate it as PARAM to pass to the pixel shader */
+				output.array_base = next_param++;
+				r600_bytecode_add_output(ctx.bc, &output);
+				last_exp_param = ctx.bc->cf_last;
+			}
 			output.array_base = 61;
 			if (next_clip_pos == 61)
 				next_clip_pos = 62;
@@ -2016,6 +2026,13 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 					pos_emitted = true;
 					break;
 				case TGSI_SEMANTIC_LAYER:
+					/* spi_sid is 0 for outputs that are
+					 * not consumed by PS */
+					if (shader->output[i].spi_sid) {
+						output[j].array_base = next_param_base++;
+						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
+						j++;
+					}
 					output[j].array_base = 61;
 					output[j].swizzle_x = 7;
 					output[j].swizzle_y = 7;
-- 
1.8.5.5



More information about the mesa-dev mailing list