nir_builtin_builder.h revision 1463c08d
1/* 2 * Copyright © 2018 Red Hat Inc. 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 NIR_BUILTIN_BUILDER_H 25#define NIR_BUILTIN_BUILDER_H 26 27#include "util/u_math.h" 28#include "nir_builder.h" 29 30#ifdef __cplusplus 31extern "C" { 32#endif 33 34/* 35 * Functions are sorted alphabetically with removed type and "fast" prefix. 36 * Definitions for functions in the C file come first. 37 */ 38 39nir_ssa_def* nir_cross3(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y); 40nir_ssa_def* nir_cross4(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y); 41nir_ssa_def* nir_fast_length(nir_builder *b, nir_ssa_def *vec); 42nir_ssa_def* nir_nextafter(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y); 43nir_ssa_def* nir_normalize(nir_builder *b, nir_ssa_def *vec); 44nir_ssa_def* nir_smoothstep(nir_builder *b, nir_ssa_def *edge0, 45 nir_ssa_def *edge1, nir_ssa_def *x); 46nir_ssa_def* nir_upsample(nir_builder *b, nir_ssa_def *hi, nir_ssa_def *lo); 47nir_ssa_def* nir_atan(nir_builder *b, nir_ssa_def *y_over_x); 48nir_ssa_def* nir_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x); 49 50nir_ssa_def * 51nir_get_texture_lod(nir_builder *b, nir_tex_instr *tex); 52 53nir_ssa_def * 54nir_get_texture_size(nir_builder *b, nir_tex_instr *tex); 55 56static inline nir_ssa_def * 57nir_nan_check2(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *res) 58{ 59 return nir_bcsel(b, nir_fneu(b, x, x), x, nir_bcsel(b, nir_fneu(b, y, y), y, res)); 60} 61 62static inline nir_ssa_def * 63nir_fmax_abs_vec_comp(nir_builder *b, nir_ssa_def *vec) 64{ 65 nir_ssa_def *res = nir_channel(b, vec, 0); 66 for (unsigned i = 1; i < vec->num_components; ++i) 67 res = nir_fmax(b, res, nir_fabs(b, nir_channel(b, vec, i))); 68 return res; 69} 70 71static inline nir_ssa_def * 72nir_iabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 73{ 74 nir_ssa_def *cond = nir_ige(b, x, y); 75 nir_ssa_def *res0 = nir_isub(b, x, y); 76 nir_ssa_def *res1 = nir_isub(b, y, x); 77 return nir_bcsel(b, cond, res0, res1); 78} 79 80static inline nir_ssa_def * 81nir_uabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 82{ 83 nir_ssa_def *cond = nir_uge(b, x, y); 84 nir_ssa_def *res0 = nir_isub(b, x, y); 85 nir_ssa_def *res1 = nir_isub(b, y, x); 86 return nir_bcsel(b, cond, res0, res1); 87} 88 89static inline nir_ssa_def * 90nir_fexp(nir_builder *b, nir_ssa_def *x) 91{ 92 return nir_fexp2(b, nir_fmul_imm(b, x, M_LOG2E)); 93} 94 95static inline nir_ssa_def * 96nir_flog(nir_builder *b, nir_ssa_def *x) 97{ 98 return nir_fmul_imm(b, nir_flog2(b, x), 1.0 / M_LOG2E); 99} 100 101static inline nir_ssa_def * 102nir_imad24(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z) 103{ 104 nir_ssa_def *temp = nir_imul24(b, x, y); 105 return nir_iadd(b, temp, z); 106} 107 108static inline nir_ssa_def * 109nir_imad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z) 110{ 111 nir_ssa_def *temp = nir_imul_high(b, x, y); 112 return nir_iadd(b, temp, z); 113} 114 115static inline nir_ssa_def * 116nir_umad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z) 117{ 118 nir_ssa_def *temp = nir_umul_high(b, x, y); 119 return nir_iadd(b, temp, z); 120} 121 122static inline nir_ssa_def * 123nir_bitselect(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s) 124{ 125 return nir_ior(b, nir_iand(b, nir_inot(b, s), x), nir_iand(b, s, y)); 126} 127 128static inline nir_ssa_def * 129nir_copysign(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 130{ 131 uint64_t masks = 1ull << (x->bit_size - 1); 132 uint64_t maskv = ~masks; 133 134 nir_ssa_def *s = nir_imm_intN_t(b, masks, x->bit_size); 135 nir_ssa_def *v = nir_imm_intN_t(b, maskv, x->bit_size); 136 137 return nir_ior(b, nir_iand(b, x, v), nir_iand(b, y, s)); 138} 139 140static inline nir_ssa_def * 141nir_degrees(nir_builder *b, nir_ssa_def *val) 142{ 143 return nir_fmul_imm(b, val, 180.0 / M_PI); 144} 145 146static inline nir_ssa_def * 147nir_fdim(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 148{ 149 nir_ssa_def *cond = nir_flt(b, y, x); 150 nir_ssa_def *res = nir_fsub(b, x, y); 151 nir_ssa_def *zero = nir_imm_floatN_t(b, 0.0, x->bit_size); 152 153 // return NaN if either x or y are NaN, else x-y if x>y, else +0.0 154 return nir_nan_check2(b, x, y, nir_bcsel(b, cond, res, zero)); 155} 156 157static inline nir_ssa_def * 158nir_fast_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 159{ 160 return nir_fast_length(b, nir_fsub(b, x, y)); 161} 162 163static inline nir_ssa_def* 164nir_fast_normalize(nir_builder *b, nir_ssa_def *vec) 165{ 166 return nir_fdiv(b, vec, nir_fast_length(b, vec)); 167} 168 169static inline nir_ssa_def* 170nir_fmad(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z) 171{ 172 return nir_fadd(b, nir_fmul(b, x, y), z); 173} 174 175static inline nir_ssa_def* 176nir_maxmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 177{ 178 nir_ssa_def *xabs = nir_fabs(b, x); 179 nir_ssa_def *yabs = nir_fabs(b, y); 180 181 nir_ssa_def *condy = nir_flt(b, xabs, yabs); 182 nir_ssa_def *condx = nir_flt(b, yabs, xabs); 183 184 return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmax(b, x, y))); 185} 186 187static inline nir_ssa_def* 188nir_minmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) 189{ 190 nir_ssa_def *xabs = nir_fabs(b, x); 191 nir_ssa_def *yabs = nir_fabs(b, y); 192 193 nir_ssa_def *condx = nir_flt(b, xabs, yabs); 194 nir_ssa_def *condy = nir_flt(b, yabs, xabs); 195 196 return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmin(b, x, y))); 197} 198 199#ifdef __vax__ 200#define NAN FLT_MAX 201#endif 202 203static inline nir_ssa_def* 204nir_nan(nir_builder *b, nir_ssa_def *x) 205{ 206 nir_ssa_def *nan = nir_imm_floatN_t(b, NAN, x->bit_size); 207 if (x->num_components == 1) 208 return nan; 209 210 nir_ssa_def *nans[NIR_MAX_VEC_COMPONENTS]; 211 for (unsigned i = 0; i < x->num_components; ++i) 212 nans[i] = nan; 213 214 return nir_vec(b, nans, x->num_components); 215} 216 217static inline nir_ssa_def * 218nir_radians(nir_builder *b, nir_ssa_def *val) 219{ 220 return nir_fmul_imm(b, val, M_PI / 180.0); 221} 222 223static inline nir_ssa_def * 224nir_select(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s) 225{ 226 if (s->num_components != 1) { 227 uint64_t mask = 1ull << (s->bit_size - 1); 228 s = nir_iand(b, s, nir_imm_intN_t(b, mask, s->bit_size)); 229 } 230 return nir_bcsel(b, nir_ieq_imm(b, s, 0), x, y); 231} 232 233static inline nir_ssa_def * 234nir_ftan(nir_builder *b, nir_ssa_def *x) 235{ 236 return nir_fdiv(b, nir_fsin(b, x), nir_fcos(b, x)); 237} 238 239static inline nir_ssa_def * 240nir_clz_u(nir_builder *b, nir_ssa_def *a) 241{ 242 nir_ssa_def *val; 243 val = nir_isub(b, nir_imm_intN_t(b, a->bit_size - 1, 32), nir_ufind_msb(b, a)); 244 return nir_u2u(b, val, a->bit_size); 245} 246 247static inline nir_ssa_def * 248nir_ctz_u(nir_builder *b, nir_ssa_def *a) 249{ 250 nir_ssa_def *cond = nir_ieq(b, a, nir_imm_intN_t(b, 0, a->bit_size)); 251 252 return nir_bcsel(b, cond, 253 nir_imm_intN_t(b, a->bit_size, a->bit_size), 254 nir_u2u(b, nir_find_lsb(b, a), a->bit_size)); 255} 256 257#ifdef __cplusplus 258} 259#endif 260 261#endif /* NIR_BUILTIN_BUILDER_H */ 262