* \author Brian Paul
*/
-
#include "main/glheader.h"
-#include "main/imports.h"
#include "main/macros.h"
+#include "util/u_memory.h"
#include "prog_instruction.h"
#include "prog_parameter.h"
#include "prog_statevars.h"
p->ParameterValueOffset = (unsigned *) calloc(size, sizeof(unsigned));
p->ParameterValues = (gl_constant_value *)
- _mesa_align_malloc(size * 4 *sizeof(gl_constant_value), 16);
+ align_malloc(size * 4 *sizeof(gl_constant_value), 16);
if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) {
free(p->Parameters);
- _mesa_align_free(p->ParameterValues);
+ align_free(p->ParameterValues);
free(p);
p = NULL;
}
free((void *)paramList->Parameters[i].Name);
}
free(paramList->Parameters);
- _mesa_align_free(paramList->ParameterValues);
+ free(paramList->ParameterValueOffset);
+ align_free(paramList->ParameterValues);
free(paramList);
}
paramList->Size * sizeof(unsigned));
paramList->ParameterValues = (gl_constant_value *)
- _mesa_align_realloc(paramList->ParameterValues, /* old buf */
- oldNum * 4 * sizeof(gl_constant_value),/* old sz */
- paramList->Size*4*sizeof(gl_constant_value),/*new*/
- 16);
+ align_realloc(paramList->ParameterValues, /* old buf */
+ oldNum * 4 * sizeof(gl_constant_value),/* old sz */
+ paramList->Size*4*sizeof(gl_constant_value),/*new*/
+ 16);
}
}
* store all the values (in blocks of 4).
*
* \param paramList the list to add the parameter to
- * \param type type of parameter, such as
+ * \param type type of parameter, such as
* \param name the parameter name, will be duplicated/copied!
* \param size number of elements in 'values' vector (1..4, or more)
* \param datatype GL_FLOAT, GL_FLOAT_VECx, GL_INT, GL_INT_VECx or GL_NONE.
{
assert(0 < size && size <=4);
const GLuint oldNum = paramList->NumParameters;
- unsigned oldValNum = pad_and_align ?
- align(paramList->NumParameterValues, 4) : paramList->NumParameterValues;
+ unsigned oldValNum = paramList->NumParameterValues;
+
+ if (pad_and_align)
+ oldValNum = align(oldValNum, 4); /* pad start to a vec4 boundary */
+ else if (_mesa_gl_datatype_is_64bit(datatype))
+ oldValNum = align(oldValNum, 2); /* pad start to 64-bit */
_mesa_reserve_parameter_storage(paramList, 1);
p->Name = strdup(name ? name : "");
p->Type = type;
p->Size = size;
+ p->Padded = pad_and_align;
p->DataType = datatype;
paramList->ParameterValueOffset[oldNum] = oldValNum;
return pos;
}
-
-/**
- * Add a new state reference to the parameter list.
- * This will be used when the program contains something like this:
- * PARAM ambient = state.material.front.ambient;
- *
- * \param paramList the parameter list
- * \param stateTokens an array of 5 (STATE_LENGTH) state tokens
- * \return index of the new parameter.
- */
GLint
-_mesa_add_state_reference(struct gl_program_parameter_list *paramList,
- const gl_state_index16 stateTokens[STATE_LENGTH])
+_mesa_add_sized_state_reference(struct gl_program_parameter_list *paramList,
+ const gl_state_index16 stateTokens[STATE_LENGTH],
+ const unsigned size, bool pad_and_align)
{
- const GLuint size = 4; /* XXX fix */
char *name;
GLint index;
name = _mesa_program_state_string(stateTokens);
index = _mesa_add_parameter(paramList, PROGRAM_STATE_VAR, name,
- size, GL_NONE, NULL, stateTokens, true);
+ size, GL_NONE, NULL, stateTokens,
+ pad_and_align);
paramList->StateFlags |= _mesa_program_state_flags(stateTokens);
/* free name string here since we duplicated it in add_parameter() */
return index;
}
+
+
+/**
+ * Add a new state reference to the parameter list.
+ * This will be used when the program contains something like this:
+ * PARAM ambient = state.material.front.ambient;
+ *
+ * \param paramList the parameter list
+ * \param stateTokens an array of 5 (STATE_LENGTH) state tokens
+ * \return index of the new parameter.
+ */
+GLint
+_mesa_add_state_reference(struct gl_program_parameter_list *paramList,
+ const gl_state_index16 stateTokens[STATE_LENGTH])
+{
+ return _mesa_add_sized_state_reference(paramList, stateTokens, 4, true);
+}