From: Ilia Mirkin Date: Tue, 24 Jun 2014 23:23:20 +0000 (-0400) Subject: r600g: allow viewport index/layer to be sent to ps X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=141f8fe1d100f66afe5217a8a33c17fce11ee8a8;p=mesa.git r600g: allow viewport index/layer to be sent to ps In order to support ARB_fragment_layer_viewport, we need to explicitly send these along to the pixel shader, since it has no other way to retrieve them. Signed-off-by: Ilia Mirkin Tested-by: Tobias Droste Reviewed-by: Alex Deucher --- diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index b3d1998b98e..3767e5fbc18 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;