summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2012-08-27 09:24:56 -0700
committerEric Anholt <[email protected]>2012-09-07 08:29:49 -0700
commit7b3fe776e2950d1cbaadc2fe69eb43b102a84ba9 (patch)
treed3aaf52579b86df03f9740e372545f64f96c5cc0 /src
parentf144b78dfbb97a70121be6f20d10bad8111267e3 (diff)
i965: Make the param pointer arrays for the VS dynamically sized.
Saves 96MB of wasted memory in the l4d2 demo. v2: Rebase on compare func change, change brace style. Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h4
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_cache.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c33
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.h1
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 0fe640c0934..3dac6339b48 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 b8a2fc3a539..d9bbcd934ca 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
@@ -343,6 +344,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 1b111743aaf..4507f6c1c4c 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -220,6 +220,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));
@@ -229,6 +233,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;
@@ -512,3 +536,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 e69a713d08d..307e8e70fee 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.h
+++ b/src/mesa/drivers/dri/i965/brw_vs.h
@@ -125,5 +125,6 @@ void brw_vs_debug_recompile(struct brw_context *brw,
const struct brw_vs_prog_key *key);
bool brw_vs_prog_data_compare(const void *a, const void *b,
int aux_size, const void *key);
+void brw_vs_prog_data_free(const void *in_prog_data);
#endif