1 /* 2 * Copyright 2015 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 * Authors: 24 * Jason Ekstrand (jason (at) jlekstrand.net) 25 * 26 */ 27 28 #ifndef _VTN_PRIVATE_H_ 29 #define _VTN_PRIVATE_H_ 30 31 #include <setjmp.h> 32 33 #include "nir/nir.h" 34 #include "nir/nir_builder.h" 35 #include "util/u_dynarray.h" 36 #include "nir_spirv.h" 37 #include "spirv.h" 38 39 struct vtn_builder; 40 struct vtn_decoration; 41 42 void vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level, 43 size_t spirv_offset, const char *message); 44 45 void vtn_logf(struct vtn_builder *b, enum nir_spirv_debug_level level, 46 size_t spirv_offset, const char *fmt, ...) PRINTFLIKE(4, 5); 47 48 #define vtn_info(...) vtn_logf(b, NIR_SPIRV_DEBUG_LEVEL_INFO, 0, __VA_ARGS__) 49 50 void _vtn_warn(struct vtn_builder *b, const char *file, unsigned line, 51 const char *fmt, ...) PRINTFLIKE(4, 5); 52 #define vtn_warn(...) _vtn_warn(b, __FILE__, __LINE__, __VA_ARGS__) 53 54 /** Fail SPIR-V parsing 55 * 56 * This function logs an error and then bails out of the shader compile using 57 * longjmp. This being safe relies on two things: 58 * 59 * 1) We must guarantee that setjmp is called after allocating the builder 60 * and setting up b->debug (so that logging works) but before before any 61 * errors have a chance to occur. 62 * 63 * 2) While doing the SPIR-V -> NIR conversion, we need to be careful to 64 * ensure that all heap allocations happen through ralloc and are parented 65 * to the builder. This way they will get properly cleaned up on error. 66 * 67 * 3) We must ensure that _vtn_fail is never called while a mutex lock or a 68 * reference to any other resource is held with the exception of ralloc 69 * objects which are parented to the builder. 70 * 71 * So long as these two things continue to hold, we can easily longjmp back to 72 * spirv_to_nir(), clean up the builder, and return NULL. 73 */ 74 void _vtn_fail(struct vtn_builder *b, const char *file, unsigned line, 75 const char *fmt, ...) NORETURN PRINTFLIKE(4, 5); 76 #define vtn_fail(...) _vtn_fail(b, __FILE__, __LINE__, __VA_ARGS__) 77 78 /** Fail if the given expression evaluates to true */ 79 #define vtn_fail_if(expr, ...) \ 80 do { \ 81 if (unlikely(expr)) \ 82 vtn_fail(__VA_ARGS__); \ 83 } while (0) 84 85 /** Assert that a condition is true and, if it isn't, vtn_fail 86 * 87 * This macro is transitional only and should not be used in new code. Use 88 * vtn_fail_if and provide a real message instead. 89 */ 90 #define vtn_assert(expr) \ 91 do { \ 92 if (!likely(expr)) \ 93 vtn_fail("%s", #expr); \ 94 } while (0) 95 96 enum vtn_value_type { 97 vtn_value_type_invalid = 0, 98 vtn_value_type_undef, 99 vtn_value_type_string, 100 vtn_value_type_decoration_group, 101 vtn_value_type_type, 102 vtn_value_type_constant, 103 vtn_value_type_pointer, 104 vtn_value_type_function, 105 vtn_value_type_block, 106 vtn_value_type_ssa, 107 vtn_value_type_extension, 108 vtn_value_type_image_pointer, 109 vtn_value_type_sampled_image, 110 }; 111 112 enum vtn_branch_type { 113 vtn_branch_type_none, 114 vtn_branch_type_switch_break, 115 vtn_branch_type_switch_fallthrough, 116 vtn_branch_type_loop_break, 117 vtn_branch_type_loop_continue, 118 vtn_branch_type_discard, 119 vtn_branch_type_return, 120 }; 121 122 enum vtn_cf_node_type { 123 vtn_cf_node_type_block, 124 vtn_cf_node_type_if, 125 vtn_cf_node_type_loop, 126 vtn_cf_node_type_switch, 127 }; 128 129 struct vtn_cf_node { 130 struct list_head link; 131 enum vtn_cf_node_type type; 132 }; 133 134 struct vtn_loop { 135 struct vtn_cf_node node; 136 137 /* The main body of the loop */ 138 struct list_head body; 139 140 /* The "continue" part of the loop. This gets executed after the body 141 * and is where you go when you hit a continue. 142 */ 143 struct list_head cont_body; 144 145 SpvLoopControlMask control; 146 }; 147 148 struct vtn_if { 149 struct vtn_cf_node node; 150 151 uint32_t condition; 152 153 enum vtn_branch_type then_type; 154 struct list_head then_body; 155 156 enum vtn_branch_type else_type; 157 struct list_head else_body; 158 159 SpvSelectionControlMask control; 160 }; 161 162 struct vtn_case { 163 struct list_head link; 164 165 struct list_head body; 166 167 /* The block that starts this case */ 168 struct vtn_block *start_block; 169 170 /* The fallthrough case, if any */ 171 struct vtn_case *fallthrough; 172 173 /* The uint32_t values that map to this case */ 174 struct util_dynarray values; 175 176 /* True if this is the default case */ 177 bool is_default; 178 179 /* Initialized to false; used when sorting the list of cases */ 180 bool visited; 181 }; 182 183 struct vtn_switch { 184 struct vtn_cf_node node; 185 186 uint32_t selector; 187 188 struct list_head cases; 189 }; 190 191 struct vtn_block { 192 struct vtn_cf_node node; 193 194 /** A pointer to the label instruction */ 195 const uint32_t *label; 196 197 /** A pointer to the merge instruction (or NULL if non exists) */ 198 const uint32_t *merge; 199 200 /** A pointer to the branch instruction that ends this block */ 201 const uint32_t *branch; 202 203 enum vtn_branch_type branch_type; 204 205 /** Points to the loop that this block starts (if it starts a loop) */ 206 struct vtn_loop *loop; 207 208 /** Points to the switch case started by this block (if any) */ 209 struct vtn_case *switch_case; 210 211 /** Every block ends in a nop intrinsic so that we can find it again */ 212 nir_intrinsic_instr *end_nop; 213 }; 214 215 struct vtn_function { 216 struct exec_node node; 217 218 bool referenced; 219 bool emitted; 220 221 nir_function_impl *impl; 222 struct vtn_block *start_block; 223 224 struct list_head body; 225 226 const uint32_t *end; 227 228 SpvFunctionControlMask control; 229 }; 230 231 typedef bool (*vtn_instruction_handler)(struct vtn_builder *, uint32_t, 232 const uint32_t *, unsigned); 233 234 void vtn_build_cfg(struct vtn_builder *b, const uint32_t *words, 235 const uint32_t *end); 236 void vtn_function_emit(struct vtn_builder *b, struct vtn_function *func, 237 vtn_instruction_handler instruction_handler); 238 239 const uint32_t * 240 vtn_foreach_instruction(struct vtn_builder *b, const uint32_t *start, 241 const uint32_t *end, vtn_instruction_handler handler); 242 243 struct vtn_ssa_value { 244 union { 245 nir_ssa_def *def; 246 struct vtn_ssa_value **elems; 247 }; 248 249 /* For matrices, if this is non-NULL, then this value is actually the 250 * transpose of some other value. The value that `transposed` points to 251 * always dominates this value. 252 */ 253 struct vtn_ssa_value *transposed; 254 255 const struct glsl_type *type; 256 }; 257 258 enum vtn_base_type { 259 vtn_base_type_void, 260 vtn_base_type_scalar, 261 vtn_base_type_vector, 262 vtn_base_type_matrix, 263 vtn_base_type_array, 264 vtn_base_type_struct, 265 vtn_base_type_pointer, 266 vtn_base_type_image, 267 vtn_base_type_sampler, 268 vtn_base_type_sampled_image, 269 vtn_base_type_function, 270 }; 271 272 struct vtn_type { 273 enum vtn_base_type base_type; 274 275 const struct glsl_type *type; 276 277 /* The SPIR-V id of the given type. */ 278 uint32_t id; 279 280 /* Specifies the length of complex types. 281 * 282 * For Workgroup pointers, this is the size of the referenced type. 283 */ 284 unsigned length; 285 286 /* for arrays, matrices and pointers, the array stride */ 287 unsigned stride; 288 289 union { 290 /* Members for scalar, vector, and array-like types */ 291 struct { 292 /* for arrays, the vtn_type for the elements of the array */ 293 struct vtn_type *array_element; 294 295 /* for matrices, whether the matrix is stored row-major */ 296 bool row_major:1; 297 298 /* Whether this type, or a parent type, has been decorated as a 299 * builtin 300 */ 301 bool is_builtin:1; 302 303 /* Which built-in to use */ 304 SpvBuiltIn builtin; 305 }; 306 307 /* Members for struct types */ 308 struct { 309 /* for structures, the vtn_type for each member */ 310 struct vtn_type **members; 311 312 /* for structs, the offset of each member */ 313 unsigned *offsets; 314 315 /* for structs, whether it was decorated as a "non-SSBO-like" block */ 316 bool block:1; 317 318 /* for structs, whether it was decorated as an "SSBO-like" block */ 319 bool buffer_block:1; 320 321 /* for structs with block == true, whether this is a builtin block 322 * (i.e. a block that contains only builtins). 323 */ 324 bool builtin_block:1; 325 }; 326 327 /* Members for pointer types */ 328 struct { 329 /* For pointers, the vtn_type for dereferenced type */ 330 struct vtn_type *deref; 331 332 /* Storage class for pointers */ 333 SpvStorageClass storage_class; 334 335 /* Required alignment for pointers */ 336 uint32_t align; 337 }; 338 339 /* Members for image types */ 340 struct { 341 /* For images, indicates whether it's sampled or storage */ 342 bool sampled; 343 344 /* Image format for image_load_store type images */ 345 unsigned image_format; 346 347 /* Access qualifier for storage images */ 348 SpvAccessQualifier access_qualifier; 349 }; 350 351 /* Members for sampled image types */ 352 struct { 353 /* For sampled images, the image type */ 354 struct vtn_type *image; 355 }; 356 357 /* Members for function types */ 358 struct { 359 /* For functions, the vtn_type for each parameter */ 360 struct vtn_type **params; 361 362 /* Return type for functions */ 363 struct vtn_type *return_type; 364 }; 365 }; 366 }; 367 368 bool vtn_types_compatible(struct vtn_builder *b, 369 struct vtn_type *t1, struct vtn_type *t2); 370 371 struct vtn_variable; 372 373 enum vtn_access_mode { 374 vtn_access_mode_id, 375 vtn_access_mode_literal, 376 }; 377 378 struct vtn_access_link { 379 enum vtn_access_mode mode; 380 uint32_t id; 381 }; 382 383 struct vtn_access_chain { 384 uint32_t length; 385 386 /** Whether or not to treat the base pointer as an array. This is only 387 * true if this access chain came from an OpPtrAccessChain. 388 */ 389 bool ptr_as_array; 390 391 /** Struct elements and array offsets. 392 * 393 * This is an array of 1 so that it can conveniently be created on the 394 * stack but the real length is given by the length field. 395 */ 396 struct vtn_access_link link[1]; 397 }; 398 399 enum vtn_variable_mode { 400 vtn_variable_mode_local, 401 vtn_variable_mode_global, 402 vtn_variable_mode_param, 403 vtn_variable_mode_ubo, 404 vtn_variable_mode_ssbo, 405 vtn_variable_mode_push_constant, 406 vtn_variable_mode_image, 407 vtn_variable_mode_sampler, 408 vtn_variable_mode_workgroup, 409 vtn_variable_mode_input, 410 vtn_variable_mode_output, 411 }; 412 413 struct vtn_pointer { 414 /** The variable mode for the referenced data */ 415 enum vtn_variable_mode mode; 416 417 /** The dereferenced type of this pointer */ 418 struct vtn_type *type; 419 420 /** The pointer type of this pointer 421 * 422 * This may be NULL for some temporary pointers constructed as part of a 423 * large load, store, or copy. It MUST be valid for all pointers which are 424 * stored as SPIR-V SSA values. 425 */ 426 struct vtn_type *ptr_type; 427 428 /** The referenced variable, if known 429 * 430 * This field may be NULL if the pointer uses a (block_index, offset) pair 431 * instead of an access chain. 432 */ 433 struct vtn_variable *var; 434 435 /** An access chain describing how to get from var to the referenced data 436 * 437 * This field may be NULL if the pointer references the entire variable or 438 * if a (block_index, offset) pair is used instead of an access chain. 439 */ 440 struct vtn_access_chain *chain; 441 442 /** A (block_index, offset) pair representing a UBO or SSBO position. */ 443 struct nir_ssa_def *block_index; 444 struct nir_ssa_def *offset; 445 }; 446 447 struct vtn_variable { 448 enum vtn_variable_mode mode; 449 450 struct vtn_type *type; 451 452 unsigned descriptor_set; 453 unsigned binding; 454 unsigned input_attachment_index; 455 bool patch; 456 457 nir_variable *var; 458 nir_variable **members; 459 460 int shared_location; 461 462 /** 463 * In some early released versions of GLSLang, it implemented all function 464 * calls by making copies of all parameters into temporary variables and 465 * passing those variables into the function. It even did so for samplers 466 * and images which violates the SPIR-V spec. Unfortunately, two games 467 * (Talos Principle and Doom) shipped with this old version of GLSLang and 468 * also happen to pass samplers into functions. Talos Principle received 469 * an update fairly shortly after release with an updated GLSLang. Doom, 470 * on the other hand, has never received an update so we need to work 471 * around this GLSLang issue in SPIR-V -> NIR. Hopefully, we can drop this 472 * hack at some point in the future. 473 */ 474 struct vtn_pointer *copy_prop_sampler; 475 }; 476 477 struct vtn_image_pointer { 478 struct vtn_pointer *image; 479 nir_ssa_def *coord; 480 nir_ssa_def *sample; 481 }; 482 483 struct vtn_sampled_image { 484 struct vtn_type *type; 485 struct vtn_pointer *image; /* Image or array of images */ 486 struct vtn_pointer *sampler; /* Sampler */ 487 }; 488 489 struct vtn_value { 490 enum vtn_value_type value_type; 491 const char *name; 492 struct vtn_decoration *decoration; 493 struct vtn_type *type; 494 union { 495 void *ptr; 496 char *str; 497 nir_constant *constant; 498 struct vtn_pointer *pointer; 499 struct vtn_image_pointer *image; 500 struct vtn_sampled_image *sampled_image; 501 struct vtn_function *func; 502 struct vtn_block *block; 503 struct vtn_ssa_value *ssa; 504 vtn_instruction_handler ext_handler; 505 }; 506 }; 507 508 #define VTN_DEC_DECORATION -1 509 #define VTN_DEC_EXECUTION_MODE -2 510 #define VTN_DEC_STRUCT_MEMBER0 0 511 512 struct vtn_decoration { 513 struct vtn_decoration *next; 514 515 /* Specifies how to apply this decoration. Negative values represent a 516 * decoration or execution mode. (See the VTN_DEC_ #defines above.) 517 * Non-negative values specify that it applies to a structure member. 518 */ 519 int scope; 520 521 const uint32_t *literals; 522 struct vtn_value *group; 523 524 union { 525 SpvDecoration decoration; 526 SpvExecutionMode exec_mode; 527 }; 528 }; 529 530 struct vtn_builder { 531 nir_builder nb; 532 533 /* Used by vtn_fail to jump back to the beginning of SPIR-V compilation */ 534 jmp_buf fail_jump; 535 536 const uint32_t *spirv; 537 size_t spirv_word_count; 538 539 nir_shader *shader; 540 const struct spirv_to_nir_options *options; 541 struct vtn_block *block; 542 543 /* Current offset, file, line, and column. Useful for debugging. Set 544 * automatically by vtn_foreach_instruction. 545 */ 546 size_t spirv_offset; 547 char *file; 548 int line, col; 549 550 /* 551 * In SPIR-V, constants are global, whereas in NIR, the load_const 552 * instruction we use is per-function. So while we parse each function, we 553 * keep a hash table of constants we've resolved to nir_ssa_value's so 554 * far, and we lazily resolve them when we see them used in a function. 555 */ 556 struct hash_table *const_table; 557 558 /* 559 * Map from phi instructions (pointer to the start of the instruction) 560 * to the variable corresponding to it. 561 */ 562 struct hash_table *phi_table; 563 564 unsigned num_specializations; 565 struct nir_spirv_specialization *specializations; 566 567 unsigned value_id_bound; 568 struct vtn_value *values; 569 570 gl_shader_stage entry_point_stage; 571 const char *entry_point_name; 572 struct vtn_value *entry_point; 573 bool origin_upper_left; 574 bool pixel_center_integer; 575 576 struct vtn_function *func; 577 struct exec_list functions; 578 579 /* Current function parameter index */ 580 unsigned func_param_idx; 581 582 bool has_loop_continue; 583 }; 584 585 nir_ssa_def * 586 vtn_pointer_to_ssa(struct vtn_builder *b, struct vtn_pointer *ptr); 587 struct vtn_pointer * 588 vtn_pointer_from_ssa(struct vtn_builder *b, nir_ssa_def *ssa, 589 struct vtn_type *ptr_type); 590 591 static inline struct vtn_value * 592 vtn_untyped_value(struct vtn_builder *b, uint32_t value_id) 593 { 594 vtn_fail_if(value_id >= b->value_id_bound, 595 "SPIR-V id %u is out-of-bounds", value_id); 596 return &b->values[value_id]; 597 } 598 599 static inline struct vtn_value * 600 vtn_push_value(struct vtn_builder *b, uint32_t value_id, 601 enum vtn_value_type value_type) 602 { 603 struct vtn_value *val = vtn_untyped_value(b, value_id); 604 605 vtn_fail_if(val->value_type != vtn_value_type_invalid, 606 "SPIR-V id %u has already been written by another instruction", 607 value_id); 608 609 val->value_type = value_type; 610 return &b->values[value_id]; 611 } 612 613 static inline struct vtn_value * 614 vtn_push_ssa(struct vtn_builder *b, uint32_t value_id, 615 struct vtn_type *type, struct vtn_ssa_value *ssa) 616 { 617 struct vtn_value *val; 618 if (type->base_type == vtn_base_type_pointer) { 619 val = vtn_push_value(b, value_id, vtn_value_type_pointer); 620 val->pointer = vtn_pointer_from_ssa(b, ssa->def, type); 621 } else { 622 val = vtn_push_value(b, value_id, vtn_value_type_ssa); 623 val->ssa = ssa; 624 } 625 return val; 626 } 627 628 static inline struct vtn_value * 629 vtn_value(struct vtn_builder *b, uint32_t value_id, 630 enum vtn_value_type value_type) 631 { 632 struct vtn_value *val = vtn_untyped_value(b, value_id); 633 vtn_fail_if(val->value_type != value_type, 634 "SPIR-V id %u is the wrong kind of value", value_id); 635 return val; 636 } 637 638 bool 639 vtn_set_instruction_result_type(struct vtn_builder *b, SpvOp opcode, 640 const uint32_t *w, unsigned count); 641 642 struct vtn_ssa_value *vtn_ssa_value(struct vtn_builder *b, uint32_t value_id); 643 644 struct vtn_ssa_value *vtn_create_ssa_value(struct vtn_builder *b, 645 const struct glsl_type *type); 646 647 struct vtn_ssa_value *vtn_ssa_transpose(struct vtn_builder *b, 648 struct vtn_ssa_value *src); 649 650 nir_ssa_def *vtn_vector_extract(struct vtn_builder *b, nir_ssa_def *src, 651 unsigned index); 652 nir_ssa_def *vtn_vector_extract_dynamic(struct vtn_builder *b, nir_ssa_def *src, 653 nir_ssa_def *index); 654 nir_ssa_def *vtn_vector_insert(struct vtn_builder *b, nir_ssa_def *src, 655 nir_ssa_def *insert, unsigned index); 656 nir_ssa_def *vtn_vector_insert_dynamic(struct vtn_builder *b, nir_ssa_def *src, 657 nir_ssa_def *insert, nir_ssa_def *index); 658 659 nir_deref_var *vtn_nir_deref(struct vtn_builder *b, uint32_t id); 660 661 struct vtn_pointer *vtn_pointer_for_variable(struct vtn_builder *b, 662 struct vtn_variable *var, 663 struct vtn_type *ptr_type); 664 665 nir_deref_var *vtn_pointer_to_deref(struct vtn_builder *b, 666 struct vtn_pointer *ptr); 667 nir_ssa_def * 668 vtn_pointer_to_offset(struct vtn_builder *b, struct vtn_pointer *ptr, 669 nir_ssa_def **index_out, unsigned *end_idx_out); 670 671 struct vtn_ssa_value *vtn_local_load(struct vtn_builder *b, nir_deref_var *src); 672 673 void vtn_local_store(struct vtn_builder *b, struct vtn_ssa_value *src, 674 nir_deref_var *dest); 675 676 struct vtn_ssa_value * 677 vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src); 678 679 void vtn_variable_store(struct vtn_builder *b, struct vtn_ssa_value *src, 680 struct vtn_pointer *dest); 681 682 void vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, 683 const uint32_t *w, unsigned count); 684 685 686 typedef void (*vtn_decoration_foreach_cb)(struct vtn_builder *, 687 struct vtn_value *, 688 int member, 689 const struct vtn_decoration *, 690 void *); 691 692 void vtn_foreach_decoration(struct vtn_builder *b, struct vtn_value *value, 693 vtn_decoration_foreach_cb cb, void *data); 694 695 typedef void (*vtn_execution_mode_foreach_cb)(struct vtn_builder *, 696 struct vtn_value *, 697 const struct vtn_decoration *, 698 void *); 699 700 void vtn_foreach_execution_mode(struct vtn_builder *b, struct vtn_value *value, 701 vtn_execution_mode_foreach_cb cb, void *data); 702 703 nir_op vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, 704 SpvOp opcode, bool *swap, 705 nir_alu_type src, nir_alu_type dst); 706 707 void vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, 708 const uint32_t *w, unsigned count); 709 710 bool vtn_handle_glsl450_instruction(struct vtn_builder *b, uint32_t ext_opcode, 711 const uint32_t *words, unsigned count); 712 713 static inline uint32_t 714 vtn_align_u32(uint32_t v, uint32_t a) 715 { 716 assert(a != 0 && a == (a & -a)); 717 return (v + a - 1) & ~(a - 1); 718 } 719 720 static inline uint64_t 721 vtn_u64_literal(const uint32_t *w) 722 { 723 return (uint64_t)w[1] << 32 | w[0]; 724 } 725 726 #endif /* _VTN_PRIVATE_H_ */ 727