diff options
Diffstat (limited to 'mesalib/src/glsl/linker.h')
-rw-r--r-- | mesalib/src/glsl/linker.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/mesalib/src/glsl/linker.h b/mesalib/src/glsl/linker.h index 769cf68b6..78c632961 100644 --- a/mesalib/src/glsl/linker.h +++ b/mesalib/src/glsl/linker.h @@ -1,3 +1,4 @@ +/* -*- c++ -*- */ /* * Copyright © 2010 Intel Corporation * @@ -29,4 +30,46 @@ extern bool link_function_calls(gl_shader_program *prog, gl_shader *main, gl_shader **shader_list, unsigned num_shaders); +/** + * Class for processing all of the leaf fields of an uniform + * + * Leaves are, roughly speaking, the parts of the uniform that the application + * could query with \c glGetUniformLocation (or that could be returned by + * \c glGetActiveUniforms). + * + * Classes my derive from this class to implement specific functionality. + * This class only provides the mechanism to iterate over the leaves. Derived + * classes must implement \c ::visit_field and may override \c ::process. + */ +class uniform_field_visitor { +public: + /** + * Begin processing a uniform + * + * Classes that overload this function should call \c ::process from the + * base class to start the recursive processing of the uniform. + * + * \param var The uniform variable that is to be processed + * + * Calls \c ::visit_field for each leaf of the uniform. + */ + void process(ir_variable *var); + +protected: + /** + * Method invoked for each leaf of the uniform + * + * \param type Type of the field. + * \param name Fully qualified name of the field. + */ + virtual void visit_field(const glsl_type *type, const char *name) = 0; + +private: + /** + * \param name_length Length of the current name \b not including the + * terminating \c NUL character. + */ + void recursion(const glsl_type *t, char **name, unsigned name_length); +}; + #endif /* GLSL_LINKER_H */ |