summaryrefslogtreecommitdiffstats
path: root/src/intel/blorp/blorp_blit.c
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2016-10-21 12:09:38 -0700
committerEmil Velikov <emil.l.velikov@gmail.com>2016-11-01 12:45:43 +0000
commit89cefe6325b2534c4e35ac0a4b85155a3be57936 (patch)
treec821f52f4dfe06eddd4a5561559ac9f15b6f00da /src/intel/blorp/blorp_blit.c
parent75258017dda55a32dcf3114113f8fccde47a490d (diff)
downloadexternal_mesa3d-89cefe6325b2534c4e35ac0a4b85155a3be57936.zip
external_mesa3d-89cefe6325b2534c4e35ac0a4b85155a3be57936.tar.gz
external_mesa3d-89cefe6325b2534c4e35ac0a4b85155a3be57936.tar.bz2
intel/blorp: Rework our usage of ralloc when compiling shaders
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. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com> Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com> Cc: "12.0, 13.0" <mesa-stable@lists.freedesktop.org> (cherry picked from commit 43dadb6edd5e3e3e10b1198184a9f75556edad49) [Emil Velikov: resolve trivial conflicts] Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Conflicts: src/intel/blorp/blorp_clear.c
Diffstat (limited to 'src/intel/blorp/blorp_blit.c')
-rw-r--r--src/intel/blorp/blorp_blit.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 9e32236..cbccfc7 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