summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600/r600_shader.c
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2014-06-24 19:23:20 -0400
committerIlia Mirkin <[email protected]>2014-07-02 10:53:34 -0400
commit141f8fe1d100f66afe5217a8a33c17fce11ee8a8 (patch)
tree70b2c314468a13420926184ccffff0b01b8eb278 /src/gallium/drivers/r600/r600_shader.c
parent7414552b1826ece48a622c14b48cad3a37b68025 (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/drivers/r600/r600_shader.c')
-rw-r--r--src/gallium/drivers/r600/r600_shader.c22
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;