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. Now that we should have to keep much less memory per shader, should we increase the limits before we start destroying variants? Roland _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev