summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2011-11-08 12:30:58 -0800
committerIan Romanick <[email protected]>2011-11-14 11:08:49 -0800
commit6ac895a664b25eb6252f33d5cfb0e9dd33190490 (patch)
treec94a0a9ce4894322ffe7d93dfd2506b5e5fe36b9
parent812aa8839388042609f65ed00ae4fbfdb60a11d6 (diff)
linker: Count the number of uniform components used by a shader during linking
Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/glsl/link_uniforms.cpp19
-rw-r--r--src/mesa/main/mtypes.h7
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;