[Mesa-dev] [PATCH 13/25] intel/blorp: Rework our usage of ralloc when compiling shaders

Jason Ekstrand jason at jlekstrand.net
Sat Oct 22 17:50:44 UTC 2016


Previously, we were creating the shader with a NULL ralloc context and then
trusting in blorp_compile_fs to clean it up.  The only problem was that
blorp_compile_fs didn't clean up its context properly so we were leaking.
When I went to fix that, I realized that it couldn't because it has to
return the shader binary which is allocated off of that context and used by
the caller.  The solution is to make blorp_compile_fs take a ralloc
context, allocate the nir_shaders directly off that context, and clean it
all up in whatever function creates the shader and calls blorp_compile_fs.

Cc: "12.0, 13.0" <mesa-stable at lists.freedesktop.org>
---
 src/intel/blorp/blorp.c       | 10 ++--------
 src/intel/blorp/blorp_blit.c  | 12 ++++++++----
 src/intel/blorp/blorp_clear.c |  4 ++--
 src/intel/blorp/blorp_priv.h  |  3 ++-
 4 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c
index 6677e15..0c2c567 100644
--- a/src/intel/blorp/blorp.c
+++ b/src/intel/blorp/blorp.c
@@ -156,7 +156,8 @@ brw_blorp_init_wm_prog_key(struct brw_wm_prog_key *wm_key)
 }
 
 const unsigned *
-blorp_compile_fs(struct blorp_context *blorp, struct nir_shader *nir,
+blorp_compile_fs(struct blorp_context *blorp, void *mem_ctx,
+                 struct nir_shader *nir,
                  const struct brw_wm_prog_key *wm_key,
                  bool use_repclear,
                  struct brw_blorp_prog_data *prog_data,
@@ -164,13 +165,6 @@ blorp_compile_fs(struct blorp_context *blorp, struct nir_shader *nir,
 {
    const struct brw_compiler *compiler = blorp->compiler;
 
-   void *mem_ctx = ralloc_context(NULL);
-
-   /* Calling brw_preprocess_nir and friends is destructive and, if cloning is
-    * enabled, may end up completely replacing the nir_shader.  Therefore, we
-    * own it and might as well put it in our context for easy cleanup.
-    */
-   ralloc_steal(mem_ctx, nir);
    nir->options =
       compiler->glsl_compiler_options[MESA_SHADER_FRAGMENT].NirOptions;
 
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 2f70cf4..9baf3ad 100644
--- a/src/intel/blorp/blorp_blit.c
+++ b/src/intel/blorp/blorp_blit.c
@@ -997,7 +997,7 @@ blorp_nir_manual_blend_bilinear(nir_builder *b, nir_ssa_def *pos,
  * of samples).
  */
 static nir_shader *
-brw_blorp_build_nir_shader(struct blorp_context *blorp,
+brw_blorp_build_nir_shader(struct blorp_context *blorp, void *mem_ctx,
                            const struct brw_blorp_blit_prog_key *key)
 {
    const struct gen_device_info *devinfo = blorp->isl_dev->info;
@@ -1044,7 +1044,7 @@ brw_blorp_build_nir_shader(struct blorp_context *blorp,
           (key->dst_samples <= 1));
 
    nir_builder b;
-   nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
+   nir_builder_init_simple_shader(&b, mem_ctx, MESA_SHADER_FRAGMENT, NULL);
 
    struct brw_blorp_blit_vars v;
    brw_blorp_blit_vars_init(&b, &v, key);
@@ -1233,6 +1233,8 @@ brw_blorp_get_blit_kernel(struct blorp_context *blorp,
                             &params->wm_prog_kernel, &params->wm_prog_data))
       return;
 
+   void *mem_ctx = ralloc_context(NULL);
+
    const unsigned *program;
    unsigned program_size;
    struct brw_blorp_prog_data prog_data;
@@ -1240,7 +1242,7 @@ brw_blorp_get_blit_kernel(struct blorp_context *blorp,
    /* Try and compile with NIR first.  If that fails, fall back to the old
     * method of building shaders manually.
     */
-   nir_shader *nir = brw_blorp_build_nir_shader(blorp, prog_key);
+   nir_shader *nir = brw_blorp_build_nir_shader(blorp, mem_ctx, prog_key);
    struct brw_wm_prog_key wm_key;
    brw_blorp_init_wm_prog_key(&wm_key);
    wm_key.tex.compressed_multisample_layout_mask =
@@ -1248,13 +1250,15 @@ brw_blorp_get_blit_kernel(struct blorp_context *blorp,
    wm_key.tex.msaa_16 = prog_key->tex_samples == 16;
    wm_key.multisample_fbo = prog_key->rt_samples > 1;
 
-   program = blorp_compile_fs(blorp, nir, &wm_key, false,
+   program = blorp_compile_fs(blorp, mem_ctx, nir, &wm_key, false,
                               &prog_data, &program_size);
 
    blorp->upload_shader(blorp, prog_key, sizeof(*prog_key),
                         program, program_size,
                         &prog_data, sizeof(prog_data),
                         &params->wm_prog_kernel, &params->wm_prog_data);
+
+   ralloc_free(mem_ctx);
 }
 
 static void
diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c
index b983922..43e3fd2 100644
--- a/src/intel/blorp/blorp_clear.c
+++ b/src/intel/blorp/blorp_clear.c
@@ -57,7 +57,7 @@ blorp_params_get_clear_kernel(struct blorp_context *blorp,
    void *mem_ctx = ralloc_context(NULL);
 
    nir_builder b;
-   nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
+   nir_builder_init_simple_shader(&b, mem_ctx, MESA_SHADER_FRAGMENT, NULL);
    b.shader->info.name = ralloc_strdup(b.shader, "BLORP-clear");
 
    nir_variable *v_color = nir_variable_create(b.shader, nir_var_shader_in,
@@ -78,7 +78,7 @@ blorp_params_get_clear_kernel(struct blorp_context *blorp,
    struct brw_blorp_prog_data prog_data;
    unsigned program_size;
    const unsigned *program =
-      blorp_compile_fs(blorp, b.shader, &wm_key, use_replicated_data,
+      blorp_compile_fs(blorp, mem_ctx, b.shader, &wm_key, use_replicated_data,
                        &prog_data, &program_size);
 
    blorp->upload_shader(blorp, &blorp_key, sizeof(blorp_key),
diff --git a/src/intel/blorp/blorp_priv.h b/src/intel/blorp/blorp_priv.h
index 342a7f1..c41b4c6 100644
--- a/src/intel/blorp/blorp_priv.h
+++ b/src/intel/blorp/blorp_priv.h
@@ -318,7 +318,8 @@ struct brw_blorp_blit_prog_key
 void brw_blorp_init_wm_prog_key(struct brw_wm_prog_key *wm_key);
 
 const unsigned *
-blorp_compile_fs(struct blorp_context *blorp, struct nir_shader *nir,
+blorp_compile_fs(struct blorp_context *blorp, void *mem_ctx,
+                 struct nir_shader *nir,
                  const struct brw_wm_prog_key *wm_key,
                  bool use_repclear,
                  struct brw_blorp_prog_data *prog_data,
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list