linker: Count the number of uniform components used by a shader during linking
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 8 Nov 2011 20:30:58 +0000 (12:30 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 14 Nov 2011 19:08:49 +0000 (11:08 -0800)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_uniforms.cpp
src/mesa/main/mtypes.h

index 11447f380bbe47fbf1f9acb0800abd0a75f1d22d..ca5da30401cde2f0eef5822c2fc4a91a4f1f122e 100644 (file)
@@ -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;
index 47282c0aed5c82e4901fd48e71ac6a2dba28b725..8495a9c2e634815d6da6e12b759665cbaefb3cd9 100644 (file)
@@ -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;