summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2014-02-03 23:35:14 -0500
committerIan Romanick <ian.d.romanick@intel.com>2014-02-07 17:10:10 -0800
commit142f6cc0b4b1582e6e9183ac13f55c672228bdca (patch)
tree47c005a340d11e89c2664056bf462ddcc2033791
parent156ac628a8c692bf98dfdc650c999f0d549a8550 (diff)
nv50: fix layerid to be the fp input number rather than vp output number
In the tests they were the same so it didn't matter, but indications are that this is the correct behaviour. Also take this opportunity to (trivially) support using gl_Layer in fp. Cc: 10.1 <mesa-stable@lists.freedesktop.org> Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Christoph Bumiller <e0425955@student.tuwien.ac.at> (cherry picked from commit 364bdd24197e83bc76b0d244271e57ef4334a859)
-rw-r--r--src/gallium/drivers/nouveau/nv50/nv50_program.c2
-rw-r--r--src/gallium/drivers/nouveau/nv50/nv50_program.h2
-rw-r--r--src/gallium/drivers/nouveau/nv50/nv50_shader_state.c12
3 files changed, 9 insertions, 7 deletions
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c b/src/gallium/drivers/nouveau/nv50/nv50_program.c
index f14d3ef7fa0..e5064383fb7 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_program.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c
@@ -104,7 +104,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info *info)
prog->vp.bfc[info->out[i].si] = i;
break;
case TGSI_SEMANTIC_LAYER:
- prog->gp.has_layer = true;
+ prog->gp.has_layer = TRUE;
prog->gp.layerid = n;
break;
default:
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h b/src/gallium/drivers/nouveau/nv50/nv50_program.h
index 75de007e4d2..8c1b3270e03 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_program.h
+++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h
@@ -89,7 +89,7 @@ struct nv50_program {
struct {
uint32_t vert_count;
uint8_t prim_type; /* point, line strip or tri strip */
- bool has_layer;
+ uint8_t has_layer;
ubyte layerid; /* hw value of layer output */
} gp;
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
index f8b1c1b203c..129ed2ae824 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
@@ -346,7 +346,7 @@ nv50_fp_linkage_validate(struct nv50_context *nv50)
struct nv50_varying dummy;
int i, n, c, m;
uint32_t primid = 0;
- uint32_t layerid = vp->gp.layerid;
+ uint32_t layerid = 0;
uint32_t psiz = 0x000;
uint32_t interp = fp->fp.interp;
uint32_t colors = fp->fp.colors;
@@ -405,15 +405,17 @@ nv50_fp_linkage_validate(struct nv50_context *nv50)
case TGSI_SEMANTIC_PRIMID:
primid = m;
break;
+ case TGSI_SEMANTIC_LAYER:
+ layerid = m;
+ break;
}
m = nv50_vec4_map(map, m, lin,
&fp->in[i], (n < vp->out_nr) ? &vp->out[n] : &dummy);
}
- if (vp->gp.has_layer) {
- // In GL4.x, layer can be an fp input, but not in 3.x. Make sure to add
- // it to the output map.
- map[m++] = layerid;
+ if (vp->gp.has_layer && !layerid) {
+ layerid = m;
+ map[m++] = vp->gp.layerid;
}
if (nv50->rast->pipe.point_size_per_vertex) {