summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2009-07-08 11:39:13 -0700
committerIan Romanick <ian.d.romanick@intel.com>2009-07-20 15:37:24 -0700
commit480567d5c451511a72744b0c849960c2b712e093 (patch)
treec38d78e42203fec07ac01ad59c8f176ea9edc8ba
parentcad82cd0636b4b74597ae2c6bab83a3e94006bf8 (diff)
Add new _mesa_new_parameter_list_sized to pre-allocate a parameter list
-rw-r--r--src/mesa/shader/prog_parameter.c28
-rw-r--r--src/mesa/shader/prog_parameter.h3
2 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/shader/prog_parameter.c b/src/mesa/shader/prog_parameter.c
index bcd8c5d9dc..6b9e73b2cb 100644
--- a/src/mesa/shader/prog_parameter.c
+++ b/src/mesa/shader/prog_parameter.c
@@ -44,6 +44,34 @@ _mesa_new_parameter_list(void)
}
+struct gl_program_parameter_list *
+_mesa_new_parameter_list_sized(unsigned size)
+{
+ struct gl_program_parameter_list *p = _mesa_new_parameter_list();
+
+ if ((p != NULL) && (size != 0)) {
+ p->Size = size;
+
+ /* alloc arrays */
+ p->Parameters = (struct gl_program_parameter *)
+ _mesa_calloc(size * sizeof(struct gl_program_parameter));
+
+ p->ParameterValues = (GLfloat (*)[4])
+ _mesa_align_malloc(size * 4 *sizeof(GLfloat), 16);
+
+
+ if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) {
+ _mesa_free(p->Parameters);
+ _mesa_align_free(p->ParameterValues);
+ _mesa_free(p);
+ p = NULL;
+ }
+ }
+
+ return p;
+}
+
+
/**
* Free a parameter list and all its parameters
*/
diff --git a/src/mesa/shader/prog_parameter.h b/src/mesa/shader/prog_parameter.h
index 01f5a0e179..d1fcf47e61 100644
--- a/src/mesa/shader/prog_parameter.h
+++ b/src/mesa/shader/prog_parameter.h
@@ -84,6 +84,9 @@ struct gl_program_parameter_list
extern struct gl_program_parameter_list *
_mesa_new_parameter_list(void);
+extern struct gl_program_parameter_list *
+_mesa_new_parameter_list_sized(unsigned size);
+
extern void
_mesa_free_parameter_list(struct gl_program_parameter_list *paramList);