From 6ac895a664b25eb6252f33d5cfb0e9dd33190490 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 8 Nov 2011 12:30:58 -0800 Subject: [PATCH] linker: Count the number of uniform components used by a shader during linking Signed-off-by: Ian Romanick Reviewed-by: Kenneth Graunke --- src/glsl/link_uniforms.cpp | 19 +++++++++++++++++-- src/mesa/main/mtypes.h | 7 +++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp index 11447f380bb..ca5da30401c 100644 --- a/src/glsl/link_uniforms.cpp +++ b/src/glsl/link_uniforms.cpp @@ -114,7 +114,7 @@ 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), num_shader_samplers(0), - map(map) + num_shader_uniforms(0), map(map) { /* empty */ } @@ -122,6 +122,7 @@ public: void start_shader() { this->num_shader_samplers = 0; + this->num_shader_uniforms = 0; } /** @@ -139,6 +140,11 @@ public: */ 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) { @@ -150,9 +156,16 @@ private: * 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. @@ -168,7 +181,7 @@ private: * uniforms. */ this->num_active_uniforms++; - this->num_values += values_for_type(type); + this->num_values += values; } struct string_to_uint_map *map; @@ -307,6 +320,8 @@ link_assign_uniform_locations(struct gl_shader_program *prog) } 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; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 47282c0aed5..8495a9c2e63 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2161,6 +2161,13 @@ struct gl_shader 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; -- 2.30.2