Home | History | Annotate | Download | only in glsl
      1 /*
      2  * Copyright  2011 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #pragma once
     25 #ifndef IR_UNIFORM_H
     26 #define IR_UNIFORM_H
     27 
     28 
     29 /* stdbool.h is necessary because this file is included in both C and C++ code.
     30  */
     31 #include <stdbool.h>
     32 
     33 #include "program/prog_parameter.h"  /* For union gl_constant_value. */
     34 
     35 
     36 #ifdef __cplusplus
     37 extern "C" {
     38 #endif
     39 
     40 enum gl_uniform_driver_format {
     41    uniform_native = 0,          /**< Store data in the native format. */
     42    uniform_int_float,           /**< Store integer data as floats. */
     43    uniform_bool_float,          /**< Store boolean data as floats. */
     44 
     45    /**
     46     * Store boolean data as integer using 1 for \c true.
     47     */
     48    uniform_bool_int_0_1,
     49 
     50    /**
     51     * Store boolean data as integer using ~0 for \c true.
     52     */
     53    uniform_bool_int_0_not0
     54 };
     55 
     56 struct gl_uniform_driver_storage {
     57    /**
     58     * Number of bytes from one array element to the next.
     59     */
     60    uint8_t element_stride;
     61 
     62    /**
     63     * Number of bytes from one vector in a matrix to the next.
     64     */
     65    uint8_t vector_stride;
     66 
     67    /**
     68     * Base format of the stored data.
     69     *
     70     * This field must have a value from \c GLSL_TYPE_UINT through \c
     71     * GLSL_TYPE_SAMPLER.
     72     */
     73    uint8_t format;
     74 
     75    /**
     76     * Pointer to the base of the data.
     77     */
     78    void *data;
     79 };
     80 
     81 struct gl_uniform_storage {
     82    char *name;
     83    const struct glsl_type *type;
     84 
     85    /**
     86     * The number of elements in this uniform.
     87     *
     88     * For non-arrays, this is always 0.  For arrays, the value is the size of
     89     * the array.
     90     */
     91    unsigned array_elements;
     92 
     93    /**
     94     * Has this uniform ever been set?
     95     */
     96    bool initialized;
     97 
     98    /**
     99     * Base sampler index
    100     *
    101     * If \c ::base_type is \c GLSL_TYPE_SAMPLER, this represents the index of
    102     * this sampler.  If \c ::array_elements is not zero, the array will use
    103     * sampler indexes \c ::sampler through \c ::sampler + \c ::array_elements
    104     * - 1, inclusive.
    105     */
    106    uint8_t sampler;
    107 
    108    /**
    109     * Storage used by the driver for the uniform
    110     */
    111    unsigned num_driver_storage;
    112    struct gl_uniform_driver_storage *driver_storage;
    113 
    114    /**
    115     * Storage used by Mesa for the uniform
    116     *
    117     * This form of the uniform is used by Mesa's implementation of \c
    118     * glGetUniform.  It can also be used by drivers to obtain the value of the
    119     * uniform if the \c ::driver_storage interface is not used.
    120     */
    121    union gl_constant_value *storage;
    122 
    123    /** Fields for GL_ARB_uniform_buffer_object
    124     * @{
    125     */
    126 
    127    /**
    128     * GL_UNIFORM_BLOCK_INDEX: index of the uniform block containing
    129     * the uniform, or -1 for the default uniform block.  Note that the
    130     * index is into the linked program's UniformBlocks[] array, not
    131     * the linked shader's.
    132     */
    133    int block_index;
    134 
    135    /** GL_UNIFORM_OFFSET: byte offset within the uniform block, or -1. */
    136    int offset;
    137 
    138    /**
    139     * GL_UNIFORM_MATRIX_STRIDE: byte stride between columns or rows of
    140     * a matrix.  Set to 0 for non-matrices in UBOs, or -1 for uniforms
    141     * in the default uniform block.
    142     */
    143    int matrix_stride;
    144 
    145    /**
    146     * GL_UNIFORM_ARRAY_STRIDE: byte stride between elements of the
    147     * array.  Set to zero for non-arrays in UBOs, or -1 for uniforms
    148     * in the default uniform block.
    149     */
    150    int array_stride;
    151 
    152    /** GL_UNIFORM_ROW_MAJOR: true iff it's a row-major matrix in a UBO */
    153    bool row_major;
    154 
    155    /** @} */
    156 };
    157 
    158 #ifdef __cplusplus
    159 }
    160 #endif
    161 
    162 #endif /* IR_UNIFORM_H */
    163