1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2010 Intel Corporation
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file ir_set_program_inouts.cpp
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sets the InputsRead and OutputsWritten of Mesa programs.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Additionally, for fragment shaders, sets the InterpQualifier array, the
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IsCentroid bitfield, and the UsesDFdy flag.
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa programs (gl_program, not gl_shader_program) have a set of
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flags indicating which varyings are read and written.  Computing
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which are actually read from some sort of backend code can be
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tricky when variable array indexing involved.  So this pass
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * provides support for setting InputsRead and OutputsWritten right
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from the GLSL IR.
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/core.h" /* for struct gl_program */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/hash_table.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir_visitor.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glsl_types.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass ir_set_program_inouts_visitor : public ir_hierarchical_visitor {
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ir_set_program_inouts_visitor(struct gl_program *prog,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 bool is_fragment_shader)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->prog = prog;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->is_fragment_shader = is_fragment_shader;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->ht = hash_table_ctor(0,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 hash_table_pointer_hash,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 hash_table_pointer_compare);
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ~ir_set_program_inouts_visitor()
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hash_table_dtor(this->ht);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit_enter(ir_dereference_array *);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit_enter(ir_function_signature *);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit_enter(ir_expression *);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit_enter(ir_discard *);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit(ir_dereference_variable *);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ir_visitor_status visit(ir_variable *);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_program *prog;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct hash_table *ht;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool is_fragment_shader;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmark(struct gl_program *prog, ir_variable *var, int offset, int len,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     bool is_fragment_shader)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* As of GLSL 1.20, varyings can only be floats, floating-point
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * vectors or matrices, or arrays of them.  For Mesa programs using
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * InputsRead/OutputsWritten, everything but matrices uses one
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * slot, while matrices use a slot per column.  Presumably
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * something doing a more clever packing would use something other
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * than InputsRead/OutputsWritten.
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < len; i++) {
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLbitfield64 bitfield = BITFIELD64_BIT(var->location + var->index + offset + i);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (var->mode == ir_var_in) {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prog->InputsRead |= bitfield;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (is_fragment_shader) {
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            gl_fragment_program *fprog = (gl_fragment_program *) prog;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fprog->InterpQualifier[var->location + var->index + offset + i] =
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               (glsl_interp_qualifier) var->interpolation;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (var->centroid)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               fprog->IsCentroid |= bitfield;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (var->mode == ir_var_system_value) {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prog->SystemValuesRead |= bitfield;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prog->OutputsWritten |= bitfield;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Default handler: Mark all the locations in the variable as used. */
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit(ir_dereference_variable *ir)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (hash_table_find(this->ht, ir->var) == NULL)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return visit_continue;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ir->type->is_array()) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mark(this->prog, ir->var, 0,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   ir->type->length * ir->type->fields.array->matrix_columns,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           this->is_fragment_shader);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mark(this->prog, ir->var, 0, ir->type->matrix_columns,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           this->is_fragment_shader);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit_enter(ir_dereference_array *ir)
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ir_dereference_variable *deref_var;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ir_constant *index = ir->array_index->as_constant();
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   deref_var = ir->array->as_dereference_variable();
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ir_variable *var = NULL;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check that we're dereferencing a shader in or out */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (deref_var)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      var = (ir_variable *)hash_table_find(this->ht, deref_var->var);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index && var) {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int width = 1;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (deref_var->type->is_array() &&
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  deref_var->type->fields.array->is_matrix()) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 width = deref_var->type->fields.array->matrix_columns;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mark(this->prog, var, index->value.i[0] * width, width,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           this->is_fragment_shader);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return visit_continue_with_parent;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit(ir_variable *ir)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ir->mode == ir_var_in ||
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ir->mode == ir_var_out ||
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ir->mode == ir_var_system_value) {
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hash_table_insert(this->ht, ir, ir);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit_enter(ir_function_signature *ir)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We don't want to descend into the function parameters and
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * consider them as shader inputs or outputs.
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   visit_list_elements(this, &ir->body);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue_with_parent;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit_enter(ir_expression *ir)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_fragment_shader && ir->operation == ir_unop_dFdy) {
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gl_fragment_program *fprog = (gl_fragment_program *) prog;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprog->UsesDFdy = true;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_visitor_status
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgir_set_program_inouts_visitor::visit_enter(ir_discard *)
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* discards are only allowed in fragment shaders. */
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(is_fragment_shader);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_fragment_program *fprog = (gl_fragment_program *) prog;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprog->UsesKill = true;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return visit_continue;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo_set_program_inouts(exec_list *instructions, struct gl_program *prog,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      bool is_fragment_shader)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ir_set_program_inouts_visitor v(prog, is_fragment_shader);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog->InputsRead = 0;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog->OutputsWritten = 0;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog->SystemValuesRead = 0;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_fragment_shader) {
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gl_fragment_program *fprog = (gl_fragment_program *) prog;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(fprog->InterpQualifier, 0, sizeof(fprog->InterpQualifier));
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprog->IsCentroid = 0;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprog->UsesDFdy = false;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprog->UsesKill = false;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   visit_list_elements(&v, instructions);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
214