scons: Fix scons build.
[profile/ivi/mesa.git] / src / glsl / ir_builder.cpp
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, 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                                                       NULL, writemask);
56
57    return assign;
58 }
59
60 ir_assignment *
61 assign(deref lhs, operand rhs)
62 {
63    return assign(lhs, rhs, (1 << lhs.val->type->vector_elements) - 1);
64 }
65
66 ir_swizzle *
67 swizzle(operand a, int swizzle, int components)
68 {
69    void *mem_ctx = ralloc_parent(a.val);
70
71    return new(mem_ctx) ir_swizzle(a.val,
72                                   GET_SWZ(swizzle, 0),
73                                   GET_SWZ(swizzle, 1),
74                                   GET_SWZ(swizzle, 2),
75                                   GET_SWZ(swizzle, 3),
76                                   components);
77 }
78
79 ir_swizzle *
80 swizzle_xxxx(operand a)
81 {
82    return swizzle(a, SWIZZLE_XXXX, 4);
83 }
84
85 ir_swizzle *
86 swizzle_yyyy(operand a)
87 {
88    return swizzle(a, SWIZZLE_YYYY, 4);
89 }
90
91 ir_swizzle *
92 swizzle_zzzz(operand a)
93 {
94    return swizzle(a, SWIZZLE_ZZZZ, 4);
95 }
96
97 ir_swizzle *
98 swizzle_wwww(operand a)
99 {
100    return swizzle(a, SWIZZLE_WWWW, 4);
101 }
102
103 ir_swizzle *
104 swizzle_x(operand a)
105 {
106    return swizzle(a, SWIZZLE_XXXX, 1);
107 }
108
109 ir_swizzle *
110 swizzle_y(operand a)
111 {
112    return swizzle(a, SWIZZLE_YYYY, 1);
113 }
114
115 ir_swizzle *
116 swizzle_z(operand a)
117 {
118    return swizzle(a, SWIZZLE_ZZZZ, 1);
119 }
120
121 ir_swizzle *
122 swizzle_w(operand a)
123 {
124    return swizzle(a, SWIZZLE_WWWW, 1);
125 }
126
127 ir_swizzle *
128 swizzle_xy(operand a)
129 {
130    return swizzle(a, SWIZZLE_XYZW, 2);
131 }
132
133 ir_swizzle *
134 swizzle_xyz(operand a)
135 {
136    return swizzle(a, SWIZZLE_XYZW, 3);
137 }
138
139 ir_swizzle *
140 swizzle_xyzw(operand a)
141 {
142    return swizzle(a, SWIZZLE_XYZW, 4);
143 }
144
145 ir_expression *
146 expr(ir_expression_operation op, operand a, operand b)
147 {
148    void *mem_ctx = ralloc_parent(a.val);
149
150    return new(mem_ctx) ir_expression(op, a.val, b.val);
151 }
152
153 ir_expression *add(operand a, operand b)
154 {
155    return expr(ir_binop_add, a, b);
156 }
157
158 ir_expression *sub(operand a, operand b)
159 {
160    return expr(ir_binop_sub, a, b);
161 }
162
163 ir_expression *mul(operand a, operand b)
164 {
165    return expr(ir_binop_mul, a, b);
166 }
167
168 ir_expression *dot(operand a, operand b)
169 {
170    return expr(ir_binop_dot, a, b);
171 }
172
173 ir_expression *
174 saturate(operand a)
175 {
176    void *mem_ctx = ralloc_parent(a.val);
177
178    return expr(ir_binop_max,
179                expr(ir_binop_min, a, new(mem_ctx) ir_constant(1.0f)),
180                new(mem_ctx) ir_constant(0.0f));
181 }
182
183 } /* namespace ir_builder */