[Mesa-dev] [PATCH 2/2] i965: Do NIR shader cloning in the caller.

Alejandro Piñeiro apinheiro at igalia.com
Sat Nov 10 11:54:44 UTC 2018


I was tempted to suggest to add a comment somewhere mentioning this
policy change, but there are so many functions that Im not sure what
would be that somewhere. Ramblings apart:

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>


On 10/11/18 09:17, Kenneth Graunke wrote:
> This moves nir_shader_clone() to the driver-specific compile function,
> rather than the shared src/intel/compiler code.  This allows i965 to do
> key-specific passes before calling brw_compile_*.  Vulkan should not
> need this cloning as it doesn't compile multiple variants.
>
> We do need to continue cloning in the compute shader code because we
> lower various things in NIR based on the SIMD width.
> ---
>  src/intel/compiler/brw_compiler.h          | 10 +++++-----
>  src/intel/compiler/brw_fs.cpp              |  3 +--
>  src/intel/compiler/brw_shader.cpp          |  3 +--
>  src/intel/compiler/brw_vec4.cpp            |  3 +--
>  src/intel/compiler/brw_vec4_gs_visitor.cpp |  3 +--
>  src/intel/compiler/brw_vec4_tcs.cpp        |  3 +--
>  src/mesa/drivers/dri/i965/brw_cs.c         |  2 +-
>  src/mesa/drivers/dri/i965/brw_gs.c         |  2 +-
>  src/mesa/drivers/dri/i965/brw_tcs.c        |  2 +-
>  src/mesa/drivers/dri/i965/brw_tes.c        |  3 ++-
>  src/mesa/drivers/dri/i965/brw_vs.c         |  2 +-
>  src/mesa/drivers/dri/i965/brw_wm.c         |  2 +-
>  12 files changed, 17 insertions(+), 21 deletions(-)
>
> diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h
> index d8c9499065f..1daf935d7fe 100644
> --- a/src/intel/compiler/brw_compiler.h
> +++ b/src/intel/compiler/brw_compiler.h
> @@ -1238,7 +1238,7 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_vs_prog_key *key,
>                 struct brw_vs_prog_data *prog_data,
> -               const struct nir_shader *shader,
> +               struct nir_shader *shader,
>                 int shader_time_index,
>                 char **error_str);
>  
> @@ -1253,7 +1253,7 @@ brw_compile_tcs(const struct brw_compiler *compiler,
>                  void *mem_ctx,
>                  const struct brw_tcs_prog_key *key,
>                  struct brw_tcs_prog_data *prog_data,
> -                const struct nir_shader *nir,
> +                struct nir_shader *nir,
>                  int shader_time_index,
>                  char **error_str);
>  
> @@ -1268,7 +1268,7 @@ brw_compile_tes(const struct brw_compiler *compiler, void *log_data,
>                  const struct brw_tes_prog_key *key,
>                  const struct brw_vue_map *input_vue_map,
>                  struct brw_tes_prog_data *prog_data,
> -                const struct nir_shader *shader,
> +                struct nir_shader *shader,
>                  struct gl_program *prog,
>                  int shader_time_index,
>                  char **error_str);
> @@ -1283,7 +1283,7 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_gs_prog_key *key,
>                 struct brw_gs_prog_data *prog_data,
> -               const struct nir_shader *shader,
> +               struct nir_shader *shader,
>                 struct gl_program *prog,
>                 int shader_time_index,
>                 char **error_str);
> @@ -1330,7 +1330,7 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_wm_prog_key *key,
>                 struct brw_wm_prog_data *prog_data,
> -               const struct nir_shader *shader,
> +               struct nir_shader *shader,
>                 struct gl_program *prog,
>                 int shader_time_index8,
>                 int shader_time_index16,
> diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
> index 3e083723471..aa29c8a4deb 100644
> --- a/src/intel/compiler/brw_fs.cpp
> +++ b/src/intel/compiler/brw_fs.cpp
> @@ -7119,7 +7119,7 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_wm_prog_key *key,
>                 struct brw_wm_prog_data *prog_data,
> -               const nir_shader *src_shader,
> +               nir_shader *shader,
>                 struct gl_program *prog,
>                 int shader_time_index8, int shader_time_index16,
>                 int shader_time_index32, bool allow_spilling,
> @@ -7128,7 +7128,6 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
>  {
>     const struct gen_device_info *devinfo = compiler->devinfo;
>  
> -   nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
>     shader = brw_nir_apply_sampler_key(shader, compiler, &key->tex, true);
>     brw_nir_lower_fs_inputs(shader, devinfo, key);
>     brw_nir_lower_fs_outputs(shader);
> diff --git a/src/intel/compiler/brw_shader.cpp b/src/intel/compiler/brw_shader.cpp
> index 798c799a828..b77bd798d17 100644
> --- a/src/intel/compiler/brw_shader.cpp
> +++ b/src/intel/compiler/brw_shader.cpp
> @@ -1189,7 +1189,7 @@ brw_compile_tes(const struct brw_compiler *compiler,
>                  const struct brw_tes_prog_key *key,
>                  const struct brw_vue_map *input_vue_map,
>                  struct brw_tes_prog_data *prog_data,
> -                const nir_shader *src_shader,
> +                nir_shader *nir,
>                  struct gl_program *prog,
>                  int shader_time_index,
>                  char **error_str)
> @@ -1198,7 +1198,6 @@ brw_compile_tes(const struct brw_compiler *compiler,
>     const bool is_scalar = compiler->scalar_stage[MESA_SHADER_TESS_EVAL];
>     const unsigned *assembly;
>  
> -   nir_shader *nir = nir_shader_clone(mem_ctx, src_shader);
>     nir->info.inputs_read = key->inputs_read;
>     nir->info.patch_inputs_read = key->patch_inputs_read;
>  
> diff --git a/src/intel/compiler/brw_vec4.cpp b/src/intel/compiler/brw_vec4.cpp
> index 74a4d09fc79..6ed07b72f31 100644
> --- a/src/intel/compiler/brw_vec4.cpp
> +++ b/src/intel/compiler/brw_vec4.cpp
> @@ -2828,12 +2828,11 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_vs_prog_key *key,
>                 struct brw_vs_prog_data *prog_data,
> -               const nir_shader *src_shader,
> +               nir_shader *shader,
>                 int shader_time_index,
>                 char **error_str)
>  {
>     const bool is_scalar = compiler->scalar_stage[MESA_SHADER_VERTEX];
> -   nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
>     shader = brw_nir_apply_sampler_key(shader, compiler, &key->tex, is_scalar);
>  
>     const unsigned *assembly = NULL;
> diff --git a/src/intel/compiler/brw_vec4_gs_visitor.cpp b/src/intel/compiler/brw_vec4_gs_visitor.cpp
> index c4c876a0d03..63ff27e5e08 100644
> --- a/src/intel/compiler/brw_vec4_gs_visitor.cpp
> +++ b/src/intel/compiler/brw_vec4_gs_visitor.cpp
> @@ -615,7 +615,7 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_gs_prog_key *key,
>                 struct brw_gs_prog_data *prog_data,
> -               const nir_shader *src_shader,
> +               nir_shader *shader,
>                 struct gl_program *prog,
>                 int shader_time_index,
>                 char **error_str)
> @@ -625,7 +625,6 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
>     c.key = *key;
>  
>     const bool is_scalar = compiler->scalar_stage[MESA_SHADER_GEOMETRY];
> -   nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
>  
>     /* The GLSL linker will have already matched up GS inputs and the outputs
>      * of prior stages.  The driver does extend VS outputs in some cases, but
> diff --git a/src/intel/compiler/brw_vec4_tcs.cpp b/src/intel/compiler/brw_vec4_tcs.cpp
> index 18c6dae8c10..be0969dda12 100644
> --- a/src/intel/compiler/brw_vec4_tcs.cpp
> +++ b/src/intel/compiler/brw_vec4_tcs.cpp
> @@ -378,7 +378,7 @@ brw_compile_tcs(const struct brw_compiler *compiler,
>                  void *mem_ctx,
>                  const struct brw_tcs_prog_key *key,
>                  struct brw_tcs_prog_data *prog_data,
> -                const nir_shader *src_shader,
> +                nir_shader *nir,
>                  int shader_time_index,
>                  char **error_str)
>  {
> @@ -387,7 +387,6 @@ brw_compile_tcs(const struct brw_compiler *compiler,
>     const bool is_scalar = compiler->scalar_stage[MESA_SHADER_TESS_CTRL];
>     const unsigned *assembly;
>  
> -   nir_shader *nir = nir_shader_clone(mem_ctx, src_shader);
>     nir->info.outputs_written = key->outputs_written;
>     nir->info.patch_outputs_written = key->patch_outputs_written;
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_cs.c b/src/mesa/drivers/dri/i965/brw_cs.c
> index 3ae54830f78..4d968c26656 100644
> --- a/src/mesa/drivers/dri/i965/brw_cs.c
> +++ b/src/mesa/drivers/dri/i965/brw_cs.c
> @@ -58,7 +58,7 @@ brw_codegen_cs_prog(struct brw_context *brw,
>     struct brw_cs_prog_data prog_data;
>     bool start_busy = false;
>     double start_time = 0;
> -   nir_shader *nir = cp->program.nir;
> +   nir_shader *nir = nir_shader_clone(mem_ctx, cp->program.nir);
>  
>     memset(&prog_data, 0, sizeof(prog_data));
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
> index 55c2923bded..a35ce97db3e 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -89,7 +89,7 @@ brw_codegen_gs_prog(struct brw_context *brw,
>  
>     void *mem_ctx = ralloc_context(NULL);
>  
> -   nir_shader *nir = gp->program.nir;
> +   nir_shader *nir = nir_shader_clone(mem_ctx, gp->program.nir);
>  
>     assign_gs_binding_table_offsets(devinfo, &gp->program, &prog_data);
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c
> index 6e60a44fc10..86c09b92168 100644
> --- a/src/mesa/drivers/dri/i965/brw_tcs.c
> +++ b/src/mesa/drivers/dri/i965/brw_tcs.c
> @@ -84,7 +84,7 @@ brw_codegen_tcs_prog(struct brw_context *brw, struct brw_program *tcp,
>  
>     void *mem_ctx = ralloc_context(NULL);
>     if (tcp) {
> -      nir = tcp->program.nir;
> +      nir = nir_shader_clone(mem_ctx, tcp->program.nir);
>     } else {
>        const nir_shader_compiler_options *options =
>           ctx->Const.ShaderCompilerOptions[MESA_SHADER_TESS_CTRL].NirOptions;
> diff --git a/src/mesa/drivers/dri/i965/brw_tes.c b/src/mesa/drivers/dri/i965/brw_tes.c
> index 8f8f68530b7..567fed6f808 100644
> --- a/src/mesa/drivers/dri/i965/brw_tes.c
> +++ b/src/mesa/drivers/dri/i965/brw_tes.c
> @@ -70,7 +70,6 @@ brw_codegen_tes_prog(struct brw_context *brw,
>     const struct brw_compiler *compiler = brw->screen->compiler;
>     const struct gen_device_info *devinfo = &brw->screen->devinfo;
>     struct brw_stage_state *stage_state = &brw->tes.base;
> -   nir_shader *nir = tep->program.nir;
>     struct brw_tes_prog_data prog_data;
>     bool start_busy = false;
>     double start_time = 0;
> @@ -79,6 +78,8 @@ brw_codegen_tes_prog(struct brw_context *brw,
>  
>     void *mem_ctx = ralloc_context(NULL);
>  
> +   nir_shader *nir = nir_shader_clone(mem_ctx, tep->program.nir);
> +
>     brw_assign_common_binding_table_offsets(devinfo, &tep->program,
>                                             &prog_data.base.base, 0);
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
> index d557e82f9fc..01ddf9a4851 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> @@ -174,7 +174,7 @@ brw_codegen_vs_prog(struct brw_context *brw,
>  
>     mem_ctx = ralloc_context(NULL);
>  
> -   nir_shader *nir = vp->program.nir;
> +   nir_shader *nir = nir_shader_clone(mem_ctx, vp->program.nir);
>  
>     brw_assign_common_binding_table_offsets(devinfo, &vp->program,
>                                             &prog_data.base.base, 0);
> diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
> index 1ed66ed55dc..9e0b350eeca 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm.c
> @@ -139,7 +139,7 @@ brw_codegen_wm_prog(struct brw_context *brw,
>     bool start_busy = false;
>     double start_time = 0;
>  
> -   nir_shader *nir = fp->program.nir;
> +   nir_shader *nir = nir_shader_clone(mem_ctx, fp->program.nir);
>  
>     memset(&prog_data, 0, sizeof(prog_data));
>  



More information about the mesa-dev mailing list