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_shader *main,
     31 		    gl_shader **shader_list, unsigned num_shaders);
     32 
     33 extern void
     34 link_invalidate_variable_locations(gl_shader *sh, enum ir_variable_mode mode,
     35 				   int generic_base);
     36 
     37 extern void
     38 link_assign_uniform_locations(struct gl_shader_program *prog);
     39 
     40 extern void
     41 link_set_uniform_initializers(struct gl_shader_program *prog);
     42 
     43 extern int
     44 link_cross_validate_uniform_block(void *mem_ctx,
     45 				  struct gl_uniform_block **linked_blocks,
     46 				  unsigned int *num_linked_blocks,
     47 				  struct gl_uniform_block *new_block);
     48 
     49 void
     50 link_assign_uniform_block_offsets(struct gl_shader *shader);
     51 
     52 /**
     53  * Class for processing all of the leaf fields of an uniform
     54  *
     55  * Leaves are, roughly speaking, the parts of the uniform that the application
     56  * could query with \c glGetUniformLocation (or that could be returned by
     57  * \c glGetActiveUniforms).
     58  *
     59  * Classes my derive from this class to implement specific functionality.
     60  * This class only provides the mechanism to iterate over the leaves.  Derived
     61  * classes must implement \c ::visit_field and may override \c ::process.
     62  */
     63 class uniform_field_visitor {
     64 public:
     65    /**
     66     * Begin processing a uniform
     67     *
     68     * Classes that overload this function should call \c ::process from the
     69     * base class to start the recursive processing of the uniform.
     70     *
     71     * \param var  The uniform variable that is to be processed
     72     *
     73     * Calls \c ::visit_field for each leaf of the uniform.
     74     */
     75    void process(ir_variable *var);
     76 
     77 protected:
     78    /**
     79     * Method invoked for each leaf of the uniform
     80     *
     81     * \param type  Type of the field.
     82     * \param name  Fully qualified name of the field.
     83     */
     84    virtual void visit_field(const glsl_type *type, const char *name) = 0;
     85 
     86 private:
     87    /**
     88     * \param name_length  Length of the current name \b not including the
     89     *                     terminating \c NUL character.
     90     */
     91    void recursion(const glsl_type *t, char **name, size_t name_length);
     92 };
     93 
     94 #endif /* GLSL_LINKER_H */
     95