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

Ilia Mirkin imirkin at alum.mit.edu
Tue Jun 24 17:43:19 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>
---

v1 -> v2:

  - Add forgotten copy to initialize new output with the settings of the
    previous one for vertex layer

Tobias was able to test this version with the vertex shader setting the layer
as well. (And it passed. The first version crashed his box.)

I would like to reiterate my disclaimers from the v1 commit... I don't know
much about r600, don't have the hw, and was just going on the advice of Alex
Deucher and Jerome Glisse. I largely copied how clipvertex was handled.

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 | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index b3d1998..3767e5f 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,14 @@ 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++;
+						memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
+					}
 					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