[Mesa-dev] [PATCH v2 08/23] i965/vs: Fix a subtlety in the nr_attributes == 0 workaround.
Iago Toral
itoral at igalia.com
Mon Oct 5 23:37:32 PDT 2015
On Mon, 2015-10-05 at 13:41 -0700, Kenneth Graunke wrote:
> nr_attributes is used to compute first_non_payload_grf, which is the
> first register we're allowed to use for ordinary register allocation.
>
> The hardware requires us to read at least one pair of values, but we're
> completely free to overwrite that garbage register with whatever we like.
>
> Instead of altering nr_attributes, we should alter urb_read_length, which
> only affects the amount we ask the VF to read. This should save us a
> register in trivial cases (which admittedly isn't very useful).
>
> While we're at it, improve the explanation in the comments.
>
> v2: Actually do what I said (caught by Ilia).
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_vs.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> Ilia pointed out on IRC that my previous version of this patch was totally
> bunk - I kept editing nr_attributes, and actually made the SIMD8 case start
> using a read length of 1.
>
> Here's one that actually does what I meant. I verified that it actually
> keeps using a URB Read Length of 0 in the SIMD8 VS. I also verified that
> the previous patch doesn't break that either, so I think it's OK after all.
>
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
> index f585f22..677a58f 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> @@ -195,14 +195,16 @@ brw_codegen_vs_prog(struct brw_context *brw,
> nr_attributes++;
> }
>
> - /* The BSpec says we always have to read at least one thing from the VF,
> - * and it appears that the hardware wedges otherwise.
> + /* The 3DSTATE_VS documentation lists the lower bound on "Vertex URB Entry
> + * Read Length" as 1 in vec4 mode, and 0 in SIMD8 mode. Empirically, in
> + * vec4 mode, the hardware appears to wedge unless we read something.
> */
> - if (nr_attributes == 0 && !brw->intelScreen->compiler->scalar_vs)
> - nr_attributes = 1;
> + if (brw->intelScreen->compiler->scalar_vs)
> + prog_data.base.urb_read_length = DIV_ROUND_UP(nr_attributes, 2);
> + else
> + prog_data.base.urb_read_length = DIV_ROUND_UP(MAX2(nr_attributes, 1), 2);
>
> prog_data.nr_attributes = nr_attributes;
> - prog_data.base.urb_read_length = DIV_ROUND_UP(nr_attributes, 2);
>
> /* Since vertex shaders reuse the same VUE entry for inputs and outputs
> * (overwriting the original contents), we need to make sure the size is
More information about the mesa-dev
mailing list