nir: Make gl_FrontFacing a system_value
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 14 Feb 2015 20:10:32 +0000 (12:10 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 14 Feb 2015 21:47:16 +0000 (13:47 -0800)
GLSL IR labels gl_FrontFacing as an input variable and not a system value.
This commit makes NIR silently translate gl_FrontFacing to a system value
so that it properly gets translated into a load_system_value intrinsic.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/nir/glsl_to_nir.cpp

index e505a1d..92cfab3 100644 (file)
@@ -242,6 +242,7 @@ nir_visitor::visit(ir_variable *ir)
    var->data.centroid = ir->data.centroid;
    var->data.sample = ir->data.sample;
    var->data.invariant = ir->data.invariant;
+   var->data.location = ir->data.location;
 
    switch(ir->data.mode) {
    case ir_var_auto:
@@ -260,7 +261,13 @@ nir_visitor::visit(ir_variable *ir)
       break;
 
    case ir_var_shader_in:
-      var->data.mode = nir_var_shader_in;
+      if (ir->data.location == VARYING_SLOT_FACE) {
+         /* For whatever reason, GLSL IR makes gl_FrontFacing an input */
+         var->data.location = SYSTEM_VALUE_FRONT_FACE;
+         var->data.mode = nir_var_system_value;
+      } else {
+         var->data.mode = nir_var_shader_in;
+      }
       break;
 
    case ir_var_shader_out:
@@ -312,7 +319,6 @@ nir_visitor::visit(ir_variable *ir)
       unreachable("not reached");
    }
 
-   var->data.location = ir->data.location;
    var->data.index = ir->data.index;
    var->data.binding = ir->data.binding;
    /* XXX Get rid of buffer_index */