Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2010 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21.  * DEALINGS IN THE SOFTWARE.
  22.  */
  23.  
  24. /**
  25.  * \file ir_rvalue_visitor.cpp
  26.  *
  27.  * Generic class to implement the common pattern we have of wanting to
  28.  * visit each ir_rvalue * and possibly change that node to a different
  29.  * class.
  30.  */
  31.  
  32. #include "ir.h"
  33. #include "ir_visitor.h"
  34. #include "ir_rvalue_visitor.h"
  35. #include "glsl_types.h"
  36.  
  37. ir_visitor_status
  38. ir_rvalue_base_visitor::rvalue_visit(ir_expression *ir)
  39. {
  40.    unsigned int operand;
  41.  
  42.    for (operand = 0; operand < ir->get_num_operands(); operand++) {
  43.       handle_rvalue(&ir->operands[operand]);
  44.    }
  45.  
  46.    return visit_continue;
  47. }
  48.  
  49. ir_visitor_status
  50. ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir)
  51. {
  52.    handle_rvalue(&ir->coordinate);
  53.    handle_rvalue(&ir->projector);
  54.    handle_rvalue(&ir->shadow_comparitor);
  55.    handle_rvalue(&ir->offset);
  56.  
  57.    switch (ir->op) {
  58.    case ir_tex:
  59.    case ir_lod:
  60.       break;
  61.    case ir_txb:
  62.       handle_rvalue(&ir->lod_info.bias);
  63.       break;
  64.    case ir_txf:
  65.    case ir_txl:
  66.    case ir_txs:
  67.       handle_rvalue(&ir->lod_info.lod);
  68.       break;
  69.    case ir_txf_ms:
  70.       handle_rvalue(&ir->lod_info.sample_index);
  71.       break;
  72.    case ir_txd:
  73.       handle_rvalue(&ir->lod_info.grad.dPdx);
  74.       handle_rvalue(&ir->lod_info.grad.dPdy);
  75.       break;
  76.    }
  77.  
  78.    return visit_continue;
  79. }
  80.  
  81. ir_visitor_status
  82. ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir)
  83. {
  84.    handle_rvalue(&ir->val);
  85.    return visit_continue;
  86. }
  87.  
  88. ir_visitor_status
  89. ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir)
  90. {
  91.    /* The array index is not the target of the assignment, so clear the
  92.     * 'in_assignee' flag.  Restore it after returning from the array index.
  93.     */
  94.    const bool was_in_assignee = this->in_assignee;
  95.    this->in_assignee = false;
  96.    handle_rvalue(&ir->array_index);
  97.    this->in_assignee = was_in_assignee;
  98.  
  99.    handle_rvalue(&ir->array);
  100.    return visit_continue;
  101. }
  102.  
  103. ir_visitor_status
  104. ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir)
  105. {
  106.    handle_rvalue(&ir->record);
  107.    return visit_continue;
  108. }
  109.  
  110. ir_visitor_status
  111. ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir)
  112. {
  113.    handle_rvalue(&ir->rhs);
  114.    handle_rvalue(&ir->condition);
  115.  
  116.    return visit_continue;
  117. }
  118.  
  119. ir_visitor_status
  120. ir_rvalue_base_visitor::rvalue_visit(ir_call *ir)
  121. {
  122.    foreach_iter(exec_list_iterator, iter, *ir) {
  123.       ir_rvalue *param = (ir_rvalue *)iter.get();
  124.       ir_rvalue *new_param = param;
  125.       handle_rvalue(&new_param);
  126.  
  127.       if (new_param != param) {
  128.          param->replace_with(new_param);
  129.       }
  130.    }
  131.    return visit_continue;
  132. }
  133.  
  134. ir_visitor_status
  135. ir_rvalue_base_visitor::rvalue_visit(ir_return *ir)
  136. {
  137.    handle_rvalue(&ir->value);;
  138.    return visit_continue;
  139. }
  140.  
  141. ir_visitor_status
  142. ir_rvalue_base_visitor::rvalue_visit(ir_if *ir)
  143. {
  144.    handle_rvalue(&ir->condition);
  145.    return visit_continue;
  146. }
  147.  
  148.  
  149. ir_visitor_status
  150. ir_rvalue_visitor::visit_leave(ir_expression *ir)
  151. {
  152.    return rvalue_visit(ir);
  153. }
  154.  
  155. ir_visitor_status
  156. ir_rvalue_visitor::visit_leave(ir_texture *ir)
  157. {
  158.    return rvalue_visit(ir);
  159. }
  160.  
  161. ir_visitor_status
  162. ir_rvalue_visitor::visit_leave(ir_swizzle *ir)
  163. {
  164.    return rvalue_visit(ir);
  165. }
  166.  
  167. ir_visitor_status
  168. ir_rvalue_visitor::visit_leave(ir_dereference_array *ir)
  169. {
  170.    return rvalue_visit(ir);
  171. }
  172.  
  173. ir_visitor_status
  174. ir_rvalue_visitor::visit_leave(ir_dereference_record *ir)
  175. {
  176.    return rvalue_visit(ir);
  177. }
  178.  
  179. ir_visitor_status
  180. ir_rvalue_visitor::visit_leave(ir_assignment *ir)
  181. {
  182.    return rvalue_visit(ir);
  183. }
  184.  
  185. ir_visitor_status
  186. ir_rvalue_visitor::visit_leave(ir_call *ir)
  187. {
  188.    return rvalue_visit(ir);
  189. }
  190.  
  191. ir_visitor_status
  192. ir_rvalue_visitor::visit_leave(ir_return *ir)
  193. {
  194.    return rvalue_visit(ir);
  195. }
  196.  
  197. ir_visitor_status
  198. ir_rvalue_visitor::visit_leave(ir_if *ir)
  199. {
  200.    return rvalue_visit(ir);
  201. }
  202.  
  203. ir_visitor_status
  204. ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
  205. {
  206.    return rvalue_visit(ir);
  207. }
  208.  
  209. ir_visitor_status
  210. ir_rvalue_enter_visitor::visit_enter(ir_texture *ir)
  211. {
  212.    return rvalue_visit(ir);
  213. }
  214.  
  215. ir_visitor_status
  216. ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir)
  217. {
  218.    return rvalue_visit(ir);
  219. }
  220.  
  221. ir_visitor_status
  222. ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir)
  223. {
  224.    return rvalue_visit(ir);
  225. }
  226.  
  227. ir_visitor_status
  228. ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir)
  229. {
  230.    return rvalue_visit(ir);
  231. }
  232.  
  233. ir_visitor_status
  234. ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir)
  235. {
  236.    return rvalue_visit(ir);
  237. }
  238.  
  239. ir_visitor_status
  240. ir_rvalue_enter_visitor::visit_enter(ir_call *ir)
  241. {
  242.    return rvalue_visit(ir);
  243. }
  244.  
  245. ir_visitor_status
  246. ir_rvalue_enter_visitor::visit_enter(ir_return *ir)
  247. {
  248.    return rvalue_visit(ir);
  249. }
  250.  
  251. ir_visitor_status
  252. ir_rvalue_enter_visitor::visit_enter(ir_if *ir)
  253. {
  254.    return rvalue_visit(ir);
  255. }
  256.