Home | History | Annotate | Download | only in program
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * 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 #include <string.h>
     38 
     39 #ifdef __cplusplus
     40 extern "C" {
     41 #endif
     42 
     43 
     44 /**
     45  * Actual data for constant values of parameters.
     46  */
     47 typedef union gl_constant_value
     48 {
     49    GLfloat f;
     50    GLint b;
     51    GLint i;
     52    GLuint u;
     53 } gl_constant_value;
     54 
     55 
     56 /**
     57  * Program parameter.
     58  * Used by shaders/programs for uniforms, constants, varying vars, etc.
     59  */
     60 struct gl_program_parameter
     61 {
     62    const char *Name;        /**< Null-terminated string */
     63    gl_register_file Type;   /**< PROGRAM_CONSTANT or STATE_VAR */
     64    GLenum DataType;         /**< GL_FLOAT, GL_FLOAT_VEC2, etc */
     65    /**
     66     * Number of components (1..4), or more.
     67     * If the number of components is greater than 4,
     68     * this parameter is part of a larger uniform like a GLSL matrix or array.
     69     * The next program parameter's Size will be Size-4 of this parameter.
     70     */
     71    GLuint Size;
     72    /**
     73     * A sequence of STATE_* tokens and integers to identify GL state.
     74     */
     75    gl_state_index StateIndexes[STATE_LENGTH];
     76 };
     77 
     78 
     79 /**
     80  * List of gl_program_parameter instances.
     81  */
     82 struct gl_program_parameter_list
     83 {
     84    GLuint Size;           /**< allocated size of Parameters, ParameterValues */
     85    GLuint NumParameters;  /**< number of parameters in arrays */
     86    struct gl_program_parameter *Parameters; /**< Array [Size] */
     87    gl_constant_value (*ParameterValues)[4]; /**< Array [Size] of constant[4] */
     88    GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes
     89                                might invalidate ParameterValues[] */
     90 };
     91 
     92 
     93 extern struct gl_program_parameter_list *
     94 _mesa_new_parameter_list(void);
     95 
     96 extern struct gl_program_parameter_list *
     97 _mesa_new_parameter_list_sized(unsigned size);
     98 
     99 extern void
    100 _mesa_free_parameter_list(struct gl_program_parameter_list *paramList);
    101 
    102 extern void
    103 _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
    104                                 unsigned reserve_slots);
    105 
    106 extern GLint
    107 _mesa_add_parameter(struct gl_program_parameter_list *paramList,
    108                     gl_register_file type, const char *name,
    109                     GLuint size, GLenum datatype,
    110                     const gl_constant_value *values,
    111                     const gl_state_index state[STATE_LENGTH]);
    112 
    113 extern GLint
    114 _mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
    115                            const gl_constant_value values[4], GLuint size,
    116                            GLenum datatype, GLuint *swizzleOut);
    117 
    118 static inline GLint
    119 _mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
    120                            const gl_constant_value values[4], GLuint size,
    121                            GLuint *swizzleOut)
    122 {
    123    return _mesa_add_typed_unnamed_constant(paramList, values, size, GL_NONE,
    124                                            swizzleOut);
    125 }
    126 
    127 extern GLint
    128 _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
    129                           const gl_state_index stateTokens[STATE_LENGTH]);
    130 
    131 
    132 static inline GLint
    133 _mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList,
    134                              const char *name)
    135 {
    136    if (!paramList)
    137       return -1;
    138 
    139    /* name must be null-terminated */
    140    for (GLint i = 0; i < (GLint) paramList->NumParameters; i++) {
    141       if (paramList->Parameters[i].Name &&
    142          strcmp(paramList->Parameters[i].Name, name) == 0)
    143          return i;
    144    }
    145 
    146    return -1;
    147 }
    148 
    149 #ifdef __cplusplus
    150 }
    151 #endif
    152 
    153 #endif /* PROG_PARAMETER_H */
    154