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 26namespace ir_builder { 27 28/** 29 * This little class exists to let the helper expression generators 30 * take either an ir_rvalue * or an ir_variable * to be automatically 31 * dereferenced, while still providing compile-time type checking. 32 * 33 * You don't have to explicitly call the constructor -- C++ will see 34 * that you passed an ir_variable, and silently call the 35 * operand(ir_variable *var) constructor behind your back. 36 */ 37class operand { 38public: 39 operand(ir_rvalue *val) 40 : val(val) 41 { 42 } 43 44 operand(ir_variable *var) 45 { 46 void *mem_ctx = ralloc_parent(var); 47 val = new(mem_ctx) ir_dereference_variable(var); 48 } 49 50 ir_rvalue *val; 51}; 52 53/** Automatic generator for ir_dereference_variable on assignment LHS. 54 * 55 * \sa operand 56 */ 57class deref { 58public: 59 deref(ir_dereference *val) 60 : val(val) 61 { 62 } 63 64 deref(ir_variable *var) 65 { 66 void *mem_ctx = ralloc_parent(var); 67 val = new(mem_ctx) ir_dereference_variable(var); 68 } 69 70 71 ir_dereference *val; 72}; 73 74class ir_factory { 75public: 76 void emit(ir_instruction *ir); 77 ir_variable *make_temp(const glsl_type *type, const char *name); 78 79 exec_list *instructions; 80 void *mem_ctx; 81}; 82 83ir_assignment *assign(deref lhs, operand rhs); 84ir_assignment *assign(deref lhs, operand rhs, int writemask); 85 86ir_expression *expr(ir_expression_operation op, operand a); 87ir_expression *expr(ir_expression_operation op, operand a, operand b); 88ir_expression *add(operand a, operand b); 89ir_expression *sub(operand a, operand b); 90ir_expression *mul(operand a, operand b); 91ir_expression *dot(operand a, operand b); 92ir_expression *saturate(operand a); 93 94/** 95 * Swizzle away later components, but preserve the ordering. 96 */ 97ir_swizzle *swizzle_for_size(operand a, int components); 98 99ir_swizzle *swizzle_xxxx(operand a); 100ir_swizzle *swizzle_yyyy(operand a); 101ir_swizzle *swizzle_zzzz(operand a); 102ir_swizzle *swizzle_wwww(operand a); 103ir_swizzle *swizzle_x(operand a); 104ir_swizzle *swizzle_y(operand a); 105ir_swizzle *swizzle_z(operand a); 106ir_swizzle *swizzle_w(operand a); 107ir_swizzle *swizzle_xy(operand a); 108ir_swizzle *swizzle_xyz(operand a); 109ir_swizzle *swizzle_xyzw(operand a); 110 111} /* namespace ir_builder */ 112