Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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. extern bool
  53. link_uniform_blocks_are_compatible(const gl_uniform_block *a,
  54.                                    const gl_uniform_block *b);
  55.  
  56. extern int
  57. link_uniform_blocks(void *mem_ctx,
  58.                     struct gl_shader_program *prog,
  59.                     struct gl_shader **shader_list,
  60.                     unsigned num_shaders,
  61.                     struct gl_uniform_block **blocks_ret);
  62.  
  63. bool
  64. validate_intrastage_interface_blocks(const gl_shader **shader_list,
  65.                                      unsigned num_shaders);
  66.  
  67. bool
  68. validate_interstage_interface_blocks(const gl_shader *producer,
  69.                                      const gl_shader *consumer);
  70.  
  71. /**
  72.  * Class for processing all of the leaf fields of a variable that corresponds
  73.  * to a program resource.
  74.  *
  75.  * The leaf fields are all the parts of the variable that the application
  76.  * could query using \c glGetProgramResourceIndex (or that could be returned
  77.  * by \c glGetProgramResourceName).
  78.  *
  79.  * Classes my derive from this class to implement specific functionality.
  80.  * This class only provides the mechanism to iterate over the leaves.  Derived
  81.  * classes must implement \c ::visit_field and may override \c ::process.
  82.  */
  83. class program_resource_visitor {
  84. public:
  85.    /**
  86.     * Begin processing a variable
  87.     *
  88.     * Classes that overload this function should call \c ::process from the
  89.     * base class to start the recursive processing of the variable.
  90.     *
  91.     * \param var  The variable that is to be processed
  92.     *
  93.     * Calls \c ::visit_field for each leaf of the variable.
  94.     *
  95.     * \warning
  96.     * When processing a uniform block, this entry should only be used in cases
  97.     * where the row / column ordering of matrices in the block does not
  98.     * matter.  For example, enumerating the names of members of the block, but
  99.     * not for determining the offsets of members.
  100.     */
  101.    void process(ir_variable *var);
  102.  
  103.    /**
  104.     * Begin processing a variable of a structured type.
  105.     *
  106.     * This flavor of \c process should be used to handle structured types
  107.     * (i.e., structures, interfaces, or arrays there of) that need special
  108.     * name handling.  A common usage is to handle cases where the block name
  109.     * (instead of the instance name) is used for an interface block.
  110.     *
  111.     * \param type  Type that is to be processed, associated with \c name
  112.     * \param name  Base name of the structured variable being processed
  113.     *
  114.     * \note
  115.     * \c type must be \c GLSL_TYPE_RECORD, \c GLSL_TYPE_INTERFACE, or an array
  116.     * there of.
  117.     */
  118.    void process(const glsl_type *type, const char *name);
  119.  
  120. protected:
  121.    /**
  122.     * Method invoked for each leaf of the variable
  123.     *
  124.     * \param type  Type of the field.
  125.     * \param name  Fully qualified name of the field.
  126.     * \param row_major  For a matrix type, is it stored row-major.
  127.     * \param record_type  Type of the record containing the field.
  128.     *
  129.     * The default implementation just calls the other \c visit_field method.
  130.     */
  131.    virtual void visit_field(const glsl_type *type, const char *name,
  132.                             bool row_major, const glsl_type *record_type);
  133.  
  134.    /**
  135.     * Method invoked for each leaf of the variable
  136.     *
  137.     * \param type  Type of the field.
  138.     * \param name  Fully qualified name of the field.
  139.     * \param row_major  For a matrix type, is it stored row-major.
  140.     */
  141.    virtual void visit_field(const glsl_type *type, const char *name,
  142.                             bool row_major) = 0;
  143.  
  144.    /**
  145.     * Visit a record before visiting its fields
  146.     *
  147.     * For structures-of-structures or interfaces-of-structures, this visits
  148.     * the inner structure before visiting its fields.
  149.     *
  150.     * The default implementation does nothing.
  151.     */
  152.    virtual void visit_field(const glsl_struct_field *field);
  153.  
  154. private:
  155.    /**
  156.     * \param name_length  Length of the current name \b not including the
  157.     *                     terminating \c NUL character.
  158.     */
  159.    void recursion(const glsl_type *t, char **name, size_t name_length,
  160.                   bool row_major, const glsl_type *record_type);
  161. };
  162.  
  163. void
  164. linker_error(gl_shader_program *prog, const char *fmt, ...);
  165.  
  166. void
  167. linker_warning(gl_shader_program *prog, const char *fmt, ...);
  168.  
  169. unsigned
  170. count_attribute_slots(const glsl_type *t);
  171.  
  172. #endif /* GLSL_LINKER_H */
  173.