1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.3 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file prog_parameter.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Program parameter lists and functions. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Brian Paul 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_instruction.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_parameter.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_statevars.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_program_parameter_list * 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_new_parameter_list(void) 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CALLOC_STRUCT(gl_program_parameter_list); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_program_parameter_list * 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_new_parameter_list_sized(unsigned size) 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter_list *p = _mesa_new_parameter_list(); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((p != NULL) && (size != 0)) { 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Size = size; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* alloc arrays */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Parameters = (struct gl_program_parameter *) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org calloc(1, size * sizeof(struct gl_program_parameter)); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->ParameterValues = (gl_constant_value (*)[4]) 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_align_malloc(size * 4 *sizeof(gl_constant_value), 16); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(p->Parameters); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_align_free(p->ParameterValues); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(p); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = NULL; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free a parameter list and all its parameters 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_free_parameter_list(struct gl_program_parameter_list *paramList) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < paramList->NumParameters; i++) { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (paramList->Parameters[i].Name) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) paramList->Parameters[i].Name); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(paramList->Parameters); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (paramList->ParameterValues) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_align_free(paramList->ParameterValues); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(paramList); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new parameter to a parameter list. 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that parameter values are usually 4-element GLfloat vectors. 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When size > 4 we'll allocate a sequential block of parameters to 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * store all the values (in blocks of 4). 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the list to add the parameter to 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type type of parameter, such as 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name the parameter name, will be duplicated/copied! 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param size number of elements in 'values' vector (1..4, or more) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param datatype GL_FLOAT, GL_FLOAT_VECx, GL_INT, GL_INT_VECx or GL_NONE. 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param values initial parameter value, up to 4 gl_constant_values, or NULL 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param state state indexes, or NULL 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index of new parameter in the list, or -1 if error (out of mem) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_parameter(struct gl_program_parameter_list *paramList, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_register_file type, const char *name, 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint size, GLenum datatype, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value *values, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index state[STATE_LENGTH], 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield flags) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint oldNum = paramList->NumParameters; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint sz4 = (size + 3) / 4; /* no. of new param slots needed */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(size > 0); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (oldNum + sz4 > paramList->Size) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to grow the parameter list array (alloc some extra) */ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Size = paramList->Size + 4 * sz4; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* realloc arrays */ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Parameters = (struct gl_program_parameter *) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_realloc(paramList->Parameters, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oldNum * sizeof(struct gl_program_parameter), 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Size * sizeof(struct gl_program_parameter)); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->ParameterValues = (gl_constant_value (*)[4]) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_align_realloc(paramList->ParameterValues, /* old buf */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oldNum * 4 * sizeof(gl_constant_value),/* old sz */ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Size*4*sizeof(gl_constant_value),/*new*/ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!paramList->Parameters || 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !paramList->ParameterValues) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* out of memory */ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->NumParameters = 0; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Size = 0; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, j; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->NumParameters = oldNum + sz4; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(¶mList->Parameters[oldNum], 0, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz4 * sizeof(struct gl_program_parameter)); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < sz4; i++) { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter *p = paramList->Parameters + oldNum + i; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Name = name ? _mesa_strdup(name) : NULL; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Type = type; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Size = size; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->DataType = datatype; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Flags = flags; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (values) { 1613f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com if (size >= (i+1)*4) { 1623f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com COPY_4V(paramList->ParameterValues[oldNum + i], values); 1633f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com } else { 1643f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com /* silence asan */ 1653f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com for (j = 0; j < 4; j++) { 1663f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com if (i*4+j < size) { 1673f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com paramList->ParameterValues[oldNum + i][j] = values[i*4+j]; 1683f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com } else { 1693f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com paramList->ParameterValues[oldNum + i][j].f = 0.0f; 1703f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com } 1713f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com } 1723f53ae5cba1ea56b8c4ff93770503d3fcdaecacdmymax@amazon.com } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org values += 4; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Initialized = GL_TRUE; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* silence valgrind */ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->ParameterValues[oldNum + i][j].f = 0; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size -= 4; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < STATE_LENGTH; i++) 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Parameters[oldNum].StateIndexes[i] = state[i]; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLint) oldNum; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new named program parameter (Ex: NV_fragment_program DEFINE statement) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index of the new entry in the parameter list 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_named_parameter(struct gl_program_parameter_list *paramList, 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name, const gl_constant_value values[4]) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_add_parameter(paramList, PROGRAM_NAMED_PARAM, name, 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4, GL_NONE, values, NULL, 0x0); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new named constant to the parameter list. 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This will be used when the program contains something like this: 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PARAM myVals = { 0, 1, 2, 3 }; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the parameter list 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name the name for the constant 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param values four float values 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index/position of the new parameter in the parameter list 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_named_constant(struct gl_program_parameter_list *paramList, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name, const gl_constant_value values[4], 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint size) 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* first check if this is a duplicate constant */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint pos; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (pos = 0; pos < (GLint)paramList->NumParameters; pos++) { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value *pvals = paramList->ParameterValues[pos]; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pvals[0].u == values[0].u && 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pvals[1].u == values[1].u && 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pvals[2].u == values[2].u && 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pvals[3].u == values[3].u && 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strcmp(paramList->Parameters[pos].Name, name) == 0) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Same name and value is already in the param list - reuse it */ 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* not found, add new parameter */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_add_parameter(paramList, PROGRAM_CONSTANT, name, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, GL_NONE, values, NULL, 0x0); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new unnamed constant to the parameter list. This will be used 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * when a fragment/vertex program contains something like this: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MOV r, { 0, 1, 2, 3 }; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If swizzleOut is non-null we'll search the parameter list for an 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * existing instance of the constant which matches with a swizzle. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the parameter list 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param values four float values 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param swizzleOut returns swizzle mask for accessing the constant 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index/position of the new parameter in the parameter list. 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList, 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value values[4], GLuint size, 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum datatype, GLuint *swizzleOut) 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint pos; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(size >= 1); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(size <= 4); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swizzleOut && 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_parameter_constant(paramList, values, 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, &pos, swizzleOut)) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Look for empty space in an already unnamed constant parameter 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to add this constant. This will only work for single-element 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constants because we rely on smearing (i.e. .yyyy or .zzzz). 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size == 1 && swizzleOut) { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (pos = 0; pos < (GLint) paramList->NumParameters; pos++) { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter *p = paramList->Parameters + pos; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->Type == PROGRAM_CONSTANT && p->Size + size <= 4) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ok, found room */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_constant_value *pVal = paramList->ParameterValues[pos]; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint swz = p->Size; /* 1, 2 or 3 for Y, Z, W */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pVal[p->Size] = values[0]; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->Size++; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *swizzleOut = MAKE_SWIZZLE4(swz, swz, swz, swz); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add a new parameter to store this constant */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos = _mesa_add_parameter(paramList, PROGRAM_CONSTANT, NULL, 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, datatype, values, NULL, 0x0); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pos >= 0 && swizzleOut) { 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size == 1) 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *swizzleOut = SWIZZLE_XXXX; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *swizzleOut = SWIZZLE_NOOP; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new unnamed constant to the parameter list. This will be used 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * when a fragment/vertex program contains something like this: 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MOV r, { 0, 1, 2, 3 }; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If swizzleOut is non-null we'll search the parameter list for an 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * existing instance of the constant which matches with a swizzle. 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the parameter list 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param values four float values 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param swizzleOut returns swizzle mask for accessing the constant 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index/position of the new parameter in the parameter list. 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa _mesa_add_typed_unnamed_constant 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value values[4], GLuint size, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *swizzleOut) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_add_typed_unnamed_constant(paramList, values, size, GL_NONE, 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzleOut); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add parameter representing a varying variable. 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_varying(struct gl_program_parameter_list *paramList, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name, GLuint size, GLenum datatype, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield flags) 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i = _mesa_lookup_parameter_index(paramList, -1, name); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i >= 0 && paramList->Parameters[i].Type == PROGRAM_VARYING) { 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* already in list */ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*assert(size == 4);*/ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = _mesa_add_parameter(paramList, PROGRAM_VARYING, name, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, datatype, NULL, NULL, flags); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add parameter representing a vertex program attribute. 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param size size of attribute (in floats), may be -1 if unknown 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param attrib the attribute index, or -1 if unknown 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_attribute(struct gl_program_parameter_list *paramList, 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name, GLint size, GLenum datatype, GLint attrib) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i = _mesa_lookup_parameter_index(paramList, -1, name); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i >= 0) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replace */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrib < 0) 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrib = i; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Parameters[i].StateIndexes[0] = attrib; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add */ 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_state_index state[STATE_LENGTH]; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state[0] = (gl_state_index) attrib; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size < 0) 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 4; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = _mesa_add_parameter(paramList, PROGRAM_INPUT, name, 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, datatype, NULL, state, 0x0); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* not used yet */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Returns the number of 4-component registers needed to store a piece 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of GL state. For matrices this may be as many as 4 registers, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * everything else needs 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just 1 register. 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsizeof_state_reference(const GLint *stateTokens) 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stateTokens[0] == STATE_MATRIX) { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint rows = stateTokens[4] - stateTokens[3] + 1; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rows >= 1); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rows <= 4); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rows; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a new state reference to the parameter list. 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This will be used when the program contains something like this: 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PARAM ambient = state.material.front.ambient; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the parameter list 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param stateTokens an array of 5 (STATE_LENGTH) state tokens 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index of the new parameter. 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_add_state_reference(struct gl_program_parameter_list *paramList, 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index stateTokens[STATE_LENGTH]) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint size = 4; /* XXX fix */ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *name; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint index; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check if the state reference is already in the list */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (index = 0; index < (GLint) paramList->NumParameters; index++) { 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!memcmp(paramList->Parameters[index].StateIndexes, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stateTokens, STATE_LENGTH * sizeof(gl_state_index))) { 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return index; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name = _mesa_program_state_string(stateTokens); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = _mesa_add_parameter(paramList, PROGRAM_STATE_VAR, name, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, GL_NONE, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, (gl_state_index *) stateTokens, 0x0); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->StateFlags |= _mesa_program_state_flags(stateTokens); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* free name string here since we duplicated it in add_parameter() */ 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(name); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return index; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Lookup a parameter value by name in the given parameter list. 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to the float[4] values. 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_constant_value * 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_lookup_parameter_value(const struct gl_program_parameter_list *paramList, 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei nameLen, const char *name) 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i = _mesa_lookup_parameter_index(paramList, nameLen, name); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < 0) 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return paramList->ParameterValues[i]; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a program parameter name, find its position in the list of parameters. 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param paramList the parameter list to search 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param nameLen length of name (in chars). 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If length is negative, assume that name is null-terminated. 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name the name to search for 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return index of parameter in the list. 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList, 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei nameLen, const char *name) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!paramList) 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nameLen == -1) { 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* name is null-terminated */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < (GLint) paramList->NumParameters; i++) { 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (paramList->Parameters[i].Name && 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strcmp(paramList->Parameters[i].Name, name) == 0) 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* name is not null-terminated, use nameLen */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < (GLint) paramList->NumParameters; i++) { 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (paramList->Parameters[i].Name && 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strncmp(paramList->Parameters[i].Name, name, nameLen) == 0 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && strlen(paramList->Parameters[i].Name) == (size_t)nameLen) 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Look for a float vector in the given parameter list. The float vector 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * may be of length 1, 2, 3 or 4. If swizzleOut is non-null, we'll try 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swizzling to find a match. 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param list the parameter list to search 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the float vector to search for 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param vSize number of element in v 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param posOut returns the position of the constant, if found 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param swizzleOut returns a swizzle mask describing location of the 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vector elements if found. 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if found, GL_FALSE if not found 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value v[], GLuint vSize, 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *posOut, GLuint *swizzleOut) 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(vSize >= 1); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(vSize <= 4); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!list) { 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *posOut = -1; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < list->NumParameters; i++) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (list->Parameters[i].Type == PROGRAM_CONSTANT) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!swizzleOut) { 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* swizzle not allowed */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j, match = 0; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < vSize; j++) { 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v[j].u == list->ParameterValues[i][j].u) 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org match++; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (match == vSize) { 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *posOut = i; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* try matching w/ swizzle */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vSize == 1) { 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* look for v[0] anywhere within float[4] value */ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < list->Parameters[i].Size; j++) { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (list->ParameterValues[i][j].u == v[0].u) { 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* found it */ 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *posOut = i; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *swizzleOut = MAKE_SWIZZLE4(j, j, j, j); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (vSize <= list->Parameters[i].Size) { 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* see if we can match this constant (with a swizzle) */ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint swz[4]; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint match = 0, j, k; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < vSize; j++) { 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v[j].u == list->ParameterValues[i][j].u) { 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[j] = j; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org match++; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < list->Parameters[i].Size; k++) { 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v[j].u == list->ParameterValues[i][k].u) { 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[j] = k; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org match++; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* smear last value to remaining positions */ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; j < 4; j++) 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[j] = swz[j-1]; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (match == vSize) { 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *posOut = i; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *swizzleOut = MAKE_SWIZZLE4(swz[0], swz[1], swz[2], swz[3]); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *posOut = -1; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_program_parameter_list * 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_clone_parameter_list(const struct gl_program_parameter_list *list) 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter_list *clone; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clone = _mesa_new_parameter_list(); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!clone) 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Not too efficient, but correct */ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < list->NumParameters; i++) { 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter *p = list->Parameters + i; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter *pCopy; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint size = MIN2(p->Size, 4); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j = _mesa_add_parameter(clone, p->Type, p->Name, size, p->DataType, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list->ParameterValues[i], NULL, 0x0); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(j >= 0); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pCopy = clone->Parameters + j; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pCopy->Flags = p->Flags; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy state indexes */ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->Type == PROGRAM_STATE_VAR) { 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint k; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < STATE_LENGTH; k++) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pCopy->StateIndexes[k] = p->StateIndexes[k]; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clone->Parameters[j].Size = p->Size; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clone->StateFlags = list->StateFlags; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return clone; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return a new parameter list which is listA + listB. 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_program_parameter_list * 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_combine_parameter_lists(const struct gl_program_parameter_list *listA, 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_program_parameter_list *listB) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter_list *list; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (listA) { 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = _mesa_clone_parameter_list(listA); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (list && listB) { 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < listB->NumParameters; i++) { 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter *param = listB->Parameters + i; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_parameter(list, param->Type, param->Name, param->Size, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param->DataType, 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org listB->ParameterValues[i], 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param->StateIndexes, 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param->Flags); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (listB) { 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = _mesa_clone_parameter_list(listB); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = NULL; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return list; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Count the number of parameters in the last that match the given type. 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_num_parameters_of_type(const struct gl_program_parameter_list *list, 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_register_file type) 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, count = 0; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (list) { 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < list->NumParameters; i++) { 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (list->Parameters[i].Type == type) 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count++; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return count; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 670