[Mesa-dev] [PATCH 02/11] nir: Add a pass-running infastructure

Ian Romanick idr at freedesktop.org
Wed Oct 28 16:06:50 PDT 2015


On 10/28/2015 02:32 PM, Jason Ekstrand wrote:
> ---
>  src/glsl/nir/nir.h      | 19 +++++++++++++++
>  src/glsl/nir/nir_pass.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 82 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
> index e3777f9..069c7c1 100644
> --- a/src/glsl/nir/nir.h
> +++ b/src/glsl/nir/nir.h
> @@ -1582,6 +1582,25 @@ typedef struct nir_shader {
>        foreach_list_typed(nir_function_overload, overload, node, \
>                           &(func)->overload_list)
>  
> +typedef struct nir_pass {

A couple years ago Kristian, with the support of everyone, waged a war
on 'typedef struct foo { ... } foo;'  Has this awful idiom really risen
from the dead?  Can we please send it back to the grave?

> +   bool (*shader_pass_func)(nir_shader *shader, void *data);
> +   bool (*impl_pass_func)(nir_function_impl *impl, void *data);
> +   nir_metadata metadata_preserved;
> +   void *data;
> +} nir_pass;
> +
> +static inline nir_pass
> +nir_pass_with_data(nir_pass pass, void *data)
> +{
> +   pass.data = data;
> +   return pass;
> +}
> +
> +bool nir_shader_run_pass(nir_shader *shader, const nir_pass *pass);
> +bool nir_function_impl_run_pass(nir_function_impl *impl, const nir_pass *pass);
> +bool nir_shader_optimize(nir_shader *shader,
> +                         const nir_pass *passes, unsigned num_passes);
> +
>  nir_shader *nir_shader_create(void *mem_ctx,
>                                gl_shader_stage stage,
>                                const nir_shader_compiler_options *options);
> diff --git a/src/glsl/nir/nir_pass.c b/src/glsl/nir/nir_pass.c
> index a03e124..059d016 100644
> --- a/src/glsl/nir/nir_pass.c
> +++ b/src/glsl/nir/nir_pass.c
> @@ -27,7 +27,7 @@
>  #include "nir.h"
>  
>  /*
> - * Handles management of the metadata.
> + * Handles management of NIR passes and metadata.
>   */
>  
>  void
> @@ -52,3 +52,65 @@ nir_metadata_preserve(nir_function_impl *impl, nir_metadata preserved)
>  {
>     impl->valid_metadata &= preserved;
>  }
> +
> +static bool
> +_function_impl_run_pass(nir_function_impl *impl, const nir_pass *pass)
> +{
> +   bool progress = pass->impl_pass_func(impl, pass->data);
> +   if (progress)
> +      nir_metadata_preserve(impl, pass->metadata_preserved);
> +
> +   return progress;
> +}
> +
> +bool
> +nir_function_impl_run_pass(nir_function_impl *impl, const nir_pass *pass)
> +{
> +   bool progress = _function_impl_run_pass(impl, pass);
> +
> +   /* TODO: Add a way to validate a single function_impl */
> +   nir_validate_shader(impl->overload->function->shader);
> +
> +   return progress;
> +}
> +
> +bool
> +nir_shader_run_pass(nir_shader *shader, const nir_pass *pass)
> +{
> +   bool progress;
> +   if (pass->shader_pass_func) {
> +      progress = pass->shader_pass_func(shader, pass->data);
> +
> +      if (progress) {
> +         nir_foreach_overload(shader, overload) {
> +            if (overload->impl)
> +               nir_metadata_preserve(overload->impl, pass->metadata_preserved);
> +         }
> +      }
> +   } else {
> +      progress = false;
> +      nir_foreach_overload(shader, overload) {
> +         if (overload->impl)
> +            progress |= _function_impl_run_pass(overload->impl, pass);
> +      }
> +   }
> +
> +   return progress;
> +}
> +
> +bool
> +nir_shader_optimize(nir_shader *shader,
> +                    const nir_pass *passes, unsigned num_passes)
> +{
> +   bool progress, total_progress = false;
> +
> +   do {
> +      progress = false;
> +      for (unsigned p = 0; p < num_passes; p++)
> +         progress |= nir_shader_run_pass(shader, &passes[p]);
> +
> +      total_progress |= progress;
> +   } while (progress);
> +
> +   return total_progress;
> +}
> 



More information about the mesa-dev mailing list