Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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()
  86.       : instructions(NULL),
  87.         mem_ctx(NULL)
  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.  
  126. ir_expression *expr(ir_expression_operation op, operand a);
  127. ir_expression *expr(ir_expression_operation op, operand a, operand b);
  128. ir_expression *add(operand a, operand b);
  129. ir_expression *sub(operand a, operand b);
  130. ir_expression *mul(operand a, operand b);
  131. ir_expression *div(operand a, operand b);
  132. ir_expression *round_even(operand a);
  133. ir_expression *dot(operand a, operand b);
  134. ir_expression *clamp(operand a, operand b, operand c);
  135. ir_expression *saturate(operand a);
  136.  
  137. ir_expression *equal(operand a, operand b);
  138. ir_expression *less(operand a, operand b);
  139. ir_expression *greater(operand a, operand b);
  140. ir_expression *lequal(operand a, operand b);
  141. ir_expression *gequal(operand a, operand b);
  142.  
  143. ir_expression *logic_not(operand a);
  144. ir_expression *logic_and(operand a, operand b);
  145. ir_expression *logic_or(operand a, operand b);
  146.  
  147. ir_expression *bit_not(operand a);
  148. ir_expression *bit_or(operand a, operand b);
  149. ir_expression *bit_and(operand a, operand b);
  150. ir_expression *lshift(operand a, operand b);
  151. ir_expression *rshift(operand a, operand b);
  152.  
  153. ir_expression *f2i(operand a);
  154. ir_expression *i2f(operand a);
  155. ir_expression *f2u(operand a);
  156. ir_expression *u2f(operand a);
  157. ir_expression *i2u(operand a);
  158. ir_expression *u2i(operand a);
  159.  
  160. /**
  161.  * Swizzle away later components, but preserve the ordering.
  162.  */
  163. ir_swizzle *swizzle_for_size(operand a, unsigned components);
  164.  
  165. ir_swizzle *swizzle_xxxx(operand a);
  166. ir_swizzle *swizzle_yyyy(operand a);
  167. ir_swizzle *swizzle_zzzz(operand a);
  168. ir_swizzle *swizzle_wwww(operand a);
  169. ir_swizzle *swizzle_x(operand a);
  170. ir_swizzle *swizzle_y(operand a);
  171. ir_swizzle *swizzle_z(operand a);
  172. ir_swizzle *swizzle_w(operand a);
  173. ir_swizzle *swizzle_xy(operand a);
  174. ir_swizzle *swizzle_xyz(operand a);
  175. ir_swizzle *swizzle_xyzw(operand a);
  176.  
  177. ir_if *if_tree(operand condition,
  178.                ir_instruction *then_branch);
  179. ir_if *if_tree(operand condition,
  180.                ir_instruction *then_branch,
  181.                ir_instruction *else_branch);
  182.  
  183. } /* namespace ir_builder */
  184.