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