----- Original Message ----- > Am 13.05.2014 14:01, schrieb jfons...@vmware.com: > > From: Frank Henigman <fjhenig...@google.com> > > > > Split free_gallivm_state() into two steps. First step is > > gallivm_free_ir() which cleans up the LLVM scaffolding used to generate > > code while preserving the code itself. Second step is > > gallivm_free_code() to free the memory occupied by the code. > > > > v2: s/gallivm_teardown/gallivm_free_ir/ (Jose) > > > > Signed-off-by: José Fonseca <jfons...@vmware.com> > > --- > > src/gallium/auxiliary/gallivm/lp_bld_init.c | 27 > > ++++++++++++++++++++------- > > src/gallium/auxiliary/gallivm/lp_bld_init.h | 2 ++ > > 2 files changed, 22 insertions(+), 7 deletions(-) > > > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c > > b/src/gallium/auxiliary/gallivm/lp_bld_init.c > > index 982d1db..6feec70 100644 > > --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c > > +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c > > @@ -182,10 +182,11 @@ create_pass_manager(struct gallivm_state *gallivm) > > > > > > /** > > - * Free gallivm object's LLVM allocations, but not the gallivm object > > itself. > > + * Free gallivm object's LLVM allocations, but not any generated code > > + * nor the gallivm object itself. > > */ > > -static void > > -free_gallivm_state(struct gallivm_state *gallivm) > > +void > > +gallivm_free_ir(struct gallivm_state *gallivm) > > { > > if (gallivm->passmgr) { > > LLVMDisposePassManager(gallivm->passmgr); > > @@ -212,14 +213,24 @@ free_gallivm_state(struct gallivm_state *gallivm) > > if (!USE_GLOBAL_CONTEXT && gallivm->context) > > LLVMContextDispose(gallivm->context); > > > > - lp_free_generated_code(gallivm->code); > > - > > gallivm->engine = NULL; > > gallivm->target = NULL; > > gallivm->module = NULL; > > gallivm->passmgr = NULL; > > gallivm->context = NULL; > > gallivm->builder = NULL; > > +} > > + > > + > > +/** > > + * Free LLVM-generated code. Should be done AFTER gallivm_free_ir(). > > + */ > > +static void > > +gallivm_free_code(struct gallivm_state *gallivm) > > +{ > > + assert(!gallivm->module); > > + assert(!gallivm->engine); > > + lp_free_generated_code(gallivm->code); > > gallivm->code = NULL; > > } > > > > @@ -366,7 +377,8 @@ init_gallivm_state(struct gallivm_state *gallivm) > > return TRUE; > > > > fail: > > - free_gallivm_state(gallivm); > > + gallivm_free_ir(gallivm); > > + gallivm_free_code(gallivm); > > return FALSE; > > } > > > > @@ -497,7 +509,8 @@ gallivm_create(void) > > void > > gallivm_destroy(struct gallivm_state *gallivm) > > { > > - free_gallivm_state(gallivm); > > + gallivm_free_ir(gallivm); > > + gallivm_free_code(gallivm); > > FREE(gallivm); > > } > > > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h > > b/src/gallium/auxiliary/gallivm/lp_bld_init.h > > index e405b8a..b11e986 100644 > > --- a/src/gallium/auxiliary/gallivm/lp_bld_init.h > > +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h > > @@ -59,6 +59,8 @@ gallivm_create(void); > > void > > gallivm_destroy(struct gallivm_state *gallivm); > > > > +void > > +gallivm_free_ir(struct gallivm_state *gallivm); > > > > void > > gallivm_verify_function(struct gallivm_state *gallivm, > > > > 8-12 also look good to me, still looking at 7.
Thanks for the reviews. > Now that we should have to keep much less memory per shader, should we > increase the limits before we start destroying variants? Maybe, eventually. But that needs further investigation. Per-shader consumption went down on master (where we have multiple modules, multiple engines), but I'm not sure it's down compared with LLVM 2.6 era (where we had 1 module, 1 engine). My testing focused on the maximum memory consumed by LLVM. And the peak tended to happen more during compilations, so I don't have good values on average shader sizes. Jose _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev