Mesa (master): glsl: Convert TES gl_PatchVerticesIn into a constant when using a TCS.

Kenneth Graunke kwg at kemper.freedesktop.org
Mon Oct 26 23:42:39 UTC 2015


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Tue Jul 28 18:16:37 2015 -0700

glsl: Convert TES gl_PatchVerticesIn into a constant when using a TCS.

When a TCS is present, the TES input gl_PatchVerticesIn is actually a
constant - it's simply the # of output vertices specified by the TCS
layout qualifiers.  So, we can replace the system value with a constant,
which may allow further optimization, and will likely be more efficient.

If the TCS is absent, we can't do this optimization.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

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

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 424b92a..cfd8f81 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -2282,6 +2282,22 @@ resize_tes_inputs(struct gl_context *ctx,
    foreach_in_list(ir_instruction, ir, tes->ir) {
       ir->accept(&input_resize_visitor);
    }
+
+   if (tcs) {
+      /* Convert the gl_PatchVerticesIn system value into a constant, since
+       * the value is known at this point.
+       */
+      foreach_in_list(ir_instruction, ir, tes->ir) {
+         ir_variable *var = ir->as_variable();
+         if (var && var->data.mode == ir_var_system_value &&
+             var->data.location == SYSTEM_VALUE_VERTICES_IN) {
+            void *mem_ctx = ralloc_parent(var);
+            var->data.mode = ir_var_auto;
+            var->data.location = 0;
+            var->constant_value = new(mem_ctx) ir_constant(num_vertices);
+         }
+      }
+   }
 }
 
 /**




More information about the mesa-commit mailing list