Home | History | Annotate | Download | only in glsl
      1 /* -*- c++ -*- */
      2 /*
      3  * Copyright  2010 Intel Corporation
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * 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 OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #pragma once
     26 #ifndef GLSL_LINKER_H
     27 #define GLSL_LINKER_H
     28 
     29 extern bool
     30 link_function_calls(gl_shader_program *prog, gl_linked_shader *main,
     31                     gl_shader **shader_list, unsigned num_shaders);
     32 
     33 extern void
     34 link_invalidate_variable_locations(exec_list *ir);
     35 
     36 extern void
     37 link_assign_uniform_locations(struct gl_shader_program *prog,
     38                               struct gl_context *ctx,
     39                               unsigned int num_explicit_uniform_locs);
     40 
     41 extern void
     42 link_set_uniform_initializers(struct gl_shader_program *prog,
     43                               unsigned int boolean_true);
     44 
     45 extern int
     46 link_cross_validate_uniform_block(void *mem_ctx,
     47                                   struct gl_uniform_block **linked_blocks,
     48                                   unsigned int *num_linked_blocks,
     49                                   struct gl_uniform_block *new_block);
     50 
     51 extern void
     52 link_uniform_blocks(void *mem_ctx,
     53                     struct gl_context *ctx,
     54                     struct gl_shader_program *prog,
     55                     struct gl_linked_shader *shader,
     56                     struct gl_uniform_block **ubo_blocks,
     57                     unsigned *num_ubo_blocks,
     58                     struct gl_uniform_block **ssbo_blocks,
     59                     unsigned *num_ssbo_blocks);
     60 
     61 bool
     62 validate_intrastage_arrays(struct gl_shader_program *prog,
     63                            ir_variable *const var,
     64                            ir_variable *const existing);
     65 
     66 void
     67 validate_intrastage_interface_blocks(struct gl_shader_program *prog,
     68                                      const gl_shader **shader_list,
     69                                      unsigned num_shaders);
     70 
     71 void
     72 validate_interstage_inout_blocks(struct gl_shader_program *prog,
     73                                  const gl_linked_shader *producer,
     74                                  const gl_linked_shader *consumer);
     75 
     76 void
     77 validate_interstage_uniform_blocks(struct gl_shader_program *prog,
     78                                    gl_linked_shader **stages);
     79 
     80 extern void
     81 link_assign_atomic_counter_resources(struct gl_context *ctx,
     82                                      struct gl_shader_program *prog);
     83 
     84 extern void
     85 link_check_atomic_counter_resources(struct gl_context *ctx,
     86                                     struct gl_shader_program *prog);
     87 
     88 
     89 extern struct gl_linked_shader *
     90 link_intrastage_shaders(void *mem_ctx,
     91                         struct gl_context *ctx,
     92                         struct gl_shader_program *prog,
     93                         struct gl_shader **shader_list,
     94                         unsigned num_shaders,
     95                         bool allow_missing_main);
     96 
     97 /**
     98  * Class for processing all of the leaf fields of a variable that corresponds
     99  * to a program resource.
    100  *
    101  * The leaf fields are all the parts of the variable that the application
    102  * could query using \c glGetProgramResourceIndex (or that could be returned
    103  * by \c glGetProgramResourceName).
    104  *
    105  * Classes my derive from this class to implement specific functionality.
    106  * This class only provides the mechanism to iterate over the leaves.  Derived
    107  * classes must implement \c ::visit_field and may override \c ::process.
    108  */
    109 class program_resource_visitor {
    110 public:
    111    /**
    112     * Begin processing a variable
    113     *
    114     * Classes that overload this function should call \c ::process from the
    115     * base class to start the recursive processing of the variable.
    116     *
    117     * \param var  The variable that is to be processed
    118     *
    119     * Calls \c ::visit_field for each leaf of the variable.
    120     *
    121     * \warning
    122     * When processing a uniform block, this entry should only be used in cases
    123     * where the row / column ordering of matrices in the block does not
    124     * matter.  For example, enumerating the names of members of the block, but
    125     * not for determining the offsets of members.
    126     */
    127    void process(ir_variable *var);
    128 
    129    /**
    130     * Begin processing a variable of a structured type.
    131     *
    132     * This flavor of \c process should be used to handle structured types
    133     * (i.e., structures, interfaces, or arrays there of) that need special
    134     * name handling.  A common usage is to handle cases where the block name
    135     * (instead of the instance name) is used for an interface block.
    136     *
    137     * \param type  Type that is to be processed, associated with \c name
    138     * \param name  Base name of the structured variable being processed
    139     *
    140     * \note
    141     * \c type must be \c GLSL_TYPE_RECORD, \c GLSL_TYPE_INTERFACE, or an array
    142     * there of.
    143     */
    144    void process(const glsl_type *type, const char *name);
    145 
    146 protected:
    147    /**
    148     * Method invoked for each leaf of the variable
    149     *
    150     * \param type  Type of the field.
    151     * \param name  Fully qualified name of the field.
    152     * \param row_major  For a matrix type, is it stored row-major.
    153     * \param record_type  Type of the record containing the field.
    154     * \param last_field   Set if \c name is the last field of the structure
    155     *                     containing it.  This will always be false for items
    156     *                     not contained in a structure or interface block.
    157     */
    158    virtual void visit_field(const glsl_type *type, const char *name,
    159                             bool row_major, const glsl_type *record_type,
    160                             const enum glsl_interface_packing packing,
    161                             bool last_field) = 0;
    162 
    163    /**
    164     * Visit a record before visiting its fields
    165     *
    166     * For structures-of-structures or interfaces-of-structures, this visits
    167     * the inner structure before visiting its fields.
    168     *
    169     * The default implementation does nothing.
    170     */
    171    virtual void visit_field(const glsl_struct_field *field);
    172 
    173    virtual void enter_record(const glsl_type *type, const char *name,
    174                              bool row_major, const enum glsl_interface_packing packing);
    175 
    176    virtual void leave_record(const glsl_type *type, const char *name,
    177                              bool row_major, const enum glsl_interface_packing packing);
    178 
    179    virtual void set_buffer_offset(unsigned offset);
    180 
    181    virtual void set_record_array_count(unsigned record_array_count);
    182 
    183 private:
    184    /**
    185     * \param name_length  Length of the current name \b not including the
    186     *                     terminating \c NUL character.
    187     * \param last_field   Set if \c name is the last field of the structure
    188     *                     containing it.  This will always be false for items
    189     *                     not contained in a structure or interface block.
    190     */
    191    void recursion(const glsl_type *t, char **name, size_t name_length,
    192                   bool row_major, const glsl_type *record_type,
    193                   const enum glsl_interface_packing packing,
    194                   bool last_field, unsigned record_array_count,
    195                   const glsl_struct_field *named_ifc_member);
    196 };
    197 
    198 void
    199 linker_error(gl_shader_program *prog, const char *fmt, ...);
    200 
    201 void
    202 linker_warning(gl_shader_program *prog, const char *fmt, ...);
    203 
    204 /**
    205  * Sometimes there are empty slots left over in UniformRemapTable after we
    206  * allocate slots to explicit locations. This struct represents a single
    207  * continouous block of empty slots in UniformRemapTable.
    208  */
    209 struct empty_uniform_block {
    210    struct exec_node link;
    211    /* The start location of the block */
    212    unsigned start;
    213    /* The number of slots in the block */
    214    unsigned slots;
    215 };
    216 
    217 #endif /* GLSL_LINKER_H */
    218