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.h"
  25.  
  26. namespace ir_builder {
  27.  
  28. #ifndef WRITEMASK_X
  29. enum writemask {
  30.    WRITEMASK_X = 0x1,
  31.    WRITEMASK_Y = 0x2,
  32.    WRITEMASK_Z = 0x4,
  33.    WRITEMASK_W = 0x8,
  34. };
  35. #endif
  36.  
  37. /**
  38.  * This little class exists to let the helper expression generators
  39.  * take either an ir_rvalue * or an ir_variable * to be automatically
  40.  * dereferenced, while still providing compile-time type checking.
  41.  *
  42.  * You don't have to explicitly call the constructor -- C++ will see
  43.  * that you passed an ir_variable, and silently call the
  44.  * operand(ir_variable *var) constructor behind your back.
  45.  */
  46. class operand {
  47. public:
  48.    operand(ir_rvalue *val)
  49.       : val(val)
  50.    {
  51.    }
  52.  
  53.    operand(ir_variable *var)
  54.    {
  55.       void *mem_ctx = ralloc_parent(var);
  56.       val = new(mem_ctx) ir_dereference_variable(var);
  57.    }
  58.  
  59.    ir_rvalue *val;
  60. };
  61.  
  62. /** Automatic generator for ir_dereference_variable on assignment LHS.
  63.  *
  64.  * \sa operand
  65.  */
  66. class deref {
  67. public:
  68.    deref(ir_dereference *val)
  69.       : val(val)
  70.    {
  71.    }
  72.  
  73.    deref(ir_variable *var)
  74.    {
  75.       void *mem_ctx = ralloc_parent(var);
  76.       val = new(mem_ctx) ir_dereference_variable(var);
  77.    }
  78.  
  79.  
  80.    ir_dereference *val;
  81. };
  82.  
  83. class ir_factory {
  84. public:
  85.    ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL)
  86.       : instructions(instructions),
  87.         mem_ctx(mem_ctx)
  88.    {
  89.       return;
  90.    }
  91.  
  92.    void emit(ir_instruction *ir);
  93.    ir_variable *make_temp(const glsl_type *type, const char *name);
  94.  
  95.    ir_constant*
  96.    constant(float f)
  97.    {
  98.       return new(mem_ctx) ir_constant(f);
  99.    }
  100.  
  101.    ir_constant*
  102.    constant(int i)
  103.    {
  104.       return new(mem_ctx) ir_constant(i);
  105.    }
  106.  
  107.    ir_constant*
  108.    constant(unsigned u)
  109.    {
  110.       return new(mem_ctx) ir_constant(u);
  111.    }
  112.  
  113.    ir_constant*
  114.    constant(bool b)
  115.    {
  116.       return new(mem_ctx) ir_constant(b);
  117.    }
  118.  
  119.    exec_list *instructions;
  120.    void *mem_ctx;
  121. };
  122.  
  123. ir_assignment *assign(deref lhs, operand rhs);
  124. ir_assignment *assign(deref lhs, operand rhs, int writemask);
  125. ir_assignment *assign(deref lhs, operand rhs, operand condition);
  126. ir_assignment *assign(deref lhs, operand rhs, operand condition, int writemask);
  127.  
  128. ir_return *ret(operand retval);
  129.  
  130. ir_expression *expr(ir_expression_operation op, operand a);
  131. ir_expression *expr(ir_expression_operation op, operand a, operand b);
  132. ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c);
  133. ir_expression *add(operand a, operand b);
  134. ir_expression *sub(operand a, operand b);
  135. ir_expression *mul(operand a, operand b);
  136. ir_expression *imul_high(operand a, operand b);
  137. ir_expression *div(operand a, operand b);
  138. ir_expression *carry(operand a, operand b);
  139. ir_expression *borrow(operand a, operand b);
  140. ir_expression *trunc(operand a);
  141. ir_expression *round_even(operand a);
  142. ir_expression *fract(operand a);
  143. ir_expression *dot(operand a, operand b);
  144. ir_expression *clamp(operand a, operand b, operand c);
  145. ir_expression *saturate(operand a);
  146. ir_expression *abs(operand a);
  147. ir_expression *neg(operand a);
  148. ir_expression *sin(operand a);
  149. ir_expression *cos(operand a);
  150. ir_expression *exp(operand a);
  151. ir_expression *rsq(operand a);
  152. ir_expression *sqrt(operand a);
  153. ir_expression *log(operand a);
  154. ir_expression *sign(operand a);
  155.  
  156. ir_expression *equal(operand a, operand b);
  157. ir_expression *nequal(operand a, operand b);
  158. ir_expression *less(operand a, operand b);
  159. ir_expression *greater(operand a, operand b);
  160. ir_expression *lequal(operand a, operand b);
  161. ir_expression *gequal(operand a, operand b);
  162.  
  163. ir_expression *logic_not(operand a);
  164. ir_expression *logic_and(operand a, operand b);
  165. ir_expression *logic_or(operand a, operand b);
  166.  
  167. ir_expression *bit_not(operand a);
  168. ir_expression *bit_or(operand a, operand b);
  169. ir_expression *bit_and(operand a, operand b);
  170. ir_expression *lshift(operand a, operand b);
  171. ir_expression *rshift(operand a, operand b);
  172.  
  173. ir_expression *f2i(operand a);
  174. ir_expression *bitcast_f2i(operand a);
  175. ir_expression *i2f(operand a);
  176. ir_expression *bitcast_i2f(operand a);
  177. ir_expression *f2u(operand a);
  178. ir_expression *bitcast_f2u(operand a);
  179. ir_expression *u2f(operand a);
  180. ir_expression *bitcast_u2f(operand a);
  181. ir_expression *i2u(operand a);
  182. ir_expression *u2i(operand a);
  183. ir_expression *b2i(operand a);
  184. ir_expression *i2b(operand a);
  185. ir_expression *f2b(operand a);
  186. ir_expression *b2f(operand a);
  187.  
  188. ir_expression *f2d(operand a);
  189. ir_expression *i2d(operand a);
  190. ir_expression *u2d(operand a);
  191.  
  192. ir_expression *min2(operand a, operand b);
  193. ir_expression *max2(operand a, operand b);
  194.  
  195. ir_expression *interpolate_at_centroid(operand a);
  196. ir_expression *interpolate_at_offset(operand a, operand b);
  197. ir_expression *interpolate_at_sample(operand a, operand b);
  198.  
  199. ir_expression *fma(operand a, operand b, operand c);
  200. ir_expression *lrp(operand x, operand y, operand a);
  201. ir_expression *csel(operand a, operand b, operand c);
  202. ir_expression *bitfield_insert(operand a, operand b, operand c, operand d);
  203.  
  204. ir_swizzle *swizzle(operand a, int swizzle, int components);
  205. /**
  206.  * Swizzle away later components, but preserve the ordering.
  207.  */
  208. ir_swizzle *swizzle_for_size(operand a, unsigned components);
  209.  
  210. ir_swizzle *swizzle_xxxx(operand a);
  211. ir_swizzle *swizzle_yyyy(operand a);
  212. ir_swizzle *swizzle_zzzz(operand a);
  213. ir_swizzle *swizzle_wwww(operand a);
  214. ir_swizzle *swizzle_x(operand a);
  215. ir_swizzle *swizzle_y(operand a);
  216. ir_swizzle *swizzle_z(operand a);
  217. ir_swizzle *swizzle_w(operand a);
  218. ir_swizzle *swizzle_xy(operand a);
  219. ir_swizzle *swizzle_xyz(operand a);
  220. ir_swizzle *swizzle_xyzw(operand a);
  221.  
  222. ir_if *if_tree(operand condition,
  223.                ir_instruction *then_branch);
  224. ir_if *if_tree(operand condition,
  225.                ir_instruction *then_branch,
  226.                ir_instruction *else_branch);
  227.  
  228. } /* namespace ir_builder */
  229.