From: Ian Romanick Date: Tue, 22 Jan 2013 04:42:19 +0000 (-0500) Subject: glsl: Add new uniform_field_visitor::process variant X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=99b8935ce2d63902bdb3e5a76154240f0e011b80;p=mesa.git glsl: Add new uniform_field_visitor::process variant This flavor takes a type and a base name. It will be used to handle cases where the block name (instead of the instance name) is used for an interface block. Signed-off-by: Ian Romanick Reviewed-by: Carl Worth Reviewed-by: Kenneth Graunke --- diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp index c77f83abab1..737e2ad48a6 100644 --- a/src/glsl/link_uniforms.cpp +++ b/src/glsl/link_uniforms.cpp @@ -57,6 +57,19 @@ values_for_type(const glsl_type *type) } } +void +uniform_field_visitor::process(const glsl_type *type, const char *name) +{ + assert(type->is_record() + || (type->is_array() && type->fields.array->is_record()) + || type->is_interface() + || (type->is_array() && type->fields.array->is_interface())); + + char *name_copy = ralloc_strdup(NULL, name); + recursion(type, &name_copy, strlen(name), false); + ralloc_free(name_copy); +} + void uniform_field_visitor::process(ir_variable *var) { @@ -161,6 +174,15 @@ public: this->num_shader_uniform_components = 0; } + void process(ir_variable *var) + { + if (var->is_interface_instance()) + uniform_field_visitor::process(var->interface_type, + var->interface_type->name); + else + uniform_field_visitor::process(var); + } + /** * Total number of active uniforms counted */ diff --git a/src/glsl/linker.h b/src/glsl/linker.h index 95937d4ee87..5818f7ead99 100644 --- a/src/glsl/linker.h +++ b/src/glsl/linker.h @@ -84,6 +84,23 @@ public: */ void process(ir_variable *var); + /** + * Begin processing a uniform of a structured type. + * + * This flavor of \c process should be used to handle structured types + * (i.e., structures, interfaces, or arrays there of) that need special + * name handling. A common usage is to handle cases where the block name + * (instead of the instance name) is used for an interface block. + * + * \param type Type that is to be processed, associated with \c name + * \param name Base name of the structured uniform being processed + * + * \note + * \c type must be \c GLSL_TYPE_RECORD, \c GLSL_TYPE_INTERFACE, or an array + * there of. + */ + void process(const glsl_type *type, const char *name); + protected: /** * Method invoked for each leaf of the uniform