public:
count_uniform_size(struct string_to_uint_map *map)
: num_active_uniforms(0), num_values(0), num_shader_samplers(0),
- map(map)
+ num_shader_uniforms(0), map(map)
{
/* empty */
}
void start_shader()
{
this->num_shader_samplers = 0;
+ this->num_shader_uniforms = 0;
}
/**
*/
unsigned num_shader_samplers;
+ /**
+ * Number of uniforms used in the current shader
+ */
+ unsigned num_shader_uniforms;
+
private:
virtual void visit_field(const glsl_type *type, const char *name)
{
* uniform for multiple shader targets, but in this case we want to
* count it for each shader target.
*/
+ const unsigned values = values_for_type(type);
if (type->contains_sampler()) {
this->num_shader_samplers +=
type->is_array() ? type->array_size() : 1;
+ } else {
+ /* Accumulate the total number of uniform slots used by this shader.
+ * Note that samplers do not count against this limit because they
+ * don't use any storage on current hardware.
+ */
+ this->num_shader_uniforms += values;
}
/* If the uniform is already in the map, there's nothing more to do.
* uniforms.
*/
this->num_active_uniforms++;
- this->num_values += values_for_type(type);
+ this->num_values += values;
}
struct string_to_uint_map *map;
}
prog->_LinkedShaders[i]->num_samplers = uniform_size.num_shader_samplers;
+ prog->_LinkedShaders[i]->num_uniform_components =
+ uniform_size.num_shader_uniforms * 4;
}
const unsigned num_user_uniforms = uniform_size.num_active_uniforms;
unsigned num_samplers; /**< Number of samplers used by this shader.
* This field is only set post-linking.
*/
+ /**
+ * Number of uniform components used by this shader.
+ *
+ * This field is only set post-linking.
+ */
+ unsigned num_uniform_components;
+
struct exec_list *ir;
struct glsl_symbol_table *symbols;