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    GLboolean Initialized;   /**< debug: Has the ParameterValue[] been set? */
     73    /**
     74     * A sequence of STATE_* tokens and integers to identify GL state.
     75     */
     76    gl_state_index StateIndexes[STATE_LENGTH];
     77 };
     78 
     79 
     80 /**
     81  * List of gl_program_parameter instances.
     82  */
     83 struct gl_program_parameter_list
     84 {
     85    GLuint Size;           /**< allocated size of Parameters, ParameterValues */
     86    GLuint NumParameters;  /**< number of parameters in arrays */
     87    struct gl_program_parameter *Parameters; /**< Array [Size] */
     88    gl_constant_value (*ParameterValues)[4]; /**< Array [Size] of constant[4] */
     89    GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes
     90                                might invalidate ParameterValues[] */
     91 };
     92 
     93 
     94 extern struct gl_program_parameter_list *
     95 _mesa_new_parameter_list(void);
     96 
     97 extern struct gl_program_parameter_list *
     98 _mesa_new_parameter_list_sized(unsigned size);
     99 
    100 extern void
    101 _mesa_free_parameter_list(struct gl_program_parameter_list *paramList);
    102 
    103 extern void
    104 _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
    105                                 unsigned reserve_slots);
    106 
    107 extern GLint
    108 _mesa_add_parameter(struct gl_program_parameter_list *paramList,
    109                     gl_register_file type, const char *name,
    110                     GLuint size, GLenum datatype,
    111                     const gl_constant_value *values,
    112                     const gl_state_index state[STATE_LENGTH]);
    113 
    114 extern GLint
    115 _mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
    116                            const gl_constant_value values[4], GLuint size,
    117                            GLenum datatype, GLuint *swizzleOut);
    118 
    119 static inline GLint
    120 _mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
    121                            const gl_constant_value values[4], GLuint size,
    122                            GLuint *swizzleOut)
    123 {
    124    return _mesa_add_typed_unnamed_constant(paramList, values, size, GL_NONE,
    125                                            swizzleOut);
    126 }
    127 
    128 extern GLint
    129 _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
    130                           const gl_state_index stateTokens[STATE_LENGTH]);
    131 
    132 
    133 static inline GLint
    134 _mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList,
    135                              const char *name)
    136 {
    137    if (!paramList)
    138       return -1;
    139 
    140    /* name must be null-terminated */
    141    for (GLint i = 0; i < (GLint) paramList->NumParameters; i++) {
    142       if (paramList->Parameters[i].Name &&
    143          strcmp(paramList->Parameters[i].Name, name) == 0)
    144          return i;
    145    }
    146 
    147    return -1;
    148 }
    149 
    150 #ifdef __cplusplus
    151 }
    152 #endif
    153 
    154 #endif /* PROG_PARAMETER_H */
    155