diff options
author | Ilia Mirkin <[email protected]> | 2014-06-24 19:23:20 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-07-02 10:53:34 -0400 |
commit | 141f8fe1d100f66afe5217a8a33c17fce11ee8a8 (patch) | |
tree | 70b2c314468a13420926184ccffff0b01b8eb278 /src/gallium | |
parent | 7414552b1826ece48a622c14b48cad3a37b68025 (diff) |
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 <[email protected]>
Tested-by: Tobias Droste <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 22 |
1 files changed, 20 insertions, 2 deletions
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; |