1/* 2 * Mesa 3-D graphics library 3 * Version: 7.3 4 * 5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25/** 26 * \file prog_parameter.c 27 * Program parameter lists and functions. 28 * \author Brian Paul 29 */ 30 31#ifndef PROG_PARAMETER_H 32#define PROG_PARAMETER_H 33 34#include "main/mtypes.h" 35#include "prog_statevars.h" 36 37 38#ifdef __cplusplus 39extern "C" { 40#endif 41 42 43/** 44 * Program parameter flags 45 */ 46/*@{*/ 47#define PROG_PARAM_BIT_CENTROID 0x1 /**< for varying vars (GLSL 1.20) */ 48#define PROG_PARAM_BIT_INVARIANT 0x2 /**< for varying vars (GLSL 1.20) */ 49#define PROG_PARAM_BIT_FLAT 0x4 /**< for varying vars (GLSL 1.30) */ 50#define PROG_PARAM_BIT_LINEAR 0x8 /**< for varying vars (GLSL 1.30) */ 51#define PROG_PARAM_BIT_CYL_WRAP 0x10 /**< XXX gallium debug */ 52/*@}*/ 53 54 55/** 56 * Actual data for constant values of parameters. 57 */ 58typedef union gl_constant_value 59{ 60 GLfloat f; 61 GLint b; 62 GLint i; 63 GLuint u; 64} gl_constant_value; 65 66 67/** 68 * Program parameter. 69 * Used by shaders/programs for uniforms, constants, varying vars, etc. 70 */ 71struct gl_program_parameter 72{ 73 const char *Name; /**< Null-terminated string */ 74 gl_register_file Type; /**< PROGRAM_NAMED_PARAM, CONSTANT or STATE_VAR */ 75 GLenum DataType; /**< GL_FLOAT, GL_FLOAT_VEC2, etc */ 76 /** 77 * Number of components (1..4), or more. 78 * If the number of components is greater than 4, 79 * this parameter is part of a larger uniform like a GLSL matrix or array. 80 * The next program parameter's Size will be Size-4 of this parameter. 81 */ 82 GLuint Size; 83 GLboolean Initialized; /**< debug: Has the ParameterValue[] been set? */ 84 GLbitfield Flags; /**< Bitmask of PROG_PARAM_*_BIT */ 85 /** 86 * A sequence of STATE_* tokens and integers to identify GL state. 87 */ 88 gl_state_index StateIndexes[STATE_LENGTH]; 89}; 90 91 92/** 93 * List of gl_program_parameter instances. 94 */ 95struct gl_program_parameter_list 96{ 97 GLuint Size; /**< allocated size of Parameters, ParameterValues */ 98 GLuint NumParameters; /**< number of parameters in arrays */ 99 struct gl_program_parameter *Parameters; /**< Array [Size] */ 100 gl_constant_value (*ParameterValues)[4]; /**< Array [Size] of constant[4] */ 101 GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes 102 might invalidate ParameterValues[] */ 103}; 104 105 106extern struct gl_program_parameter_list * 107_mesa_new_parameter_list(void); 108 109extern struct gl_program_parameter_list * 110_mesa_new_parameter_list_sized(unsigned size); 111 112extern void 113_mesa_free_parameter_list(struct gl_program_parameter_list *paramList); 114 115extern struct gl_program_parameter_list * 116_mesa_clone_parameter_list(const struct gl_program_parameter_list *list); 117 118extern struct gl_program_parameter_list * 119_mesa_combine_parameter_lists(const struct gl_program_parameter_list *a, 120 const struct gl_program_parameter_list *b); 121 122static inline GLuint 123_mesa_num_parameters(const struct gl_program_parameter_list *list) 124{ 125 return list ? list->NumParameters : 0; 126} 127 128extern GLint 129_mesa_add_parameter(struct gl_program_parameter_list *paramList, 130 gl_register_file type, const char *name, 131 GLuint size, GLenum datatype, 132 const gl_constant_value *values, 133 const gl_state_index state[STATE_LENGTH], 134 GLbitfield flags); 135 136extern GLint 137_mesa_add_named_parameter(struct gl_program_parameter_list *paramList, 138 const char *name, const gl_constant_value values[4]); 139 140extern GLint 141_mesa_add_named_constant(struct gl_program_parameter_list *paramList, 142 const char *name, const gl_constant_value values[4], 143 GLuint size); 144 145extern GLint 146_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList, 147 const gl_constant_value values[4], GLuint size, 148 GLenum datatype, GLuint *swizzleOut); 149 150extern GLint 151_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList, 152 const gl_constant_value values[4], GLuint size, 153 GLuint *swizzleOut); 154 155extern GLint 156_mesa_add_varying(struct gl_program_parameter_list *paramList, 157 const char *name, GLuint size, GLenum datatype, 158 GLbitfield flags); 159 160extern GLint 161_mesa_add_attribute(struct gl_program_parameter_list *paramList, 162 const char *name, GLint size, GLenum datatype, GLint attrib); 163 164extern GLint 165_mesa_add_state_reference(struct gl_program_parameter_list *paramList, 166 const gl_state_index stateTokens[STATE_LENGTH]); 167 168extern gl_constant_value * 169_mesa_lookup_parameter_value(const struct gl_program_parameter_list *paramList, 170 GLsizei nameLen, const char *name); 171 172extern GLint 173_mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList, 174 GLsizei nameLen, const char *name); 175 176extern GLboolean 177_mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list, 178 const gl_constant_value v[], GLuint vSize, 179 GLint *posOut, GLuint *swizzleOut); 180 181extern GLuint 182_mesa_num_parameters_of_type(const struct gl_program_parameter_list *list, 183 gl_register_file type); 184 185 186#ifdef __cplusplus 187} 188#endif 189 190#endif /* PROG_PARAMETER_H */ 191