summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2019-07-09 00:32:42 -0700
committerKenneth Graunke <[email protected]>2019-07-10 22:14:36 -0700
commitce93bf18767921dbcba4be0039d912e2fe7b276d (patch)
tree7331d7a5c1fb99eb6b4df7d00b5f7de9fee2b249 /src/mesa/state_tracker
parentae4ccb67be29b9bca5c3ba8e5ed175901e1645b6 (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/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_glsl_to_nir.cpp8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 221c8a030b0..be1fc3b2484 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -328,11 +328,9 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
}
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
- nir_shader *softfp64 = NULL;
- if (nir->info.uses_64bit &&
+ if (!st->ctx->SoftFP64 && nir->info.uses_64bit &&
(options->lower_doubles_options & nir_lower_fp64_full_software) != 0) {
- softfp64 = glsl_float64_funcs_to_nir(st->ctx, options);
- ralloc_steal(ralloc_parent(nir), softfp64);
+ st->ctx->SoftFP64 = glsl_float64_funcs_to_nir(st->ctx, options);
}
nir_variable_mode mask =
@@ -381,7 +379,7 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
}
if (options->lower_doubles_options) {
NIR_PASS(progress, nir, nir_lower_doubles,
- softfp64, options->lower_doubles_options);
+ st->ctx->SoftFP64, options->lower_doubles_options);
}
NIR_PASS(progress, nir, nir_opt_algebraic);
lowered_64bit_ops |= progress;