st/mesa: optimize DEPTH_STENCIL copies using fragment shader
[mesa.git] / src / mesa / program / prog_parameter.c
index af9bb37cd5cbec5bef5fa8ecb50034e75f6169db..ed3b6d34dc9c3826fe7a0ee769977f79d411ee72 100644 (file)
  * \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"
@@ -154,12 +153,12 @@ _mesa_new_parameter_list_sized(unsigned size)
       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;
       }
@@ -180,7 +179,8 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList)
       free((void *)paramList->Parameters[i].Name);
    }
    free(paramList->Parameters);
-   _mesa_align_free(paramList->ParameterValues);
+   free(paramList->ParameterValueOffset);
+   align_free(paramList->ParameterValues);
    free(paramList);
 }
 
@@ -212,10 +212,10 @@ _mesa_reserve_parameter_storage(struct gl_program_parameter_list *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);
    }
 }
 
@@ -227,7 +227,7 @@ _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
  * 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.
@@ -245,8 +245,12 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
 {
    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);
 
@@ -270,6 +274,7 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
    p->Name = strdup(name ? name : "");
    p->Type = type;
    p->Size = size;
+   p->Padded = pad_and_align;
    p->DataType = datatype;
 
    paramList->ParameterValueOffset[oldNum] = oldValNum;
@@ -362,21 +367,11 @@ _mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
    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;
 
@@ -391,7 +386,8 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
 
    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() */
@@ -399,3 +395,20 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
 
    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);
+}