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 <imir...@alum.mit.edu> Tested-by: Tobias Droste <tdro...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev