Re: [Mesa-dev] [PATCH 4/4] i965: Make the param pointer arrays for the VS dynamically sized.

2012-08-31 Thread Kenneth Graunke
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 
> Reviewed-by: Ian Romanick 
> ---
>  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 

> 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


[Mesa-dev] [PATCH 4/4] i965: Make the param pointer arrays for the VS dynamically sized.

2012-08-31 Thread Eric Anholt
Saves 96MB of wasted memory in the l4d2 demo.

v2: Rebase on compare func change, change brace style.

Reviewed-by: Kenneth Graunke 
Reviewed-by: Ian Romanick 
---
 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);
+
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
-- 
1.7.10.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev