Home | History | Annotate | Download | only in spirv
      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 #include "nir/nir.h"
     29 #include "nir/nir_builder.h"
     30 #include "nir/nir_array.h"
     31 #include "nir_spirv.h"
     32 #include "spirv.h"
     33 
     34 struct vtn_builder;
     35 struct vtn_decoration;
     36 
     37 enum vtn_value_type {
     38    vtn_value_type_invalid = 0,
     39    vtn_value_type_undef,
     40    vtn_value_type_string,
     41    vtn_value_type_decoration_group,
     42    vtn_value_type_type,
     43    vtn_value_type_constant,
     44    vtn_value_type_access_chain,
     45    vtn_value_type_function,
     46    vtn_value_type_block,
     47    vtn_value_type_ssa,
     48    vtn_value_type_extension,
     49    vtn_value_type_image_pointer,
     50    vtn_value_type_sampled_image,
     51 };
     52 
     53 enum vtn_branch_type {
     54    vtn_branch_type_none,
     55    vtn_branch_type_switch_break,
     56    vtn_branch_type_switch_fallthrough,
     57    vtn_branch_type_loop_break,
     58    vtn_branch_type_loop_continue,
     59    vtn_branch_type_discard,
     60    vtn_branch_type_return,
     61 };
     62 
     63 enum vtn_cf_node_type {
     64    vtn_cf_node_type_block,
     65    vtn_cf_node_type_if,
     66    vtn_cf_node_type_loop,
     67    vtn_cf_node_type_switch,
     68 };
     69 
     70 struct vtn_cf_node {
     71    struct list_head link;
     72    enum vtn_cf_node_type type;
     73 };
     74 
     75 struct vtn_loop {
     76    struct vtn_cf_node node;
     77 
     78    /* The main body of the loop */
     79    struct list_head body;
     80 
     81    /* The "continue" part of the loop.  This gets executed after the body
     82     * and is where you go when you hit a continue.
     83     */
     84    struct list_head cont_body;
     85 
     86    SpvLoopControlMask control;
     87 };
     88 
     89 struct vtn_if {
     90    struct vtn_cf_node node;
     91 
     92    uint32_t condition;
     93 
     94    enum vtn_branch_type then_type;
     95    struct list_head then_body;
     96 
     97    enum vtn_branch_type else_type;
     98    struct list_head else_body;
     99 
    100    SpvSelectionControlMask control;
    101 };
    102 
    103 struct vtn_case {
    104    struct list_head link;
    105 
    106    struct list_head body;
    107 
    108    /* The block that starts this case */
    109    struct vtn_block *start_block;
    110 
    111    /* The fallthrough case, if any */
    112    struct vtn_case *fallthrough;
    113 
    114    /* The uint32_t values that map to this case */
    115    nir_array values;
    116 
    117    /* True if this is the default case */
    118    bool is_default;
    119 
    120    /* Initialized to false; used when sorting the list of cases */
    121    bool visited;
    122 };
    123 
    124 struct vtn_switch {
    125    struct vtn_cf_node node;
    126 
    127    uint32_t selector;
    128 
    129    struct list_head cases;
    130 };
    131 
    132 struct vtn_block {
    133    struct vtn_cf_node node;
    134 
    135    /** A pointer to the label instruction */
    136    const uint32_t *label;
    137 
    138    /** A pointer to the merge instruction (or NULL if non exists) */
    139    const uint32_t *merge;
    140 
    141    /** A pointer to the branch instruction that ends this block */
    142    const uint32_t *branch;
    143 
    144    enum vtn_branch_type branch_type;
    145 
    146    /** Points to the loop that this block starts (if it starts a loop) */
    147    struct vtn_loop *loop;
    148 
    149    /** Points to the switch case started by this block (if any) */
    150    struct vtn_case *switch_case;
    151 
    152    /** Every block ends in a nop intrinsic so that we can find it again */
    153    nir_intrinsic_instr *end_nop;
    154 };
    155 
    156 struct vtn_function {
    157    struct exec_node node;
    158 
    159    nir_function_impl *impl;
    160    struct vtn_block *start_block;
    161 
    162    struct list_head body;
    163 
    164    const uint32_t *end;
    165 
    166    SpvFunctionControlMask control;
    167 };
    168 
    169 typedef bool (*vtn_instruction_handler)(struct vtn_builder *, uint32_t,
    170                                         const uint32_t *, unsigned);
    171 
    172 void vtn_build_cfg(struct vtn_builder *b, const uint32_t *words,
    173                    const uint32_t *end);
    174 void vtn_function_emit(struct vtn_builder *b, struct vtn_function *func,
    175                        vtn_instruction_handler instruction_handler);
    176 
    177 const uint32_t *
    178 vtn_foreach_instruction(struct vtn_builder *b, const uint32_t *start,
    179                         const uint32_t *end, vtn_instruction_handler handler);
    180 
    181 struct vtn_ssa_value {
    182    union {
    183       nir_ssa_def *def;
    184       struct vtn_ssa_value **elems;
    185    };
    186 
    187    /* For matrices, if this is non-NULL, then this value is actually the
    188     * transpose of some other value.  The value that `transposed` points to
    189     * always dominates this value.
    190     */
    191    struct vtn_ssa_value *transposed;
    192 
    193    const struct glsl_type *type;
    194 };
    195 
    196 struct vtn_type {
    197    const struct glsl_type *type;
    198 
    199    /* The value that declares this type.  Used for finding decorations */
    200    struct vtn_value *val;
    201 
    202    /* for matrices, whether the matrix is stored row-major */
    203    bool row_major;
    204 
    205    /* for structs, the offset of each member */
    206    unsigned *offsets;
    207 
    208    /* for structs, whether it was decorated as a "non-SSBO-like" block */
    209    bool block;
    210 
    211    /* for structs, whether it was decorated as an "SSBO-like" block */
    212    bool buffer_block;
    213 
    214    /* for structs with block == true, whether this is a builtin block (i.e. a
    215     * block that contains only builtins).
    216     */
    217    bool builtin_block;
    218 
    219    /* Image format for image_load_store type images */
    220    unsigned image_format;
    221 
    222    /* Access qualifier for storage images */
    223    SpvAccessQualifier access_qualifier;
    224 
    225    /* for arrays and matrices, the array stride */
    226    unsigned stride;
    227 
    228    /* for arrays, the vtn_type for the elements of the array */
    229    struct vtn_type *array_element;
    230 
    231    /* for structures, the vtn_type for each member */
    232    struct vtn_type **members;
    233 
    234    /* Whether this type, or a parent type, has been decorated as a builtin */
    235    bool is_builtin;
    236 
    237    SpvBuiltIn builtin;
    238 };
    239 
    240 struct vtn_variable;
    241 
    242 enum vtn_access_mode {
    243    vtn_access_mode_id,
    244    vtn_access_mode_literal,
    245 };
    246 
    247 struct vtn_access_link {
    248    enum vtn_access_mode mode;
    249    uint32_t id;
    250 };
    251 
    252 struct vtn_access_chain {
    253    struct vtn_variable *var;
    254 
    255    uint32_t length;
    256 
    257    /* Struct elements and array offsets */
    258    struct vtn_access_link link[0];
    259 };
    260 
    261 enum vtn_variable_mode {
    262    vtn_variable_mode_local,
    263    vtn_variable_mode_global,
    264    vtn_variable_mode_param,
    265    vtn_variable_mode_ubo,
    266    vtn_variable_mode_ssbo,
    267    vtn_variable_mode_push_constant,
    268    vtn_variable_mode_image,
    269    vtn_variable_mode_sampler,
    270    vtn_variable_mode_workgroup,
    271    vtn_variable_mode_input,
    272    vtn_variable_mode_output,
    273 };
    274 
    275 struct vtn_variable {
    276    enum vtn_variable_mode mode;
    277 
    278    struct vtn_type *type;
    279 
    280    unsigned descriptor_set;
    281    unsigned binding;
    282    unsigned input_attachment_index;
    283    bool patch;
    284 
    285    nir_variable *var;
    286    nir_variable **members;
    287 
    288    struct vtn_access_chain chain;
    289 };
    290 
    291 struct vtn_image_pointer {
    292    struct vtn_access_chain *image;
    293    nir_ssa_def *coord;
    294    nir_ssa_def *sample;
    295 };
    296 
    297 struct vtn_sampled_image {
    298    struct vtn_access_chain *image; /* Image or array of images */
    299    struct vtn_access_chain *sampler; /* Sampler */
    300 };
    301 
    302 struct vtn_value {
    303    enum vtn_value_type value_type;
    304    const char *name;
    305    struct vtn_decoration *decoration;
    306    union {
    307       void *ptr;
    308       char *str;
    309       struct vtn_type *type;
    310       struct {
    311          nir_constant *constant;
    312          const struct glsl_type *const_type;
    313       };
    314       struct vtn_access_chain *access_chain;
    315       struct vtn_image_pointer *image;
    316       struct vtn_sampled_image *sampled_image;
    317       struct vtn_function *func;
    318       struct vtn_block *block;
    319       struct vtn_ssa_value *ssa;
    320       vtn_instruction_handler ext_handler;
    321    };
    322 };
    323 
    324 #define VTN_DEC_DECORATION -1
    325 #define VTN_DEC_EXECUTION_MODE -2
    326 #define VTN_DEC_STRUCT_MEMBER0 0
    327 
    328 struct vtn_decoration {
    329    struct vtn_decoration *next;
    330 
    331    /* Specifies how to apply this decoration.  Negative values represent a
    332     * decoration or execution mode. (See the VTN_DEC_ #defines above.)
    333     * Non-negative values specify that it applies to a structure member.
    334     */
    335    int scope;
    336 
    337    const uint32_t *literals;
    338    struct vtn_value *group;
    339 
    340    union {
    341       SpvDecoration decoration;
    342       SpvExecutionMode exec_mode;
    343    };
    344 };
    345 
    346 struct vtn_builder {
    347    nir_builder nb;
    348 
    349    nir_shader *shader;
    350    nir_function_impl *impl;
    351    const struct nir_spirv_supported_extensions *ext;
    352    struct vtn_block *block;
    353 
    354    /* Current file, line, and column.  Useful for debugging.  Set
    355     * automatically by vtn_foreach_instruction.
    356     */
    357    char *file;
    358    int line, col;
    359 
    360    /*
    361     * In SPIR-V, constants are global, whereas in NIR, the load_const
    362     * instruction we use is per-function. So while we parse each function, we
    363     * keep a hash table of constants we've resolved to nir_ssa_value's so
    364     * far, and we lazily resolve them when we see them used in a function.
    365     */
    366    struct hash_table *const_table;
    367 
    368    /*
    369     * Map from phi instructions (pointer to the start of the instruction)
    370     * to the variable corresponding to it.
    371     */
    372    struct hash_table *phi_table;
    373 
    374    unsigned num_specializations;
    375    struct nir_spirv_specialization *specializations;
    376 
    377    unsigned value_id_bound;
    378    struct vtn_value *values;
    379 
    380    gl_shader_stage entry_point_stage;
    381    const char *entry_point_name;
    382    struct vtn_value *entry_point;
    383    bool origin_upper_left;
    384    bool pixel_center_integer;
    385 
    386    struct vtn_function *func;
    387    struct exec_list functions;
    388 
    389    /* Current function parameter index */
    390    unsigned func_param_idx;
    391 
    392    bool has_loop_continue;
    393 };
    394 
    395 static inline struct vtn_value *
    396 vtn_push_value(struct vtn_builder *b, uint32_t value_id,
    397                enum vtn_value_type value_type)
    398 {
    399    assert(value_id < b->value_id_bound);
    400    assert(b->values[value_id].value_type == vtn_value_type_invalid);
    401 
    402    b->values[value_id].value_type = value_type;
    403 
    404    return &b->values[value_id];
    405 }
    406 
    407 static inline struct vtn_value *
    408 vtn_untyped_value(struct vtn_builder *b, uint32_t value_id)
    409 {
    410    assert(value_id < b->value_id_bound);
    411    return &b->values[value_id];
    412 }
    413 
    414 static inline struct vtn_value *
    415 vtn_value(struct vtn_builder *b, uint32_t value_id,
    416           enum vtn_value_type value_type)
    417 {
    418    struct vtn_value *val = vtn_untyped_value(b, value_id);
    419    assert(val->value_type == value_type);
    420    return val;
    421 }
    422 
    423 void _vtn_warn(const char *file, int line, const char *msg, ...);
    424 #define vtn_warn(...) _vtn_warn(__FILE__, __LINE__, __VA_ARGS__)
    425 
    426 struct vtn_ssa_value *vtn_ssa_value(struct vtn_builder *b, uint32_t value_id);
    427 
    428 struct vtn_ssa_value *vtn_create_ssa_value(struct vtn_builder *b,
    429                                            const struct glsl_type *type);
    430 
    431 struct vtn_ssa_value *vtn_ssa_transpose(struct vtn_builder *b,
    432                                         struct vtn_ssa_value *src);
    433 
    434 nir_ssa_def *vtn_vector_extract(struct vtn_builder *b, nir_ssa_def *src,
    435                                 unsigned index);
    436 nir_ssa_def *vtn_vector_extract_dynamic(struct vtn_builder *b, nir_ssa_def *src,
    437                                         nir_ssa_def *index);
    438 nir_ssa_def *vtn_vector_insert(struct vtn_builder *b, nir_ssa_def *src,
    439                                nir_ssa_def *insert, unsigned index);
    440 nir_ssa_def *vtn_vector_insert_dynamic(struct vtn_builder *b, nir_ssa_def *src,
    441                                        nir_ssa_def *insert, nir_ssa_def *index);
    442 
    443 nir_deref_var *vtn_nir_deref(struct vtn_builder *b, uint32_t id);
    444 
    445 nir_deref_var *vtn_access_chain_to_deref(struct vtn_builder *b,
    446                                          struct vtn_access_chain *chain);
    447 nir_ssa_def *
    448 vtn_access_chain_to_offset(struct vtn_builder *b,
    449                            struct vtn_access_chain *chain,
    450                            nir_ssa_def **index_out, struct vtn_type **type_out,
    451                            unsigned *end_idx_out, bool stop_at_matrix);
    452 
    453 struct vtn_ssa_value *vtn_local_load(struct vtn_builder *b, nir_deref_var *src);
    454 
    455 void vtn_local_store(struct vtn_builder *b, struct vtn_ssa_value *src,
    456                      nir_deref_var *dest);
    457 
    458 struct vtn_ssa_value *
    459 vtn_variable_load(struct vtn_builder *b, struct vtn_access_chain *src);
    460 
    461 void vtn_variable_store(struct vtn_builder *b, struct vtn_ssa_value *src,
    462                         struct vtn_access_chain *dest);
    463 
    464 void vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
    465                           const uint32_t *w, unsigned count);
    466 
    467 
    468 typedef void (*vtn_decoration_foreach_cb)(struct vtn_builder *,
    469                                           struct vtn_value *,
    470                                           int member,
    471                                           const struct vtn_decoration *,
    472                                           void *);
    473 
    474 void vtn_foreach_decoration(struct vtn_builder *b, struct vtn_value *value,
    475                             vtn_decoration_foreach_cb cb, void *data);
    476 
    477 typedef void (*vtn_execution_mode_foreach_cb)(struct vtn_builder *,
    478                                               struct vtn_value *,
    479                                               const struct vtn_decoration *,
    480                                               void *);
    481 
    482 void vtn_foreach_execution_mode(struct vtn_builder *b, struct vtn_value *value,
    483                                 vtn_execution_mode_foreach_cb cb, void *data);
    484 
    485 nir_op vtn_nir_alu_op_for_spirv_opcode(SpvOp opcode, bool *swap,
    486                                        nir_alu_type src, nir_alu_type dst);
    487 
    488 void vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
    489                     const uint32_t *w, unsigned count);
    490 
    491 bool vtn_handle_glsl450_instruction(struct vtn_builder *b, uint32_t ext_opcode,
    492                                     const uint32_t *words, unsigned count);
    493 
    494 static inline uint64_t
    495 vtn_u64_literal(const uint32_t *w)
    496 {
    497    return (uint64_t)w[1] << 32 | w[0];
    498 }
    499