mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
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 <samsagax@gmail.com> NOTE: This is a candidate for the 9.1 branch. Reviewed-and-tested-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
parent
9dd19575d3
commit
0967c362bf
1 changed files with 11 additions and 7 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue