linker: Count the number of samplers used by a shader during linking

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ian Romanick
2011-11-08 11:58:47 -08:00
parent 196c6d4adf
commit 812aa88393
2 changed files with 31 additions and 1 deletions
+28 -1
View File
@@ -113,11 +113,17 @@ uniform_field_visitor::recursion(const glsl_type *t, char **name,
class count_uniform_size : public uniform_field_visitor {
public:
count_uniform_size(struct string_to_uint_map *map)
: num_active_uniforms(0), num_values(0), map(map)
: num_active_uniforms(0), num_values(0), num_shader_samplers(0),
map(map)
{
/* empty */
}
void start_shader()
{
this->num_shader_samplers = 0;
}
/**
* Total number of active uniforms counted
*/
@@ -128,12 +134,27 @@ public:
*/
unsigned num_values;
/**
* Number of samplers used
*/
unsigned num_shader_samplers;
private:
virtual void visit_field(const glsl_type *type, const char *name)
{
assert(!type->is_record());
assert(!(type->is_array() && type->fields.array->is_record()));
/* Count the number of samplers regardless of whether the uniform is
* already in the hash table. The hash table prevents adding the same
* uniform for multiple shader targets, but in this case we want to
* count it for each shader target.
*/
if (type->contains_sampler()) {
this->num_shader_samplers +=
type->is_array() ? type->array_size() : 1;
}
/* If the uniform is already in the map, there's nothing more to do.
*/
unsigned id;
@@ -267,6 +288,10 @@ link_assign_uniform_locations(struct gl_shader_program *prog)
if (prog->_LinkedShaders[i] == NULL)
continue;
/* Reset various per-shader target counts.
*/
uniform_size.start_shader();
foreach_list(node, prog->_LinkedShaders[i]->ir) {
ir_variable *const var = ((ir_instruction *) node)->as_variable();
@@ -280,6 +305,8 @@ link_assign_uniform_locations(struct gl_shader_program *prog)
uniform_size.process(var);
}
prog->_LinkedShaders[i]->num_samplers = uniform_size.num_shader_samplers;
}
const unsigned num_user_uniforms = uniform_size.num_active_uniforms;
+3
View File
@@ -2158,6 +2158,9 @@ struct gl_shader
unsigned Version; /**< GLSL version used for linking */
unsigned num_samplers; /**< Number of samplers used by this shader.
* This field is only set post-linking.
*/
struct exec_list *ir;
struct glsl_symbol_table *symbols;