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