[Mesa-dev] [PATCH 22/24] i965/fs: Build 32-wide compute shader when needed.

Jason Ekstrand jason at jlekstrand.net
Fri May 27 19:56:00 UTC 2016


On Thu, May 26, 2016 at 8:46 PM, Francisco Jerez <currojerez at riseup.net>
wrote:

> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 1f3b23b..7002346 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -6547,6 +6547,32 @@ brw_compile_cs(const struct brw_compiler *compiler,
> void *log_data,
>        }
>     }
>
> +   fs_visitor v32(compiler, log_data, mem_ctx, key, &prog_data->base,
> +                 NULL, /* Never used in core profile */
> +                 shader, 32, shader_time_index);
> +   if (!fail_msg && v8.max_dispatch_width >= 32 &&
> +       simd_required == 32) {
>

I don't see where simd_required is getting aligned up to a power-of-two so
how are we expecting to hit this?  Also, I took a look at the SIMD16 case
above, and we're hand-rolling simd_required there (which we shouldn't be).
Here's what I would suggest:

simd_required = DIV_ROUND_UP(...)
min_simd = 32

then, in each one we do

if ((INTEL_DEBUG & DEBUG_NO16) && simd_required <= 16 && min_simd >= 16) {
    if (min_simd == 8)
        v16.import_uniforms(v8)
    if (!v16.run_cs()) {
        /* fail */
    } else {
        /* success */
        min_simd = MIN2(min_simd, 16);
    }
}

with the obvious adjustments for 8 and 32.  That way no8 and no16 both work
fine and we properly guarantee that we compile exactly one shader.

Seem reasonable?

--Jason


> +      /* Try a SIMD32 compile */
> +      if (simd_required <= 8)
> +         v32.import_uniforms(&v8);
> +      else if (simd_required <= 16)
> +         v32.import_uniforms(&v16);
> +
> +      if (!v32.run_cs()) {
> +         compiler->shader_perf_log(log_data,
> +                                   "SIMD32 shader failed to compile: %s",
> +                                   v16.fail_msg);
> +         if (!cfg) {
> +            fail_msg =
> +               "Couldn't generate SIMD32 program and not "
> +               "enough threads for SIMD16";
> +         }
> +      } else {
> +         cfg = v32.cfg;
> +         prog_data->simd_size = 32;
> +      }
> +   }
> +
>     if (unlikely(cfg == NULL)) {
>        assert(fail_msg);
>        if (error_str)
> --
> 2.7.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160527/1167e830/attachment-0001.html>


More information about the mesa-dev mailing list