Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2012 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 DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23.  
  24. #include "ir_builder.h"
  25. #include "program/prog_instruction.h"
  26.  
  27. using namespace ir_builder;
  28.  
  29. namespace ir_builder {
  30.  
  31. void
  32. ir_factory::emit(ir_instruction *ir)
  33. {
  34.    instructions->push_tail(ir);
  35. }
  36.  
  37. ir_variable *
  38. ir_factory::make_temp(const glsl_type *type, const char *name)
  39. {
  40.    ir_variable *var;
  41.  
  42.    var = new(mem_ctx) ir_variable(type, name, ir_var_temporary);
  43.    emit(var);
  44.  
  45.    return var;
  46. }
  47.  
  48. ir_assignment *
  49. assign(deref lhs, operand rhs, operand condition, int writemask)
  50. {
  51.    void *mem_ctx = ralloc_parent(lhs.val);
  52.  
  53.    ir_assignment *assign = new(mem_ctx) ir_assignment(lhs.val,
  54.                                                       rhs.val,
  55.                                                       condition.val,
  56.                                                       writemask);
  57.  
  58.    return assign;
  59. }
  60.  
  61. ir_assignment *
  62. assign(deref lhs, operand rhs)
  63. {
  64.    return assign(lhs, rhs, (1 << lhs.val->type->vector_elements) - 1);
  65. }
  66.  
  67. ir_assignment *
  68. assign(deref lhs, operand rhs, int writemask)
  69. {
  70.    return assign(lhs, rhs, (ir_rvalue *) NULL, writemask);
  71. }
  72.  
  73. ir_assignment *
  74. assign(deref lhs, operand rhs, operand condition)
  75. {
  76.    return assign(lhs, rhs, condition, (1 << lhs.val->type->vector_elements) - 1);
  77. }
  78.  
  79. ir_return *
  80. ret(operand retval)
  81. {
  82.    void *mem_ctx = ralloc_parent(retval.val);
  83.    return new(mem_ctx) ir_return(retval.val);
  84. }
  85.  
  86. ir_swizzle *
  87. swizzle(operand a, int swizzle, int components)
  88. {
  89.    void *mem_ctx = ralloc_parent(a.val);
  90.  
  91.    return new(mem_ctx) ir_swizzle(a.val,
  92.                                   GET_SWZ(swizzle, 0),
  93.                                   GET_SWZ(swizzle, 1),
  94.                                   GET_SWZ(swizzle, 2),
  95.                                   GET_SWZ(swizzle, 3),
  96.                                   components);
  97. }
  98.  
  99. ir_swizzle *
  100. swizzle_for_size(operand a, unsigned components)
  101. {
  102.    void *mem_ctx = ralloc_parent(a.val);
  103.  
  104.    if (a.val->type->vector_elements < components)
  105.       components = a.val->type->vector_elements;
  106.  
  107.    unsigned s[4] = { 0, 1, 2, 3 };
  108.    for (int i = components; i < 4; i++)
  109.       s[i] = components - 1;
  110.  
  111.    return new(mem_ctx) ir_swizzle(a.val, s, components);
  112. }
  113.  
  114. ir_swizzle *
  115. swizzle_xxxx(operand a)
  116. {
  117.    return swizzle(a, SWIZZLE_XXXX, 4);
  118. }
  119.  
  120. ir_swizzle *
  121. swizzle_yyyy(operand a)
  122. {
  123.    return swizzle(a, SWIZZLE_YYYY, 4);
  124. }
  125.  
  126. ir_swizzle *
  127. swizzle_zzzz(operand a)
  128. {
  129.    return swizzle(a, SWIZZLE_ZZZZ, 4);
  130. }
  131.  
  132. ir_swizzle *
  133. swizzle_wwww(operand a)
  134. {
  135.    return swizzle(a, SWIZZLE_WWWW, 4);
  136. }
  137.  
  138. ir_swizzle *
  139. swizzle_x(operand a)
  140. {
  141.    return swizzle(a, SWIZZLE_XXXX, 1);
  142. }
  143.  
  144. ir_swizzle *
  145. swizzle_y(operand a)
  146. {
  147.    return swizzle(a, SWIZZLE_YYYY, 1);
  148. }
  149.  
  150. ir_swizzle *
  151. swizzle_z(operand a)
  152. {
  153.    return swizzle(a, SWIZZLE_ZZZZ, 1);
  154. }
  155.  
  156. ir_swizzle *
  157. swizzle_w(operand a)
  158. {
  159.    return swizzle(a, SWIZZLE_WWWW, 1);
  160. }
  161.  
  162. ir_swizzle *
  163. swizzle_xy(operand a)
  164. {
  165.    return swizzle(a, SWIZZLE_XYZW, 2);
  166. }
  167.  
  168. ir_swizzle *
  169. swizzle_xyz(operand a)
  170. {
  171.    return swizzle(a, SWIZZLE_XYZW, 3);
  172. }
  173.  
  174. ir_swizzle *
  175. swizzle_xyzw(operand a)
  176. {
  177.    return swizzle(a, SWIZZLE_XYZW, 4);
  178. }
  179.  
  180. ir_expression *
  181. expr(ir_expression_operation op, operand a)
  182. {
  183.    void *mem_ctx = ralloc_parent(a.val);
  184.  
  185.    return new(mem_ctx) ir_expression(op, a.val);
  186. }
  187.  
  188. ir_expression *
  189. expr(ir_expression_operation op, operand a, operand b)
  190. {
  191.    void *mem_ctx = ralloc_parent(a.val);
  192.  
  193.    return new(mem_ctx) ir_expression(op, a.val, b.val);
  194. }
  195.  
  196. ir_expression *
  197. expr(ir_expression_operation op, operand a, operand b, operand c)
  198. {
  199.    void *mem_ctx = ralloc_parent(a.val);
  200.  
  201.    return new(mem_ctx) ir_expression(op, a.val, b.val, c.val);
  202. }
  203.  
  204. ir_expression *add(operand a, operand b)
  205. {
  206.    return expr(ir_binop_add, a, b);
  207. }
  208.  
  209. ir_expression *sub(operand a, operand b)
  210. {
  211.    return expr(ir_binop_sub, a, b);
  212. }
  213.  
  214. ir_expression *min2(operand a, operand b)
  215. {
  216.    return expr(ir_binop_min, a, b);
  217. }
  218.  
  219. ir_expression *max2(operand a, operand b)
  220. {
  221.    return expr(ir_binop_max, a, b);
  222. }
  223.  
  224. ir_expression *mul(operand a, operand b)
  225. {
  226.    return expr(ir_binop_mul, a, b);
  227. }
  228.  
  229. ir_expression *imul_high(operand a, operand b)
  230. {
  231.    return expr(ir_binop_imul_high, a, b);
  232. }
  233.  
  234. ir_expression *div(operand a, operand b)
  235. {
  236.    return expr(ir_binop_div, a, b);
  237. }
  238.  
  239. ir_expression *carry(operand a, operand b)
  240. {
  241.    return expr(ir_binop_carry, a, b);
  242. }
  243.  
  244. ir_expression *borrow(operand a, operand b)
  245. {
  246.    return expr(ir_binop_borrow, a, b);
  247. }
  248.  
  249. ir_expression *trunc(operand a)
  250. {
  251.    return expr(ir_unop_trunc, a);
  252. }
  253.  
  254. ir_expression *round_even(operand a)
  255. {
  256.    return expr(ir_unop_round_even, a);
  257. }
  258.  
  259. ir_expression *fract(operand a)
  260. {
  261.    return expr(ir_unop_fract, a);
  262. }
  263.  
  264. /* dot for vectors, mul for scalars */
  265. ir_expression *dot(operand a, operand b)
  266. {
  267.    assert(a.val->type == b.val->type);
  268.  
  269.    if (a.val->type->vector_elements == 1)
  270.       return expr(ir_binop_mul, a, b);
  271.  
  272.    return expr(ir_binop_dot, a, b);
  273. }
  274.  
  275. ir_expression*
  276. clamp(operand a, operand b, operand c)
  277. {
  278.    return expr(ir_binop_min, expr(ir_binop_max, a, b), c);
  279. }
  280.  
  281. ir_expression *
  282. saturate(operand a)
  283. {
  284.    return expr(ir_unop_saturate, a);
  285. }
  286.  
  287. ir_expression *
  288. abs(operand a)
  289. {
  290.    return expr(ir_unop_abs, a);
  291. }
  292.  
  293. ir_expression *
  294. neg(operand a)
  295. {
  296.    return expr(ir_unop_neg, a);
  297. }
  298.  
  299. ir_expression *
  300. sin(operand a)
  301. {
  302.    return expr(ir_unop_sin, a);
  303. }
  304.  
  305. ir_expression *
  306. cos(operand a)
  307. {
  308.    return expr(ir_unop_cos, a);
  309. }
  310.  
  311. ir_expression *
  312. exp(operand a)
  313. {
  314.    return expr(ir_unop_exp, a);
  315. }
  316.  
  317. ir_expression *
  318. rsq(operand a)
  319. {
  320.    return expr(ir_unop_rsq, a);
  321. }
  322.  
  323. ir_expression *
  324. sqrt(operand a)
  325. {
  326.    return expr(ir_unop_sqrt, a);
  327. }
  328.  
  329. ir_expression *
  330. log(operand a)
  331. {
  332.    return expr(ir_unop_log, a);
  333. }
  334.  
  335. ir_expression *
  336. sign(operand a)
  337. {
  338.    return expr(ir_unop_sign, a);
  339. }
  340.  
  341. ir_expression*
  342. equal(operand a, operand b)
  343. {
  344.    return expr(ir_binop_equal, a, b);
  345. }
  346.  
  347. ir_expression*
  348. nequal(operand a, operand b)
  349. {
  350.    return expr(ir_binop_nequal, a, b);
  351. }
  352.  
  353. ir_expression*
  354. less(operand a, operand b)
  355. {
  356.    return expr(ir_binop_less, a, b);
  357. }
  358.  
  359. ir_expression*
  360. greater(operand a, operand b)
  361. {
  362.    return expr(ir_binop_greater, a, b);
  363. }
  364.  
  365. ir_expression*
  366. lequal(operand a, operand b)
  367. {
  368.    return expr(ir_binop_lequal, a, b);
  369. }
  370.  
  371. ir_expression*
  372. gequal(operand a, operand b)
  373. {
  374.    return expr(ir_binop_gequal, a, b);
  375. }
  376.  
  377. ir_expression*
  378. logic_not(operand a)
  379. {
  380.    return expr(ir_unop_logic_not, a);
  381. }
  382.  
  383. ir_expression*
  384. logic_and(operand a, operand b)
  385. {
  386.    return expr(ir_binop_logic_and, a, b);
  387. }
  388.  
  389. ir_expression*
  390. logic_or(operand a, operand b)
  391. {
  392.    return expr(ir_binop_logic_or, a, b);
  393. }
  394.  
  395. ir_expression*
  396. bit_not(operand a)
  397. {
  398.    return expr(ir_unop_bit_not, a);
  399. }
  400.  
  401. ir_expression*
  402. bit_and(operand a, operand b)
  403. {
  404.    return expr(ir_binop_bit_and, a, b);
  405. }
  406.  
  407. ir_expression*
  408. bit_or(operand a, operand b)
  409. {
  410.    return expr(ir_binop_bit_or, a, b);
  411. }
  412.  
  413. ir_expression*
  414. lshift(operand a, operand b)
  415. {
  416.    return expr(ir_binop_lshift, a, b);
  417. }
  418.  
  419. ir_expression*
  420. rshift(operand a, operand b)
  421. {
  422.    return expr(ir_binop_rshift, a, b);
  423. }
  424.  
  425. ir_expression*
  426. f2i(operand a)
  427. {
  428.    return expr(ir_unop_f2i, a);
  429. }
  430.  
  431. ir_expression*
  432. bitcast_f2i(operand a)
  433. {
  434.    return expr(ir_unop_bitcast_f2i, a);
  435. }
  436.  
  437. ir_expression*
  438. i2f(operand a)
  439. {
  440.    return expr(ir_unop_i2f, a);
  441. }
  442.  
  443. ir_expression*
  444. bitcast_i2f(operand a)
  445. {
  446.    return expr(ir_unop_bitcast_i2f, a);
  447. }
  448.  
  449. ir_expression*
  450. i2u(operand a)
  451. {
  452.    return expr(ir_unop_i2u, a);
  453. }
  454.  
  455. ir_expression*
  456. u2i(operand a)
  457. {
  458.    return expr(ir_unop_u2i, a);
  459. }
  460.  
  461. ir_expression*
  462. f2u(operand a)
  463. {
  464.    return expr(ir_unop_f2u, a);
  465. }
  466.  
  467. ir_expression*
  468. bitcast_f2u(operand a)
  469. {
  470.    return expr(ir_unop_bitcast_f2u, a);
  471. }
  472.  
  473. ir_expression*
  474. u2f(operand a)
  475. {
  476.    return expr(ir_unop_u2f, a);
  477. }
  478.  
  479. ir_expression*
  480. bitcast_u2f(operand a)
  481. {
  482.    return expr(ir_unop_bitcast_u2f, a);
  483. }
  484.  
  485. ir_expression*
  486. i2b(operand a)
  487. {
  488.    return expr(ir_unop_i2b, a);
  489. }
  490.  
  491. ir_expression*
  492. b2i(operand a)
  493. {
  494.    return expr(ir_unop_b2i, a);
  495. }
  496.  
  497. ir_expression *
  498. f2b(operand a)
  499. {
  500.    return expr(ir_unop_f2b, a);
  501. }
  502.  
  503. ir_expression *
  504. b2f(operand a)
  505. {
  506.    return expr(ir_unop_b2f, a);
  507. }
  508.  
  509. ir_expression *
  510. interpolate_at_centroid(operand a)
  511. {
  512.    return expr(ir_unop_interpolate_at_centroid, a);
  513. }
  514.  
  515. ir_expression *
  516. interpolate_at_offset(operand a, operand b)
  517. {
  518.    return expr(ir_binop_interpolate_at_offset, a, b);
  519. }
  520.  
  521. ir_expression *
  522. interpolate_at_sample(operand a, operand b)
  523. {
  524.    return expr(ir_binop_interpolate_at_sample, a, b);
  525. }
  526.  
  527. ir_expression *
  528. f2d(operand a)
  529. {
  530.    return expr(ir_unop_f2d, a);
  531. }
  532.  
  533. ir_expression *
  534. i2d(operand a)
  535. {
  536.    return expr(ir_unop_i2d, a);
  537. }
  538.  
  539. ir_expression *
  540. u2d(operand a)
  541. {
  542.    return expr(ir_unop_u2d, a);
  543. }
  544.  
  545. ir_expression *
  546. fma(operand a, operand b, operand c)
  547. {
  548.    return expr(ir_triop_fma, a, b, c);
  549. }
  550.  
  551. ir_expression *
  552. lrp(operand x, operand y, operand a)
  553. {
  554.    return expr(ir_triop_lrp, x, y, a);
  555. }
  556.  
  557. ir_expression *
  558. csel(operand a, operand b, operand c)
  559. {
  560.    return expr(ir_triop_csel, a, b, c);
  561. }
  562.  
  563. ir_expression *
  564. bitfield_insert(operand a, operand b, operand c, operand d)
  565. {
  566.    void *mem_ctx = ralloc_parent(a.val);
  567.    return new(mem_ctx) ir_expression(ir_quadop_bitfield_insert,
  568.                                      a.val->type, a.val, b.val, c.val, d.val);
  569. }
  570.  
  571. ir_if*
  572. if_tree(operand condition,
  573.         ir_instruction *then_branch)
  574. {
  575.    assert(then_branch != NULL);
  576.  
  577.    void *mem_ctx = ralloc_parent(condition.val);
  578.  
  579.    ir_if *result = new(mem_ctx) ir_if(condition.val);
  580.    result->then_instructions.push_tail(then_branch);
  581.    return result;
  582. }
  583.  
  584. ir_if*
  585. if_tree(operand condition,
  586.         ir_instruction *then_branch,
  587.         ir_instruction *else_branch)
  588. {
  589.    assert(then_branch != NULL);
  590.    assert(else_branch != NULL);
  591.  
  592.    void *mem_ctx = ralloc_parent(condition.val);
  593.  
  594.    ir_if *result = new(mem_ctx) ir_if(condition.val);
  595.    result->then_instructions.push_tail(then_branch);
  596.    result->else_instructions.push_tail(else_branch);
  597.    return result;
  598. }
  599.  
  600. } /* namespace ir_builder */
  601.