diff options
author | Eric Anholt <[email protected]> | 2013-03-29 00:26:07 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2013-03-30 17:24:18 -0700 |
commit | 0967c362bf378b7415c30ca6d9523d3b2a3a7f5d (patch) | |
tree | eeacc4dcb7c80b8771628d402b38c062f70f8373 | |
parent | 9dd19575d33b907be655586fbaf9569d9afc2711 (diff) |
i965: Fix an inconsistency inb the VUE map with gl_ClipVertex on gen4/5.
We are intentionally not allocating a slot for gl_ClipVertex. But by
leaving the bit set in the slots_valid, the fragment shader's computation
of where varyings are in urb entry coming out of the SF would be off by
one. Fixes rendering in Freespace 2 SCP, and improves rendering in TF2.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=62830
Tested-by: Joaquín Ignacio Aramendía <[email protected]>
NOTE: This is a candidate for the 9.1 branch.
Reviewed-and-tested-by: Kenneth Graunke <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index e093dd1c839..6d2c0fd87e8 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -63,6 +63,13 @@ brw_compute_vue_map(struct brw_context *brw, struct brw_vs_compile *c, { const struct intel_context *intel = &brw->intel; struct brw_vue_map *vue_map = &c->prog_data.vue_map; + + /* Prior to Gen6, don't assign a slot for VARYING_SLOT_CLIP_VERTEX, since + * it is unsupported. + */ + if (intel->gen < 6) + slots_valid &= ~VARYING_BIT_CLIP_VERTEX; + vue_map->slots_valid = slots_valid; int i; @@ -152,15 +159,12 @@ brw_compute_vue_map(struct brw_context *brw, struct brw_vs_compile *c, * assign them contiguously. Don't reassign outputs that already have a * slot. * - * Also, prior to Gen6, don't assign a slot for VARYING_SLOT_CLIP_VERTEX, - * since it is unsupported. In Gen6 and above, VARYING_SLOT_CLIP_VERTEX may - * be needed for transform feedback; since we don't want to have to - * recompute the VUE map (and everything that depends on it) when transform - * feedback is enabled or disabled, just go ahead and assign a slot for it. + * We generally don't need to assign a slot for VARYING_SLOT_CLIP_VERTEX, + * since it's encoded as the clip distances by emit_clip_distances(). + * However, it may be output by transform feedback, and we'd rather not + * recompute state when TF changes, so we just always include it. */ for (int i = 0; i < VARYING_SLOT_MAX; ++i) { - if (intel->gen < 6 && i == VARYING_SLOT_CLIP_VERTEX) - continue; if ((slots_valid & BITFIELD64_BIT(i)) && vue_map->varying_to_slot[i] == -1) { assign_vue_slot(vue_map, i); |