i965/vs: Take attributes into account when deciding urb_entry_size.

Both the VF and VS share space in the URB.  First, the VF stores
attributes (shader inputs) there.  The VS then reads the attributes,
executes, and reuses the space to store varyings (shader outputs).

Thus, we need to calculate the amount of URB space necessary for inputs,
outputs, and pick whichever is greater.

The old VS backend correctly did this (brw_vs_emit.c:408), but the new
VS backend only considered outputs.

Fixes vertex scrambling in GLBenchmark PRO on Ivybridge.

NOTE: This is a candidate for the 8.0 branch.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41318
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
(cherry picked from commit 2e712e41db)
This commit is contained in:
Kenneth Graunke 2012-01-18 04:53:40 -08:00 committed by Ian Romanick
parent 759da0cb56
commit 2fae4d26f3
2 changed files with 8 additions and 5 deletions

View file

@ -25,6 +25,7 @@
extern "C" {
#include "brw_eu.h"
#include "main/macros.h"
};
using namespace brw;
@ -95,6 +96,13 @@ vec4_visitor::setup_attributes(int payload_reg)
prog_data->urb_read_length = (nr_attributes + 1) / 2;
unsigned vue_entries = MAX2(nr_attributes, c->vue_map.num_slots);
if (intel->gen == 6)
c->prog_data.urb_entry_size = ALIGN(vue_entries, 8) / 8;
else
c->prog_data.urb_entry_size = ALIGN(vue_entries, 4) / 4;
return payload_reg + nr_attributes;
}

View file

@ -2286,11 +2286,6 @@ vec4_visitor::emit_urb_writes()
*/
inst->offset = (max_usable_mrf - base_mrf) / 2;
}
if (intel->gen == 6)
c->prog_data.urb_entry_size = ALIGN(c->vue_map.num_slots, 8) / 8;
else
c->prog_data.urb_entry_size = ALIGN(c->vue_map.num_slots, 4) / 4;
}
src_reg