[Mesa-dev] [PATCH] [rfc] nir: pass uniform storage instead of shader program

Timothy Arceri tarceri at itsqueeze.com
Tue May 1 02:58:19 UTC 2018


On 01/05/18 11:50, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> Only the asserts were accessing anything, and I'm not sure the
> value of those is worth preserving, this removes mtypes.h includes
> from nir which seemed like a laudable goal.

I've just pushed a patch that moved these files from src/compiler/nir/ 
to src/compiler/glsl

Ken has also suggested moving the glsl related structs out of mtypes and 
into src/compiler/glsl somewhere as a move towards removing dependencies 
on core Mesa from src/compiler/glsl.

> ---
>   src/compiler/nir/nir.h                         |  8 ++++----
>   src/compiler/nir/nir_lower_atomics.c           |  9 ++++-----
>   src/compiler/nir/nir_lower_samplers.c          | 18 ++++++++----------
>   src/compiler/nir/nir_lower_samplers_as_deref.c | 12 ++++--------
>   src/mesa/drivers/dri/i965/brw_link.cpp         |  4 ++--
>   src/mesa/main/glspirv.h                        |  1 +
>   src/mesa/state_tracker/st_glsl_to_nir.cpp      |  6 +++---
>   7 files changed, 26 insertions(+), 32 deletions(-)
> 
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index f3326e6..dd38eab 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -56,7 +56,7 @@ extern "C" {
>   #endif
>   
>   struct gl_program;
> -struct gl_shader_program;
> +struct gl_uniform_storage;
>   
>   #define NIR_FALSE 0u
>   #define NIR_TRUE (~0u)
> @@ -2597,9 +2597,9 @@ void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask);
>   void nir_lower_io_to_scalar_early(nir_shader *shader, nir_variable_mode mask);
>   
>   bool nir_lower_samplers(nir_shader *shader,
> -                        const struct gl_shader_program *shader_program);
> +                        const struct gl_uniform_storage *uniform_storage);
>   bool nir_lower_samplers_as_deref(nir_shader *shader,
> -                                 const struct gl_shader_program *shader_program);
> +                                 const struct gl_uniform_storage *uniform_storage);
>   
>   typedef struct nir_lower_subgroups_options {
>      uint8_t subgroup_size;
> @@ -2756,7 +2756,7 @@ typedef struct nir_lower_bitmap_options {
>   void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options *options);
>   
>   bool nir_lower_atomics(nir_shader *shader,
> -                       const struct gl_shader_program *shader_program,
> +                       const struct gl_uniform_storage *uniform_storage,
>                          bool use_binding_as_idx);
>   bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset);
>   bool nir_lower_to_source_mods(nir_shader *shader);
> diff --git a/src/compiler/nir/nir_lower_atomics.c b/src/compiler/nir/nir_lower_atomics.c
> index 383e323..eed9143 100644
> --- a/src/compiler/nir/nir_lower_atomics.c
> +++ b/src/compiler/nir/nir_lower_atomics.c
> @@ -28,7 +28,6 @@
>   #include "compiler/glsl/ir_uniform.h"
>   #include "nir.h"
>   #include "main/config.h"
> -#include "main/mtypes.h"
>   #include <assert.h>
>   
>   /*
> @@ -38,7 +37,7 @@
>   
>   static bool
>   lower_instr(nir_intrinsic_instr *instr,
> -            const struct gl_shader_program *shader_program,
> +            const struct gl_uniform_storage *uniform_storage,
>               nir_shader *shader, bool use_binding_as_idx)
>   {
>      nir_intrinsic_op op;
> @@ -101,7 +100,7 @@ lower_instr(nir_intrinsic_instr *instr,
>   
>      unsigned idx = use_binding_as_idx ?
>         instr->variables[0]->var->data.binding :
> -      shader_program->data->UniformStorage[uniform_loc].opaque[shader->info.stage].index;
> +      uniform_storage[uniform_loc].opaque[shader->info.stage].index;
>   
>      nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(mem_ctx, op);
>      nir_intrinsic_set_base(new_instr, idx);
> @@ -178,7 +177,7 @@ lower_instr(nir_intrinsic_instr *instr,
>   
>   bool
>   nir_lower_atomics(nir_shader *shader,
> -                  const struct gl_shader_program *shader_program,
> +                  const struct gl_uniform_storage *uniform_storage,
>                     bool use_binding_as_idx)
>   {
>      bool progress = false;
> @@ -195,7 +194,7 @@ nir_lower_atomics(nir_shader *shader,
>                  continue;
>   
>               impl_progress |= lower_instr(nir_instr_as_intrinsic(instr),
> -                                         shader_program, shader,
> +                                         uniform_storage, shader,
>                                            use_binding_as_idx);
>            }
>         }
> diff --git a/src/compiler/nir/nir_lower_samplers.c b/src/compiler/nir/nir_lower_samplers.c
> index 7690665..ed2e1be 100644
> --- a/src/compiler/nir/nir_lower_samplers.c
> +++ b/src/compiler/nir/nir_lower_samplers.c
> @@ -28,7 +28,6 @@
>   #include "compiler/glsl/ir_uniform.h"
>   
>   #include "main/compiler.h"
> -#include "main/mtypes.h"
>   
>   /* Calculate the sampler index based on array indicies and also
>    * calculate the base uniform location for struct members.
> @@ -85,7 +84,8 @@ calc_sampler_offsets(nir_deref *tail, nir_tex_instr *instr,
>   }
>   
>   static bool
> -lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_program,
> +lower_sampler(nir_tex_instr *instr,
> +              const struct gl_uniform_storage *uniform_storage,
>                 gl_shader_stage stage, nir_builder *b)
>   {
>      if (instr->texture == NULL)
> @@ -115,11 +115,8 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
>         instr->texture_array_size = array_elements;
>      }
>   
> -   assert(location < shader_program->data->NumUniformStorage &&
> -          shader_program->data->UniformStorage[location].opaque[stage].active);
> -
>      instr->texture_index +=
> -      shader_program->data->UniformStorage[location].opaque[stage].index;
> +      uniform_storage[location].opaque[stage].index;
>   
>      instr->sampler_index = instr->texture_index;
>   
> @@ -129,7 +126,8 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
>   }
>   
>   static bool
> -lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_program,
> +lower_impl(nir_function_impl *impl,
> +           const struct gl_uniform_storage *uniform_storage,
>              gl_shader_stage stage)
>   {
>      nir_builder b;
> @@ -140,7 +138,7 @@ lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_progr
>         nir_foreach_instr(instr, block) {
>            if (instr->type == nir_instr_type_tex)
>               progress |= lower_sampler(nir_instr_as_tex(instr),
> -                                      shader_program, stage, &b);
> +                                      uniform_storage, stage, &b);
>         }
>      }
>   
> @@ -149,13 +147,13 @@ lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_progr
>   
>   bool
>   nir_lower_samplers(nir_shader *shader,
> -                   const struct gl_shader_program *shader_program)
> +                   const struct gl_uniform_storage *uniform_storage)
>   {
>      bool progress = false;
>   
>      nir_foreach_function(function, shader) {
>         if (function->impl)
> -         progress |= lower_impl(function->impl, shader_program,
> +         progress |= lower_impl(function->impl, uniform_storage,
>                                   shader->info.stage);
>      }
>   
> diff --git a/src/compiler/nir/nir_lower_samplers_as_deref.c b/src/compiler/nir/nir_lower_samplers_as_deref.c
> index cb0c827..1f3fbbc 100644
> --- a/src/compiler/nir/nir_lower_samplers_as_deref.c
> +++ b/src/compiler/nir/nir_lower_samplers_as_deref.c
> @@ -60,11 +60,10 @@
>   #include "compiler/glsl/ir_uniform.h"
>   
>   #include "main/compiler.h"
> -#include "main/mtypes.h"
>   
>   struct lower_samplers_as_deref_state {
>      nir_shader *shader;
> -   const struct gl_shader_program *shader_program;
> +   const struct gl_uniform_storage *uniform_storage;
>      struct hash_table *remap_table;
>   };
>   
> @@ -125,10 +124,7 @@ lower_deref(nir_deref_var *deref,
>      path = ralloc_asprintf(state->remap_table, "lower@%s", var->name);
>      remove_struct_derefs(&deref->deref, state, b, &path, &location);
>   
> -   assert(location < state->shader_program->data->NumUniformStorage &&
> -          state->shader_program->data->UniformStorage[location].opaque[stage].active);
> -
> -   binding = state->shader_program->data->UniformStorage[location].opaque[stage].index;
> +   binding = state->uniform_storage[location].opaque[stage].index;
>   
>      if (orig_type == deref->deref.type) {
>         /* Fast path: We did not encounter any struct derefs. */
> @@ -227,13 +223,13 @@ lower_impl(nir_function_impl *impl, struct lower_samplers_as_deref_state *state)
>   
>   bool
>   nir_lower_samplers_as_deref(nir_shader *shader,
> -                            const struct gl_shader_program *shader_program)
> +                            const struct gl_uniform_storage *uniform_storage)
>   {
>      bool progress = false;
>      struct lower_samplers_as_deref_state state;
>   
>      state.shader = shader;
> -   state.shader_program = shader_program;
> +   state.uniform_storage = uniform_storage;
>      state.remap_table = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
>                                                  _mesa_key_string_equal);
>   
> diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp
> index 7841626..7c87d89 100644
> --- a/src/mesa/drivers/dri/i965/brw_link.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_link.cpp
> @@ -299,8 +299,8 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
>         struct gl_program *prog = shader->Program;
>         brw_shader_gather_info(prog->nir, prog);
>   
> -      NIR_PASS_V(prog->nir, nir_lower_samplers, shProg);
> -      NIR_PASS_V(prog->nir, nir_lower_atomics, shProg, false);
> +      NIR_PASS_V(prog->nir, nir_lower_samplers, shProg->data->UniformStorage);
> +      NIR_PASS_V(prog->nir, nir_lower_atomics, shProg->data->UniformStorage, false);
>         NIR_PASS_V(prog->nir, nir_lower_atomics_to_ssbo,
>                    prog->nir->info.num_abos);
>   
> diff --git a/src/mesa/main/glspirv.h b/src/mesa/main/glspirv.h
> index cbcd3c0..31ffda1 100644
> --- a/src/mesa/main/glspirv.h
> +++ b/src/mesa/main/glspirv.h
> @@ -32,6 +32,7 @@ extern "C" {
>   
>   struct gl_context;
>   struct gl_shader;
> +struct gl_shader_program;
>   
>   /**
>    * A SPIR-V module contains the raw SPIR-V binary as set by ShaderBinary.
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index bcf6a7c..bde1384 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -467,7 +467,7 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog,
>      st_set_prog_affected_state_flags(prog);
>   
>      NIR_PASS_V(nir, st_nir_lower_builtin);
> -   NIR_PASS_V(nir, nir_lower_atomics, shader_program, true);
> +   NIR_PASS_V(nir, nir_lower_atomics, shader_program->data->UniformStorage, true);
>   
>      if (st->ctx->_Shader->Flags & GLSL_DUMP) {
>         _mesa_log("\n");
> @@ -813,9 +813,9 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
>      }
>   
>      if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF))
> -      NIR_PASS_V(nir, nir_lower_samplers_as_deref, shader_program);
> +      NIR_PASS_V(nir, nir_lower_samplers_as_deref, shader_program->data->UniformStorage);
>      else
> -      NIR_PASS_V(nir, nir_lower_samplers, shader_program);
> +      NIR_PASS_V(nir, nir_lower_samplers, shader_program->data->UniformStorage);
>   }
>   
>   } /* extern "C" */
> 


More information about the mesa-dev mailing list