diff options
author | Kenneth Graunke <[email protected]> | 2019-07-09 00:32:42 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-07-10 22:14:36 -0700 |
commit | ce93bf18767921dbcba4be0039d912e2fe7b276d (patch) | |
tree | 7331d7a5c1fb99eb6b4df7d00b5f7de9fee2b249 /src/mesa/drivers/dri | |
parent | ae4ccb67be29b9bca5c3ba8e5ed175901e1645b6 (diff) |
compiler: Save a single copy of the softfp64 shader in the context.
We were recompiling the softfp64 library of functions from GLSL to NIR
every time we compiled a shader that used fp64. Worse, we were ralloc
stealing it to the GL context. This meant that we'd accumulate lots of
copies for the lifetime of the context, which was a big space leak.
Instead, we can simply stash a single copy in the GL context, and use
it for subsequent compiles. Having a single copy should be fine from
a memory context point of view: nir_inline_function_impl already clones
the necessary nir_function_impl's as it inlines.
KHR-GL45.enhanced_layouts.ssb_member_align_non_power_of_2 was previously
OOM'ing a system with 16GB of RAM when using softfp64. Now it finishes
much more quickly and uses only ~200MB of RAM.
Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_program.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index 57fcf32efd1..0e91612d845 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -110,14 +110,12 @@ brw_create_nir(struct brw_context *brw, nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir)); - nir_shader *softfp64 = NULL; - if ((options->lower_doubles_options & nir_lower_fp64_full_software) && - nir->info.uses_64bit) { - softfp64 = glsl_float64_funcs_to_nir(ctx, options); - ralloc_steal(ralloc_parent(nir), softfp64); + if (!ctx->SoftFP64 && nir->info.uses_64bit && + (options->lower_doubles_options & nir_lower_fp64_full_software)) { + ctx->SoftFP64 = glsl_float64_funcs_to_nir(ctx, options); } - brw_preprocess_nir(brw->screen->compiler, nir, softfp64); + brw_preprocess_nir(brw->screen->compiler, nir, ctx->SoftFP64); if (stage == MESA_SHADER_TESS_CTRL) { /* Lower gl_PatchVerticesIn from a sys. value to a uniform on Gen8+. */ |