mesa: set up gl_vert_result and gl_frag_attrib values for gl_ClipDistance.
[mesa.git] / src / glsl / ir_set_program_inouts.cpp
index 714281539ac1c654ed22815e644ec6153f8a3cfb..3b10b909724a2dfc833fc8ecbad923626caa643b 100644 (file)
@@ -79,6 +79,8 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len)
    for (int i = 0; i < len; i++) {
       if (var->mode == ir_var_in)
         prog->InputsRead |= BITFIELD64_BIT(var->location + offset + i);
+      else if (var->mode == ir_var_system_value)
+         prog->SystemValuesRead |= (1 << (var->location + offset + i));
       else
         prog->OutputsWritten |= BITFIELD64_BIT(var->location + offset + i);
    }
@@ -92,10 +94,8 @@ ir_set_program_inouts_visitor::visit(ir_dereference_variable *ir)
       return visit_continue;
 
    if (ir->type->is_array()) {
-      for (unsigned int i = 0; i < ir->type->length; i++) {
-        mark(this->prog, ir->var, i,
-             ir->type->length * ir->type->fields.array->matrix_columns);
-      }
+      mark(this->prog, ir->var, 0,
+          ir->type->length * ir->type->fields.array->matrix_columns);
    } else {
       mark(this->prog, ir->var, 0, ir->type->matrix_columns);
    }
@@ -134,7 +134,8 @@ ir_visitor_status
 ir_set_program_inouts_visitor::visit(ir_variable *ir)
 {
    if (ir->mode == ir_var_in ||
-       ir->mode == ir_var_out) {
+       ir->mode == ir_var_out ||
+       ir->mode == ir_var_system_value) {
       hash_table_insert(this->ht, ir, ir);
    }
 
@@ -158,5 +159,6 @@ do_set_program_inouts(exec_list *instructions, struct gl_program *prog)
 
    prog->InputsRead = 0;
    prog->OutputsWritten = 0;
+   prog->SystemValuesRead = 0;
    visit_list_elements(&v, instructions);
 }