On 08/31/2012 03:05 PM, Eric Anholt wrote: > Saves 96MB of wasted memory in the l4d2 demo. > > v2: Rebase on compare func change, change brace style. > > Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/drivers/dri/i965/brw_context.h | 4 ++-- > src/mesa/drivers/dri/i965/brw_state_cache.c | 2 ++ > src/mesa/drivers/dri/i965/brw_vs.c | 33 > +++++++++++++++++++++++++++ > src/mesa/drivers/dri/i965/brw_vs.h | 1 + > 4 files changed, 38 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index 7261c9d..feb23aa 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -459,8 +459,8 @@ struct brw_vs_prog_data { > int num_surfaces; > > /* These pointers must appear last. See brw_vs_prog_data_compare(). */ > - const float *param[MAX_UNIFORMS * 4]; /* should be: BRW_MAX_CURBE */ > - const float *pull_param[MAX_UNIFORMS * 4]; > + const float **param; > + const float **pull_param; > }; > > > diff --git a/src/mesa/drivers/dri/i965/brw_state_cache.c > b/src/mesa/drivers/dri/i965/brw_state_cache.c > index 894142b..faff94e 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_cache.c > +++ b/src/mesa/drivers/dri/i965/brw_state_cache.c > @@ -49,6 +49,7 @@ > #include "brw_state.h" > #include "brw_vs.h" > #include "brw_wm.h" > +#include "brw_vs.h" > > #define FILE_DEBUG_FLAG DEBUG_STATE > > @@ -341,6 +342,7 @@ brw_init_caches(struct brw_context *brw) > > cache->aux_compare[BRW_VS_PROG] = brw_vs_prog_data_compare; > cache->aux_compare[BRW_WM_PROG] = brw_wm_prog_data_compare; > + cache->aux_free[BRW_VS_PROG] = brw_vs_prog_data_free; > cache->aux_free[BRW_WM_PROG] = brw_wm_prog_data_free; > } > > diff --git a/src/mesa/drivers/dri/i965/brw_vs.c > b/src/mesa/drivers/dri/i965/brw_vs.c > index a54999d..aa383c3 100644 > --- a/src/mesa/drivers/dri/i965/brw_vs.c > +++ b/src/mesa/drivers/dri/i965/brw_vs.c > @@ -219,6 +219,10 @@ do_vs_prog(struct brw_context *brw, > void *mem_ctx; > int aux_size; > int i; > + struct gl_shader *vs = NULL; > + > + if (prog) > + vs = prog->_LinkedShaders[MESA_SHADER_VERTEX]; > > memset(&c, 0, sizeof(c)); > memcpy(&c.key, key, sizeof(*key)); > @@ -228,6 +232,26 @@ do_vs_prog(struct brw_context *brw, > brw_init_compile(brw, &c.func, mem_ctx); > c.vp = vp; > > + /* Allocate the references to the uniforms that will end up in the > + * prog_data associated with the compiled program, and which will be freed > + * by the state cache. > + */ > + int param_count; > + if (vs) { > + /* We add padding around uniform values below vec4 size, with the worst > + * case being a float value that gets blown up to a vec4, so be > + * conservative here. > + */ > + param_count = vs->num_uniform_components * 4; > + > + /* We also upload clip plane data as uniforms */ > + param_count += MAX_CLIP_PLANES * 4; > + } else { > + param_count = vp->program.Base.Parameters->NumParameters * 4; > + } > + c.prog_data.param = rzalloc_array(NULL, const float *, param_count); > + c.prog_data.pull_param = rzalloc_array(NULL, const float *, param_count);
I'm surprised to see these be the same. Maybe we can do better later. This is definitely a great start though! For the series (assuming you fix patch 2 to actually call the function): Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > c.prog_data.outputs_written = vp->program.Base.OutputsWritten; > c.prog_data.inputs_read = vp->program.Base.InputsRead; > > @@ -511,3 +535,12 @@ brw_vs_precompile(struct gl_context *ctx, struct > gl_shader_program *prog) > > return success; > } > + > +void > +brw_vs_prog_data_free(const void *in_prog_data) > +{ > + const struct brw_vs_prog_data *prog_data = in_prog_data; > + > + ralloc_free((void *)prog_data->param); > + ralloc_free((void *)prog_data->pull_param); > +} > diff --git a/src/mesa/drivers/dri/i965/brw_vs.h > b/src/mesa/drivers/dri/i965/brw_vs.h > index 8fcdbb3..ee7621d 100644 > --- a/src/mesa/drivers/dri/i965/brw_vs.h > +++ b/src/mesa/drivers/dri/i965/brw_vs.h > @@ -124,5 +124,6 @@ void brw_vs_debug_recompile(struct brw_context *brw, > struct gl_shader_program *prog, > const struct brw_vs_prog_key *key); > bool brw_vs_prog_data_compare(void *a, void *b, int aux_size, void *key); > +void brw_vs_prog_data_free(const void *in_prog_data); > > #endif > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev