[Mesa-dev] [RFC] i965: alternative to memctx for cleaning up nir variants
Connor Abbott
cwabbott0 at gmail.com
Sat Dec 19 18:01:00 PST 2015
Why don't you just introduce a reference-counted wrapper around a
nir_shader * and pass that around instead? This seems like a
gallium-specific problem, so modifying other things to work around it
doesn't seem so appealing.
On Sat, Dec 19, 2015 at 8:55 PM, Rob Clark <robdclark at gmail.com> wrote:
> From: Rob Clark <robclark at freedesktop.org>
>
> Jason,
>
> How much do you hate this idea? Seems like an easy alternative to
> using ralloc ctx's to clean up nir variants/clones, which would let
> us drop the parent memctx for nir_shader_create()/clone(), making
> it easier to introduce reference counting.
>
> ---
> src/mesa/drivers/dri/i965/brw_compiler.h | 22 ++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_fs.cpp | 6 ++++--
> src/mesa/drivers/dri/i965/brw_vec4.cpp | 3 ++-
> src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 3 ++-
> 4 files changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h
> index c9e0317..eb1087a 100644
> --- a/src/mesa/drivers/dri/i965/brw_compiler.h
> +++ b/src/mesa/drivers/dri/i965/brw_compiler.h
> @@ -26,6 +26,7 @@
> #include <stdio.h>
> #include "brw_device_info.h"
> #include "main/mtypes.h"
> +#include "nir.h"
>
> #ifdef __cplusplus
> extern "C" {
> @@ -651,6 +652,27 @@ struct brw_gs_prog_data
>
> /** @} */
>
> +#ifdef __cplusplus
> +/* A common pattern is for brw_compile_xyz to create a clone of the original
> + * shader, modify it (various lowering passes, etc), and then throw it away.
> + * The scoped_clone helper class is just a way to use RAII to clean up the
> + * shader when it goes out of scope.
> + */
> +class scoped_clone
> +{
> +public:
> + nir_shader *shader;
> + scoped_clone(const nir_shader *s)
> + {
> + shader = nir_shader_clone(NULL, s);
> + }
> + ~scoped_clone()
> + {
> + ralloc_free(shader);
> + }
> +};
> +#endif
> +
> /**
> * Compile a vertex shader.
> *
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index c833ef0..44ea156 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -5490,7 +5490,8 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
> unsigned *final_assembly_size,
> char **error_str)
> {
> - nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
> + scoped_clone sc(src_shader);
> + nir_shader *shader = sc.shader;
> shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, &key->tex,
> true);
> shader = brw_postprocess_nir(shader, compiler->devinfo, true);
> @@ -5616,7 +5617,8 @@ brw_compile_cs(const struct brw_compiler *compiler, void *log_data,
> unsigned *final_assembly_size,
> char **error_str)
> {
> - nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
> + scoped_clone sc(src_shader);
> + nir_shader *shader = sc.shader;
> shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, &key->tex,
> true);
> shader = brw_postprocess_nir(shader, compiler->devinfo, true);
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index a697bdf..a89e884 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -1957,7 +1957,8 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data,
> unsigned *final_assembly_size,
> char **error_str)
> {
> - nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
> + scoped_clone sc(src_shader);
> + nir_shader *shader = sc.shader;
> shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, &key->tex,
> compiler->scalar_stage[MESA_SHADER_VERTEX]);
> shader = brw_postprocess_nir(shader, compiler->devinfo,
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
> index b13d36e..9ed7e0d 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
> @@ -617,7 +617,8 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
> memset(&c, 0, sizeof(c));
> c.key = *key;
>
> - nir_shader *shader = nir_shader_clone(mem_ctx, src_shader);
> + scoped_clone sc(src_shader);
> + nir_shader *shader = sc.shader;
> shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, &key->tex,
> compiler->scalar_stage[MESA_SHADER_GEOMETRY]);
> shader = brw_postprocess_nir(shader, compiler->devinfo,
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list