summaryrefslogtreecommitdiff
path: root/src/glsl/glsl_types.cpp
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2013-07-31 08:15:08 -0700
committerPaul Berry <stereotype441@gmail.com>2013-08-01 20:19:02 -0700
commit0026ad4994ca88a6cdd4e5ef4098469ab57bdcc1 (patch)
treeb3ea77af8a0ae4c5a9482b3fe0b386b53ec4aa01 /src/glsl/glsl_types.cpp
parent906eff09e374c75b0486011b73b7048f6070456e (diff)
Move count_attribute_slots() out of the linker and into glsl_type.
Our previous justification for leaving this function out of glsl_type was that it implemented counting rules that were specific to GLSL 1.50. However, these counting rules also describe the number of varying slots that Mesa will assign to a varying in the absence of varying packing. That's useful to be able to compute from outside of the linker code (a future patch will use it from ir_set_program_inouts.cpp). So go ahead and move it to glsl_type. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/glsl/glsl_types.cpp')
-rw-r--r--src/glsl/glsl_types.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 8324b8ade7a..0c639b3eb87 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -828,3 +828,31 @@ glsl_type::std140_size(bool row_major) const
assert(!"not reached");
return -1;
}
+
+
+unsigned
+glsl_type::count_attribute_slots() const
+{
+ /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
+ *
+ * "A scalar input counts the same amount against this limit as a vec4,
+ * so applications may want to consider packing groups of four
+ * unrelated float inputs together into a vector to better utilize the
+ * capabilities of the underlying hardware. A matrix input will use up
+ * multiple locations. The number of locations used will equal the
+ * number of columns in the matrix."
+ *
+ * The spec does not explicitly say how arrays are counted. However, it
+ * should be safe to assume the total number of slots consumed by an array
+ * is the number of entries in the array multiplied by the number of slots
+ * consumed by a single element of the array.
+ */
+
+ if (this->is_array())
+ return this->array_size() * this->element_type()->count_attribute_slots();
+
+ if (this->is_matrix())
+ return this->matrix_columns;
+
+ return 1;
+}