[Mesa-stable] [Mesa-dev] [PATCH 4/8] i965: Account for poor address calculations in Haswell CS scratch size.

Jordan Justen jordan.l.justen at intel.com
Sat Jun 11 21:49:49 UTC 2016


On 2016-06-10 13:05:16, Kenneth Graunke wrote:
> Curro figured this out by investigating the simulator.  Apparently
> there's also a workaround in the Windows driver.  I'm not sure it's
> actually documented anywhere.
> 
> We were underallocating the scratch buffer by a factor of 128/70.
> 
> Cc: "12.0" <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_cs.c | 21 ++++++++++++++++++++-
>  1 file changed, 20 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_cs.c b/src/mesa/drivers/dri/i965/brw_cs.c
> index c8598d6..329adff 100644
> --- a/src/mesa/drivers/dri/i965/brw_cs.c
> +++ b/src/mesa/drivers/dri/i965/brw_cs.c
> @@ -150,9 +150,28 @@ brw_codegen_cs_prog(struct brw_context *brw,
>  
>     if (prog_data.base.total_scratch) {
>        const unsigned subslices = MAX2(brw->intelScreen->subslice_total, 1);
> +
> +      /* WaCSScratchSize:hsw
> +       *
> +       * Haswell's scratch space address calculation appears to be sparse
> +       * rather than tightly packed.  The Thread ID has bits indicating
> +       * which subslice, EU within a subslice, and thread within an EU
> +       * it is.  There's a maximum of two slices and two subslices, so these
> +       * can be stored with a single bit.  Even though there are only 10 EUs
> +       * per subslice, this is stored in 4 bits, so there's an effective
> +       * maximum value of 16 EUs.  Similarly, although there are only 7
> +       * threads per EU, this is stored in a 3 bit number, giving an effective
> +       * maximum value of 8 threads per EU.
> +       *
> +       * This means that we need to use 16 * 8 instead of 10 * 7 for the
> +       * number of threads per subslice.
> +       */
> +      const unsigned threads_per_subslice =

How about naming the variable something like scratch_ids_per_subslice?

-Jordan

> +         brw->is_haswell ? 16 * 8 : brw->max_cs_threads;
> +
>        brw_get_scratch_bo(brw, &brw->cs.base.scratch_bo,
>                           prog_data.base.total_scratch *
> -                         brw->max_cs_threads * subslices);
> +                         threads_per_subslice * subslices);
>     }
>  
>     if (unlikely(INTEL_DEBUG & DEBUG_CS))
> -- 
> 2.8.3
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-stable mailing list