void
ir_constant_folding_visitor::fold_constant(ir_rvalue **rvalue)
{
- if ((*rvalue)->ir_type == ir_type_constant)
+ if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
return;
ir_constant *constant = (*rvalue)->constant_expression_value();
void
ir_constant_folding_visitor::visit(ir_texture *ir)
{
- // FINISHME: Do stuff with texture lookups
- (void) ir;
+ fold_constant(&ir->coordinate);
+ fold_constant(&ir->projector);
+ fold_constant(&ir->shadow_comparitor);
+
+ switch (ir->op) {
+ case ir_tex:
+ break;
+ case ir_txb:
+ fold_constant(&ir->lod_info.bias);
+ break;
+ case ir_txf:
+ case ir_txl:
+ fold_constant(&ir->lod_info.lod);
+ break;
+ case ir_txd:
+ fold_constant(&ir->lod_info.grad.dPdx);
+ fold_constant(&ir->lod_info.grad.dPdy);
+ break;
+ }
}
void
ir_constant_folding_visitor::visit(ir_swizzle *ir)
{
- ir->val->accept(this);
+ fold_constant(&ir->val);
}
ir->condition = NULL;
else
ir->remove();
+ this->progress = true;
}
- this->progress = true;
}
}
void
ir_constant_folding_visitor::visit(ir_call *ir)
{
- (void) ir;
+ foreach_iter(exec_list_iterator, iter, *ir) {
+ ir_rvalue *param = (ir_rvalue *)iter.get();
+ ir_rvalue *new_param = param;
+ fold_constant(&new_param);
+
+ if (new_param != param) {
+ param->replace_with(new_param);
+ }
+ }
}
void
ir_constant_folding_visitor::visit(ir_return *ir)
{
- (void) ir;
+ fold_constant(&ir->value);
}