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