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