Mesa (master): glsl/linker: dvec3/ dvec4 consume twice input vertex attributes

Alejandro Pinheiro apinheiro at kemper.freedesktop.org
Mon May 23 08:50:25 UTC 2016


Module: Mesa
Branch: master
Commit: 3c9096eea46fc79e5d734ea0629673d1889966d7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3c9096eea46fc79e5d734ea0629673d1889966d7

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Mon May 23 10:46:42 2016 +0200

glsl/linker: dvec3/dvec4 consume twice input vertex attributes

>From the GL 4.5 core spec, section 11.1.1 (Vertex Attributes):

"A program with more than the value of MAX_VERTEX_ATTRIBS
active attribute variables may fail to link, unless
device-dependent optimizations are able to make the program
fit within available hardware resources. For the purposes
of this test, attribute variables of the type dvec3, dvec4,
dmat2x3, dmat2x4, dmat3, dmat3x4, dmat4x3, and dmat4 may
count as consuming twice as many attributes as equivalent
single-precision types. While these types use the same number
of generic attributes as their single-precision equivalents,
implementations are permitted to consume two single-precision
vectors of internal storage for each three- or four-component
double-precision vector."

This commits makes dvec3, dvec4, dmat2x3, dmat2x4, dmat3, dmat3x4,
dmat4x3 and dmat4 consume twice as many attributes as equivalent
single-precision types.

v3: count doubles as consuming two attributes (Dave Airlie)
v4: make reference to spec (Michael Schellenberger Costa)

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Dave Airlie <airlied at redhat.com>

Signed-off-by: Antia Puentes <apuentes at igalia.com>
Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>

---

 src/compiler/glsl/linker.cpp | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 0b8c494..5e59ae3 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -2873,6 +2873,26 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
       to_assign[i].var->data.location = generic_base + location;
       to_assign[i].var->data.is_unmatched_generic_inout = 0;
       used_locations |= (use_mask << location);
+
+      if (to_assign[i].var->type->without_array()->is_dual_slot_double())
+         double_storage_locations |= (use_mask << location);
+   }
+
+   /* Now that we have all the locations, from the GL 4.5 core spec, section
+    * 11.1.1 (Vertex Attributes), dvec3, dvec4, dmat2x3, dmat2x4, dmat3,
+    * dmat3x4, dmat4x3, and dmat4 count as consuming twice as many attributes
+    * as equivalent single-precision types.
+    */
+   if (target_index == MESA_SHADER_VERTEX) {
+      unsigned total_attribs_size =
+         _mesa_bitcount(used_locations & ((1 << max_index) - 1)) +
+         _mesa_bitcount(double_storage_locations);
+      if (total_attribs_size > max_index) {
+	 linker_error(prog,
+		      "attempt to use %d vertex attribute slots only %d available ",
+		      total_attribs_size, max_index);
+	 return false;
+      }
    }
 
    return true;




More information about the mesa-commit mailing list