1 /* Copyright (C) 2018 Red Hat 2 * Copyright (C) 2020 Valve 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 _NIR_INTRINSICS_INDICES_ 25 #define _NIR_INTRINSICS_INDICES_ 26 27 28 29 static inline int 30 nir_intrinsic_base(const nir_intrinsic_instr *instr) 31 { 32 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 33 assert(info->index_map[NIR_INTRINSIC_BASE] > 0); 34 return (int)instr->const_index[info->index_map[NIR_INTRINSIC_BASE] - 1]; 35 } 36 37 static inline void 38 nir_intrinsic_set_base(nir_intrinsic_instr *instr, int val) 39 { 40 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 41 assert(info->index_map[NIR_INTRINSIC_BASE] > 0); 42 instr->const_index[info->index_map[NIR_INTRINSIC_BASE] - 1] = val; 43 } 44 45 static inline bool 46 nir_intrinsic_has_base(const nir_intrinsic_instr *instr) 47 { 48 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 49 return info->index_map[NIR_INTRINSIC_BASE] > 0; 50 } 51 52 53 static inline unsigned 54 nir_intrinsic_write_mask(const nir_intrinsic_instr *instr) 55 { 56 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 57 assert(info->index_map[NIR_INTRINSIC_WRITE_MASK] > 0); 58 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_WRITE_MASK] - 1]; 59 } 60 61 static inline void 62 nir_intrinsic_set_write_mask(nir_intrinsic_instr *instr, unsigned val) 63 { 64 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 65 assert(info->index_map[NIR_INTRINSIC_WRITE_MASK] > 0); 66 instr->const_index[info->index_map[NIR_INTRINSIC_WRITE_MASK] - 1] = val; 67 } 68 69 static inline bool 70 nir_intrinsic_has_write_mask(const nir_intrinsic_instr *instr) 71 { 72 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 73 return info->index_map[NIR_INTRINSIC_WRITE_MASK] > 0; 74 } 75 76 77 static inline unsigned 78 nir_intrinsic_stream_id(const nir_intrinsic_instr *instr) 79 { 80 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 81 assert(info->index_map[NIR_INTRINSIC_STREAM_ID] > 0); 82 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_STREAM_ID] - 1]; 83 } 84 85 static inline void 86 nir_intrinsic_set_stream_id(nir_intrinsic_instr *instr, unsigned val) 87 { 88 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 89 assert(info->index_map[NIR_INTRINSIC_STREAM_ID] > 0); 90 instr->const_index[info->index_map[NIR_INTRINSIC_STREAM_ID] - 1] = val; 91 } 92 93 static inline bool 94 nir_intrinsic_has_stream_id(const nir_intrinsic_instr *instr) 95 { 96 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 97 return info->index_map[NIR_INTRINSIC_STREAM_ID] > 0; 98 } 99 100 101 static inline unsigned 102 nir_intrinsic_ucp_id(const nir_intrinsic_instr *instr) 103 { 104 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 105 assert(info->index_map[NIR_INTRINSIC_UCP_ID] > 0); 106 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_UCP_ID] - 1]; 107 } 108 109 static inline void 110 nir_intrinsic_set_ucp_id(nir_intrinsic_instr *instr, unsigned val) 111 { 112 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 113 assert(info->index_map[NIR_INTRINSIC_UCP_ID] > 0); 114 instr->const_index[info->index_map[NIR_INTRINSIC_UCP_ID] - 1] = val; 115 } 116 117 static inline bool 118 nir_intrinsic_has_ucp_id(const nir_intrinsic_instr *instr) 119 { 120 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 121 return info->index_map[NIR_INTRINSIC_UCP_ID] > 0; 122 } 123 124 125 static inline unsigned 126 nir_intrinsic_range_base(const nir_intrinsic_instr *instr) 127 { 128 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 129 assert(info->index_map[NIR_INTRINSIC_RANGE_BASE] > 0); 130 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_RANGE_BASE] - 1]; 131 } 132 133 static inline void 134 nir_intrinsic_set_range_base(nir_intrinsic_instr *instr, unsigned val) 135 { 136 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 137 assert(info->index_map[NIR_INTRINSIC_RANGE_BASE] > 0); 138 instr->const_index[info->index_map[NIR_INTRINSIC_RANGE_BASE] - 1] = val; 139 } 140 141 static inline bool 142 nir_intrinsic_has_range_base(const nir_intrinsic_instr *instr) 143 { 144 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 145 return info->index_map[NIR_INTRINSIC_RANGE_BASE] > 0; 146 } 147 148 149 static inline unsigned 150 nir_intrinsic_range(const nir_intrinsic_instr *instr) 151 { 152 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 153 assert(info->index_map[NIR_INTRINSIC_RANGE] > 0); 154 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_RANGE] - 1]; 155 } 156 157 static inline void 158 nir_intrinsic_set_range(nir_intrinsic_instr *instr, unsigned val) 159 { 160 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 161 assert(info->index_map[NIR_INTRINSIC_RANGE] > 0); 162 instr->const_index[info->index_map[NIR_INTRINSIC_RANGE] - 1] = val; 163 } 164 165 static inline bool 166 nir_intrinsic_has_range(const nir_intrinsic_instr *instr) 167 { 168 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 169 return info->index_map[NIR_INTRINSIC_RANGE] > 0; 170 } 171 172 173 static inline unsigned 174 nir_intrinsic_desc_set(const nir_intrinsic_instr *instr) 175 { 176 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 177 assert(info->index_map[NIR_INTRINSIC_DESC_SET] > 0); 178 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_DESC_SET] - 1]; 179 } 180 181 static inline void 182 nir_intrinsic_set_desc_set(nir_intrinsic_instr *instr, unsigned val) 183 { 184 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 185 assert(info->index_map[NIR_INTRINSIC_DESC_SET] > 0); 186 instr->const_index[info->index_map[NIR_INTRINSIC_DESC_SET] - 1] = val; 187 } 188 189 static inline bool 190 nir_intrinsic_has_desc_set(const nir_intrinsic_instr *instr) 191 { 192 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 193 return info->index_map[NIR_INTRINSIC_DESC_SET] > 0; 194 } 195 196 197 static inline unsigned 198 nir_intrinsic_binding(const nir_intrinsic_instr *instr) 199 { 200 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 201 assert(info->index_map[NIR_INTRINSIC_BINDING] > 0); 202 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_BINDING] - 1]; 203 } 204 205 static inline void 206 nir_intrinsic_set_binding(nir_intrinsic_instr *instr, unsigned val) 207 { 208 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 209 assert(info->index_map[NIR_INTRINSIC_BINDING] > 0); 210 instr->const_index[info->index_map[NIR_INTRINSIC_BINDING] - 1] = val; 211 } 212 213 static inline bool 214 nir_intrinsic_has_binding(const nir_intrinsic_instr *instr) 215 { 216 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 217 return info->index_map[NIR_INTRINSIC_BINDING] > 0; 218 } 219 220 221 static inline unsigned 222 nir_intrinsic_component(const nir_intrinsic_instr *instr) 223 { 224 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 225 assert(info->index_map[NIR_INTRINSIC_COMPONENT] > 0); 226 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_COMPONENT] - 1]; 227 } 228 229 static inline void 230 nir_intrinsic_set_component(nir_intrinsic_instr *instr, unsigned val) 231 { 232 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 233 assert(info->index_map[NIR_INTRINSIC_COMPONENT] > 0); 234 instr->const_index[info->index_map[NIR_INTRINSIC_COMPONENT] - 1] = val; 235 } 236 237 static inline bool 238 nir_intrinsic_has_component(const nir_intrinsic_instr *instr) 239 { 240 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 241 return info->index_map[NIR_INTRINSIC_COMPONENT] > 0; 242 } 243 244 245 static inline unsigned 246 nir_intrinsic_column(const nir_intrinsic_instr *instr) 247 { 248 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 249 assert(info->index_map[NIR_INTRINSIC_COLUMN] > 0); 250 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_COLUMN] - 1]; 251 } 252 253 static inline void 254 nir_intrinsic_set_column(nir_intrinsic_instr *instr, unsigned val) 255 { 256 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 257 assert(info->index_map[NIR_INTRINSIC_COLUMN] > 0); 258 instr->const_index[info->index_map[NIR_INTRINSIC_COLUMN] - 1] = val; 259 } 260 261 static inline bool 262 nir_intrinsic_has_column(const nir_intrinsic_instr *instr) 263 { 264 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 265 return info->index_map[NIR_INTRINSIC_COLUMN] > 0; 266 } 267 268 269 static inline unsigned 270 nir_intrinsic_interp_mode(const nir_intrinsic_instr *instr) 271 { 272 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 273 assert(info->index_map[NIR_INTRINSIC_INTERP_MODE] > 0); 274 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_INTERP_MODE] - 1]; 275 } 276 277 static inline void 278 nir_intrinsic_set_interp_mode(nir_intrinsic_instr *instr, unsigned val) 279 { 280 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 281 assert(info->index_map[NIR_INTRINSIC_INTERP_MODE] > 0); 282 instr->const_index[info->index_map[NIR_INTRINSIC_INTERP_MODE] - 1] = val; 283 } 284 285 static inline bool 286 nir_intrinsic_has_interp_mode(const nir_intrinsic_instr *instr) 287 { 288 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 289 return info->index_map[NIR_INTRINSIC_INTERP_MODE] > 0; 290 } 291 292 293 static inline unsigned 294 nir_intrinsic_reduction_op(const nir_intrinsic_instr *instr) 295 { 296 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 297 assert(info->index_map[NIR_INTRINSIC_REDUCTION_OP] > 0); 298 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_REDUCTION_OP] - 1]; 299 } 300 301 static inline void 302 nir_intrinsic_set_reduction_op(nir_intrinsic_instr *instr, unsigned val) 303 { 304 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 305 assert(info->index_map[NIR_INTRINSIC_REDUCTION_OP] > 0); 306 instr->const_index[info->index_map[NIR_INTRINSIC_REDUCTION_OP] - 1] = val; 307 } 308 309 static inline bool 310 nir_intrinsic_has_reduction_op(const nir_intrinsic_instr *instr) 311 { 312 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 313 return info->index_map[NIR_INTRINSIC_REDUCTION_OP] > 0; 314 } 315 316 317 static inline unsigned 318 nir_intrinsic_cluster_size(const nir_intrinsic_instr *instr) 319 { 320 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 321 assert(info->index_map[NIR_INTRINSIC_CLUSTER_SIZE] > 0); 322 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_CLUSTER_SIZE] - 1]; 323 } 324 325 static inline void 326 nir_intrinsic_set_cluster_size(nir_intrinsic_instr *instr, unsigned val) 327 { 328 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 329 assert(info->index_map[NIR_INTRINSIC_CLUSTER_SIZE] > 0); 330 instr->const_index[info->index_map[NIR_INTRINSIC_CLUSTER_SIZE] - 1] = val; 331 } 332 333 static inline bool 334 nir_intrinsic_has_cluster_size(const nir_intrinsic_instr *instr) 335 { 336 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 337 return info->index_map[NIR_INTRINSIC_CLUSTER_SIZE] > 0; 338 } 339 340 341 static inline unsigned 342 nir_intrinsic_param_idx(const nir_intrinsic_instr *instr) 343 { 344 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 345 assert(info->index_map[NIR_INTRINSIC_PARAM_IDX] > 0); 346 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_PARAM_IDX] - 1]; 347 } 348 349 static inline void 350 nir_intrinsic_set_param_idx(nir_intrinsic_instr *instr, unsigned val) 351 { 352 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 353 assert(info->index_map[NIR_INTRINSIC_PARAM_IDX] > 0); 354 instr->const_index[info->index_map[NIR_INTRINSIC_PARAM_IDX] - 1] = val; 355 } 356 357 static inline bool 358 nir_intrinsic_has_param_idx(const nir_intrinsic_instr *instr) 359 { 360 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 361 return info->index_map[NIR_INTRINSIC_PARAM_IDX] > 0; 362 } 363 364 365 static inline enum glsl_sampler_dim 366 nir_intrinsic_image_dim(const nir_intrinsic_instr *instr) 367 { 368 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 369 assert(info->index_map[NIR_INTRINSIC_IMAGE_DIM] > 0); 370 return (enum glsl_sampler_dim)instr->const_index[info->index_map[NIR_INTRINSIC_IMAGE_DIM] - 1]; 371 } 372 373 static inline void 374 nir_intrinsic_set_image_dim(nir_intrinsic_instr *instr, enum glsl_sampler_dim val) 375 { 376 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 377 assert(info->index_map[NIR_INTRINSIC_IMAGE_DIM] > 0); 378 instr->const_index[info->index_map[NIR_INTRINSIC_IMAGE_DIM] - 1] = val; 379 } 380 381 static inline bool 382 nir_intrinsic_has_image_dim(const nir_intrinsic_instr *instr) 383 { 384 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 385 return info->index_map[NIR_INTRINSIC_IMAGE_DIM] > 0; 386 } 387 388 389 static inline bool 390 nir_intrinsic_image_array(const nir_intrinsic_instr *instr) 391 { 392 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 393 assert(info->index_map[NIR_INTRINSIC_IMAGE_ARRAY] > 0); 394 return (bool)instr->const_index[info->index_map[NIR_INTRINSIC_IMAGE_ARRAY] - 1]; 395 } 396 397 static inline void 398 nir_intrinsic_set_image_array(nir_intrinsic_instr *instr, bool val) 399 { 400 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 401 assert(info->index_map[NIR_INTRINSIC_IMAGE_ARRAY] > 0); 402 instr->const_index[info->index_map[NIR_INTRINSIC_IMAGE_ARRAY] - 1] = val; 403 } 404 405 static inline bool 406 nir_intrinsic_has_image_array(const nir_intrinsic_instr *instr) 407 { 408 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 409 return info->index_map[NIR_INTRINSIC_IMAGE_ARRAY] > 0; 410 } 411 412 413 static inline enum pipe_format 414 nir_intrinsic_format(const nir_intrinsic_instr *instr) 415 { 416 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 417 assert(info->index_map[NIR_INTRINSIC_FORMAT] > 0); 418 return (enum pipe_format)instr->const_index[info->index_map[NIR_INTRINSIC_FORMAT] - 1]; 419 } 420 421 static inline void 422 nir_intrinsic_set_format(nir_intrinsic_instr *instr, enum pipe_format val) 423 { 424 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 425 assert(info->index_map[NIR_INTRINSIC_FORMAT] > 0); 426 instr->const_index[info->index_map[NIR_INTRINSIC_FORMAT] - 1] = val; 427 } 428 429 static inline bool 430 nir_intrinsic_has_format(const nir_intrinsic_instr *instr) 431 { 432 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 433 return info->index_map[NIR_INTRINSIC_FORMAT] > 0; 434 } 435 436 437 static inline enum gl_access_qualifier 438 nir_intrinsic_access(const nir_intrinsic_instr *instr) 439 { 440 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 441 assert(info->index_map[NIR_INTRINSIC_ACCESS] > 0); 442 return (enum gl_access_qualifier)instr->const_index[info->index_map[NIR_INTRINSIC_ACCESS] - 1]; 443 } 444 445 static inline void 446 nir_intrinsic_set_access(nir_intrinsic_instr *instr, enum gl_access_qualifier val) 447 { 448 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 449 assert(info->index_map[NIR_INTRINSIC_ACCESS] > 0); 450 instr->const_index[info->index_map[NIR_INTRINSIC_ACCESS] - 1] = val; 451 } 452 453 static inline bool 454 nir_intrinsic_has_access(const nir_intrinsic_instr *instr) 455 { 456 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 457 return info->index_map[NIR_INTRINSIC_ACCESS] > 0; 458 } 459 460 461 static inline unsigned 462 nir_intrinsic_call_idx(const nir_intrinsic_instr *instr) 463 { 464 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 465 assert(info->index_map[NIR_INTRINSIC_CALL_IDX] > 0); 466 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_CALL_IDX] - 1]; 467 } 468 469 static inline void 470 nir_intrinsic_set_call_idx(nir_intrinsic_instr *instr, unsigned val) 471 { 472 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 473 assert(info->index_map[NIR_INTRINSIC_CALL_IDX] > 0); 474 instr->const_index[info->index_map[NIR_INTRINSIC_CALL_IDX] - 1] = val; 475 } 476 477 static inline bool 478 nir_intrinsic_has_call_idx(const nir_intrinsic_instr *instr) 479 { 480 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 481 return info->index_map[NIR_INTRINSIC_CALL_IDX] > 0; 482 } 483 484 485 static inline unsigned 486 nir_intrinsic_stack_size(const nir_intrinsic_instr *instr) 487 { 488 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 489 assert(info->index_map[NIR_INTRINSIC_STACK_SIZE] > 0); 490 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_STACK_SIZE] - 1]; 491 } 492 493 static inline void 494 nir_intrinsic_set_stack_size(nir_intrinsic_instr *instr, unsigned val) 495 { 496 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 497 assert(info->index_map[NIR_INTRINSIC_STACK_SIZE] > 0); 498 instr->const_index[info->index_map[NIR_INTRINSIC_STACK_SIZE] - 1] = val; 499 } 500 501 static inline bool 502 nir_intrinsic_has_stack_size(const nir_intrinsic_instr *instr) 503 { 504 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 505 return info->index_map[NIR_INTRINSIC_STACK_SIZE] > 0; 506 } 507 508 509 static inline unsigned 510 nir_intrinsic_align_mul(const nir_intrinsic_instr *instr) 511 { 512 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 513 assert(info->index_map[NIR_INTRINSIC_ALIGN_MUL] > 0); 514 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_ALIGN_MUL] - 1]; 515 } 516 517 static inline void 518 nir_intrinsic_set_align_mul(nir_intrinsic_instr *instr, unsigned val) 519 { 520 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 521 assert(info->index_map[NIR_INTRINSIC_ALIGN_MUL] > 0); 522 instr->const_index[info->index_map[NIR_INTRINSIC_ALIGN_MUL] - 1] = val; 523 } 524 525 static inline bool 526 nir_intrinsic_has_align_mul(const nir_intrinsic_instr *instr) 527 { 528 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 529 return info->index_map[NIR_INTRINSIC_ALIGN_MUL] > 0; 530 } 531 532 533 static inline unsigned 534 nir_intrinsic_align_offset(const nir_intrinsic_instr *instr) 535 { 536 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 537 assert(info->index_map[NIR_INTRINSIC_ALIGN_OFFSET] > 0); 538 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_ALIGN_OFFSET] - 1]; 539 } 540 541 static inline void 542 nir_intrinsic_set_align_offset(nir_intrinsic_instr *instr, unsigned val) 543 { 544 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 545 assert(info->index_map[NIR_INTRINSIC_ALIGN_OFFSET] > 0); 546 instr->const_index[info->index_map[NIR_INTRINSIC_ALIGN_OFFSET] - 1] = val; 547 } 548 549 static inline bool 550 nir_intrinsic_has_align_offset(const nir_intrinsic_instr *instr) 551 { 552 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 553 return info->index_map[NIR_INTRINSIC_ALIGN_OFFSET] > 0; 554 } 555 556 557 static inline unsigned 558 nir_intrinsic_desc_type(const nir_intrinsic_instr *instr) 559 { 560 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 561 assert(info->index_map[NIR_INTRINSIC_DESC_TYPE] > 0); 562 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_DESC_TYPE] - 1]; 563 } 564 565 static inline void 566 nir_intrinsic_set_desc_type(nir_intrinsic_instr *instr, unsigned val) 567 { 568 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 569 assert(info->index_map[NIR_INTRINSIC_DESC_TYPE] > 0); 570 instr->const_index[info->index_map[NIR_INTRINSIC_DESC_TYPE] - 1] = val; 571 } 572 573 static inline bool 574 nir_intrinsic_has_desc_type(const nir_intrinsic_instr *instr) 575 { 576 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 577 return info->index_map[NIR_INTRINSIC_DESC_TYPE] > 0; 578 } 579 580 581 static inline nir_alu_type 582 nir_intrinsic_src_type(const nir_intrinsic_instr *instr) 583 { 584 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 585 assert(info->index_map[NIR_INTRINSIC_SRC_TYPE] > 0); 586 return (nir_alu_type)instr->const_index[info->index_map[NIR_INTRINSIC_SRC_TYPE] - 1]; 587 } 588 589 static inline void 590 nir_intrinsic_set_src_type(nir_intrinsic_instr *instr, nir_alu_type val) 591 { 592 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 593 assert(info->index_map[NIR_INTRINSIC_SRC_TYPE] > 0); 594 instr->const_index[info->index_map[NIR_INTRINSIC_SRC_TYPE] - 1] = val; 595 } 596 597 static inline bool 598 nir_intrinsic_has_src_type(const nir_intrinsic_instr *instr) 599 { 600 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 601 return info->index_map[NIR_INTRINSIC_SRC_TYPE] > 0; 602 } 603 604 605 static inline nir_alu_type 606 nir_intrinsic_dest_type(const nir_intrinsic_instr *instr) 607 { 608 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 609 assert(info->index_map[NIR_INTRINSIC_DEST_TYPE] > 0); 610 return (nir_alu_type)instr->const_index[info->index_map[NIR_INTRINSIC_DEST_TYPE] - 1]; 611 } 612 613 static inline void 614 nir_intrinsic_set_dest_type(nir_intrinsic_instr *instr, nir_alu_type val) 615 { 616 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 617 assert(info->index_map[NIR_INTRINSIC_DEST_TYPE] > 0); 618 instr->const_index[info->index_map[NIR_INTRINSIC_DEST_TYPE] - 1] = val; 619 } 620 621 static inline bool 622 nir_intrinsic_has_dest_type(const nir_intrinsic_instr *instr) 623 { 624 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 625 return info->index_map[NIR_INTRINSIC_DEST_TYPE] > 0; 626 } 627 628 629 static inline unsigned 630 nir_intrinsic_swizzle_mask(const nir_intrinsic_instr *instr) 631 { 632 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 633 assert(info->index_map[NIR_INTRINSIC_SWIZZLE_MASK] > 0); 634 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_SWIZZLE_MASK] - 1]; 635 } 636 637 static inline void 638 nir_intrinsic_set_swizzle_mask(nir_intrinsic_instr *instr, unsigned val) 639 { 640 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 641 assert(info->index_map[NIR_INTRINSIC_SWIZZLE_MASK] > 0); 642 instr->const_index[info->index_map[NIR_INTRINSIC_SWIZZLE_MASK] - 1] = val; 643 } 644 645 static inline bool 646 nir_intrinsic_has_swizzle_mask(const nir_intrinsic_instr *instr) 647 { 648 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 649 return info->index_map[NIR_INTRINSIC_SWIZZLE_MASK] > 0; 650 } 651 652 653 static inline bool 654 nir_intrinsic_is_swizzled(const nir_intrinsic_instr *instr) 655 { 656 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 657 assert(info->index_map[NIR_INTRINSIC_IS_SWIZZLED] > 0); 658 return (bool)instr->const_index[info->index_map[NIR_INTRINSIC_IS_SWIZZLED] - 1]; 659 } 660 661 static inline void 662 nir_intrinsic_set_is_swizzled(nir_intrinsic_instr *instr, bool val) 663 { 664 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 665 assert(info->index_map[NIR_INTRINSIC_IS_SWIZZLED] > 0); 666 instr->const_index[info->index_map[NIR_INTRINSIC_IS_SWIZZLED] - 1] = val; 667 } 668 669 static inline bool 670 nir_intrinsic_has_is_swizzled(const nir_intrinsic_instr *instr) 671 { 672 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 673 return info->index_map[NIR_INTRINSIC_IS_SWIZZLED] > 0; 674 } 675 676 677 static inline bool 678 nir_intrinsic_slc_amd(const nir_intrinsic_instr *instr) 679 { 680 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 681 assert(info->index_map[NIR_INTRINSIC_SLC_AMD] > 0); 682 return (bool)instr->const_index[info->index_map[NIR_INTRINSIC_SLC_AMD] - 1]; 683 } 684 685 static inline void 686 nir_intrinsic_set_slc_amd(nir_intrinsic_instr *instr, bool val) 687 { 688 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 689 assert(info->index_map[NIR_INTRINSIC_SLC_AMD] > 0); 690 instr->const_index[info->index_map[NIR_INTRINSIC_SLC_AMD] - 1] = val; 691 } 692 693 static inline bool 694 nir_intrinsic_has_slc_amd(const nir_intrinsic_instr *instr) 695 { 696 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 697 return info->index_map[NIR_INTRINSIC_SLC_AMD] > 0; 698 } 699 700 701 static inline enum gl_access_qualifier 702 nir_intrinsic_dst_access(const nir_intrinsic_instr *instr) 703 { 704 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 705 assert(info->index_map[NIR_INTRINSIC_DST_ACCESS] > 0); 706 return (enum gl_access_qualifier)instr->const_index[info->index_map[NIR_INTRINSIC_DST_ACCESS] - 1]; 707 } 708 709 static inline void 710 nir_intrinsic_set_dst_access(nir_intrinsic_instr *instr, enum gl_access_qualifier val) 711 { 712 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 713 assert(info->index_map[NIR_INTRINSIC_DST_ACCESS] > 0); 714 instr->const_index[info->index_map[NIR_INTRINSIC_DST_ACCESS] - 1] = val; 715 } 716 717 static inline bool 718 nir_intrinsic_has_dst_access(const nir_intrinsic_instr *instr) 719 { 720 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 721 return info->index_map[NIR_INTRINSIC_DST_ACCESS] > 0; 722 } 723 724 725 static inline enum gl_access_qualifier 726 nir_intrinsic_src_access(const nir_intrinsic_instr *instr) 727 { 728 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 729 assert(info->index_map[NIR_INTRINSIC_SRC_ACCESS] > 0); 730 return (enum gl_access_qualifier)instr->const_index[info->index_map[NIR_INTRINSIC_SRC_ACCESS] - 1]; 731 } 732 733 static inline void 734 nir_intrinsic_set_src_access(nir_intrinsic_instr *instr, enum gl_access_qualifier val) 735 { 736 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 737 assert(info->index_map[NIR_INTRINSIC_SRC_ACCESS] > 0); 738 instr->const_index[info->index_map[NIR_INTRINSIC_SRC_ACCESS] - 1] = val; 739 } 740 741 static inline bool 742 nir_intrinsic_has_src_access(const nir_intrinsic_instr *instr) 743 { 744 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 745 return info->index_map[NIR_INTRINSIC_SRC_ACCESS] > 0; 746 } 747 748 749 static inline unsigned 750 nir_intrinsic_driver_location(const nir_intrinsic_instr *instr) 751 { 752 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 753 assert(info->index_map[NIR_INTRINSIC_DRIVER_LOCATION] > 0); 754 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_DRIVER_LOCATION] - 1]; 755 } 756 757 static inline void 758 nir_intrinsic_set_driver_location(nir_intrinsic_instr *instr, unsigned val) 759 { 760 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 761 assert(info->index_map[NIR_INTRINSIC_DRIVER_LOCATION] > 0); 762 instr->const_index[info->index_map[NIR_INTRINSIC_DRIVER_LOCATION] - 1] = val; 763 } 764 765 static inline bool 766 nir_intrinsic_has_driver_location(const nir_intrinsic_instr *instr) 767 { 768 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 769 return info->index_map[NIR_INTRINSIC_DRIVER_LOCATION] > 0; 770 } 771 772 773 static inline nir_memory_semantics 774 nir_intrinsic_memory_semantics(const nir_intrinsic_instr *instr) 775 { 776 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 777 assert(info->index_map[NIR_INTRINSIC_MEMORY_SEMANTICS] > 0); 778 return (nir_memory_semantics)instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_SEMANTICS] - 1]; 779 } 780 781 static inline void 782 nir_intrinsic_set_memory_semantics(nir_intrinsic_instr *instr, nir_memory_semantics val) 783 { 784 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 785 assert(info->index_map[NIR_INTRINSIC_MEMORY_SEMANTICS] > 0); 786 instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_SEMANTICS] - 1] = val; 787 } 788 789 static inline bool 790 nir_intrinsic_has_memory_semantics(const nir_intrinsic_instr *instr) 791 { 792 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 793 return info->index_map[NIR_INTRINSIC_MEMORY_SEMANTICS] > 0; 794 } 795 796 797 static inline nir_variable_mode 798 nir_intrinsic_memory_modes(const nir_intrinsic_instr *instr) 799 { 800 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 801 assert(info->index_map[NIR_INTRINSIC_MEMORY_MODES] > 0); 802 return (nir_variable_mode)instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_MODES] - 1]; 803 } 804 805 static inline void 806 nir_intrinsic_set_memory_modes(nir_intrinsic_instr *instr, nir_variable_mode val) 807 { 808 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 809 assert(info->index_map[NIR_INTRINSIC_MEMORY_MODES] > 0); 810 instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_MODES] - 1] = val; 811 } 812 813 static inline bool 814 nir_intrinsic_has_memory_modes(const nir_intrinsic_instr *instr) 815 { 816 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 817 return info->index_map[NIR_INTRINSIC_MEMORY_MODES] > 0; 818 } 819 820 821 static inline nir_scope 822 nir_intrinsic_memory_scope(const nir_intrinsic_instr *instr) 823 { 824 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 825 assert(info->index_map[NIR_INTRINSIC_MEMORY_SCOPE] > 0); 826 return (nir_scope)instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_SCOPE] - 1]; 827 } 828 829 static inline void 830 nir_intrinsic_set_memory_scope(nir_intrinsic_instr *instr, nir_scope val) 831 { 832 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 833 assert(info->index_map[NIR_INTRINSIC_MEMORY_SCOPE] > 0); 834 instr->const_index[info->index_map[NIR_INTRINSIC_MEMORY_SCOPE] - 1] = val; 835 } 836 837 static inline bool 838 nir_intrinsic_has_memory_scope(const nir_intrinsic_instr *instr) 839 { 840 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 841 return info->index_map[NIR_INTRINSIC_MEMORY_SCOPE] > 0; 842 } 843 844 845 static inline nir_scope 846 nir_intrinsic_execution_scope(const nir_intrinsic_instr *instr) 847 { 848 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 849 assert(info->index_map[NIR_INTRINSIC_EXECUTION_SCOPE] > 0); 850 return (nir_scope)instr->const_index[info->index_map[NIR_INTRINSIC_EXECUTION_SCOPE] - 1]; 851 } 852 853 static inline void 854 nir_intrinsic_set_execution_scope(nir_intrinsic_instr *instr, nir_scope val) 855 { 856 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 857 assert(info->index_map[NIR_INTRINSIC_EXECUTION_SCOPE] > 0); 858 instr->const_index[info->index_map[NIR_INTRINSIC_EXECUTION_SCOPE] - 1] = val; 859 } 860 861 static inline bool 862 nir_intrinsic_has_execution_scope(const nir_intrinsic_instr *instr) 863 { 864 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 865 return info->index_map[NIR_INTRINSIC_EXECUTION_SCOPE] > 0; 866 } 867 868 869 static inline struct nir_io_semantics 870 nir_intrinsic_io_semantics(const nir_intrinsic_instr *instr) 871 { 872 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 873 assert(info->index_map[NIR_INTRINSIC_IO_SEMANTICS] > 0); 874 struct nir_io_semantics res; 875 STATIC_ASSERT(sizeof(instr->const_index[0]) == sizeof(res)); 876 memcpy(&res, &instr->const_index[info->index_map[NIR_INTRINSIC_IO_SEMANTICS] - 1], sizeof(res)); 877 return res; 878 } 879 880 static inline void 881 nir_intrinsic_set_io_semantics(nir_intrinsic_instr *instr, struct nir_io_semantics val) 882 { 883 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 884 assert(info->index_map[NIR_INTRINSIC_IO_SEMANTICS] > 0); 885 val._pad = 0; /* clear padding bits */ 886 STATIC_ASSERT(sizeof(instr->const_index[0]) == sizeof(val)); 887 memcpy(&instr->const_index[info->index_map[NIR_INTRINSIC_IO_SEMANTICS] - 1], &val, sizeof(val)); 888 } 889 890 static inline bool 891 nir_intrinsic_has_io_semantics(const nir_intrinsic_instr *instr) 892 { 893 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 894 return info->index_map[NIR_INTRINSIC_IO_SEMANTICS] > 0; 895 } 896 897 898 static inline nir_rounding_mode 899 nir_intrinsic_rounding_mode(const nir_intrinsic_instr *instr) 900 { 901 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 902 assert(info->index_map[NIR_INTRINSIC_ROUNDING_MODE] > 0); 903 return (nir_rounding_mode)instr->const_index[info->index_map[NIR_INTRINSIC_ROUNDING_MODE] - 1]; 904 } 905 906 static inline void 907 nir_intrinsic_set_rounding_mode(nir_intrinsic_instr *instr, nir_rounding_mode val) 908 { 909 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 910 assert(info->index_map[NIR_INTRINSIC_ROUNDING_MODE] > 0); 911 instr->const_index[info->index_map[NIR_INTRINSIC_ROUNDING_MODE] - 1] = val; 912 } 913 914 static inline bool 915 nir_intrinsic_has_rounding_mode(const nir_intrinsic_instr *instr) 916 { 917 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 918 return info->index_map[NIR_INTRINSIC_ROUNDING_MODE] > 0; 919 } 920 921 922 static inline unsigned 923 nir_intrinsic_saturate(const nir_intrinsic_instr *instr) 924 { 925 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 926 assert(info->index_map[NIR_INTRINSIC_SATURATE] > 0); 927 return (unsigned)instr->const_index[info->index_map[NIR_INTRINSIC_SATURATE] - 1]; 928 } 929 930 static inline void 931 nir_intrinsic_set_saturate(nir_intrinsic_instr *instr, unsigned val) 932 { 933 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 934 assert(info->index_map[NIR_INTRINSIC_SATURATE] > 0); 935 instr->const_index[info->index_map[NIR_INTRINSIC_SATURATE] - 1] = val; 936 } 937 938 static inline bool 939 nir_intrinsic_has_saturate(const nir_intrinsic_instr *instr) 940 { 941 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; 942 return info->index_map[NIR_INTRINSIC_SATURATE] > 0; 943 } 944 945 #endif /* _NIR_INTRINSICS_INDICES_ */