Home | History | Annotate | Line # | Download | only in compiler
      1 /*
      2  * Copyright  2016 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 
     25 #ifndef SHADER_INFO_H
     26 #define SHADER_INFO_H
     27 
     28 #include "shader_enums.h"
     29 #include <stdint.h>
     30 
     31 #ifdef __cplusplus
     32 extern "C" {
     33 #endif
     34 
     35 struct spirv_supported_capabilities {
     36    bool address;
     37    bool atomic_storage;
     38    bool derivative_group;
     39    bool descriptor_array_dynamic_indexing;
     40    bool descriptor_array_non_uniform_indexing;
     41    bool descriptor_indexing;
     42    bool device_group;
     43    bool draw_parameters;
     44    bool float64;
     45    bool geometry_streams;
     46    bool gcn_shader;
     47    bool image_ms_array;
     48    bool image_read_without_format;
     49    bool image_write_without_format;
     50    bool int8;
     51    bool int16;
     52    bool int64;
     53    bool int64_atomics;
     54    bool kernel;
     55    bool min_lod;
     56    bool multiview;
     57    bool physical_storage_buffer_address;
     58    bool post_depth_coverage;
     59    bool runtime_descriptor_array;
     60    bool shader_viewport_index_layer;
     61    bool stencil_export;
     62    bool storage_8bit;
     63    bool storage_16bit;
     64    bool storage_image_ms;
     65    bool subgroup_arithmetic;
     66    bool subgroup_ballot;
     67    bool subgroup_basic;
     68    bool subgroup_quad;
     69    bool subgroup_shuffle;
     70    bool subgroup_vote;
     71    bool tessellation;
     72    bool transform_feedback;
     73    bool trinary_minmax;
     74    bool variable_pointers;
     75    bool float16;
     76 };
     77 
     78 typedef struct shader_info {
     79    const char *name;
     80 
     81    /* Descriptive name provided by the client; may be NULL */
     82    const char *label;
     83 
     84    /** The shader stage, such as MESA_SHADER_VERTEX. */
     85    gl_shader_stage stage;
     86 
     87    /** The shader stage in a non SSO linked program that follows this stage,
     88      * such as MESA_SHADER_FRAGMENT.
     89      */
     90    gl_shader_stage next_stage;
     91 
     92    /* Number of textures used by this shader */
     93    unsigned num_textures;
     94    /* Number of uniform buffers used by this shader */
     95    unsigned num_ubos;
     96    /* Number of atomic buffers used by this shader */
     97    unsigned num_abos;
     98    /* Number of shader storage buffers used by this shader */
     99    unsigned num_ssbos;
    100    /* Number of images used by this shader */
    101    unsigned num_images;
    102 
    103    /* Which inputs are actually read */
    104    uint64_t inputs_read;
    105    /* Which outputs are actually written */
    106    uint64_t outputs_written;
    107    /* Which outputs are actually read */
    108    uint64_t outputs_read;
    109    /* Which system values are actually read */
    110    uint64_t system_values_read;
    111 
    112    /* Which patch inputs are actually read */
    113    uint32_t patch_inputs_read;
    114    /* Which patch outputs are actually written */
    115    uint32_t patch_outputs_written;
    116    /* Which patch outputs are read */
    117    uint32_t patch_outputs_read;
    118 
    119    /* Whether or not this shader ever uses textureGather() */
    120    bool uses_texture_gather;
    121 
    122    /** Bitfield of which textures are used */
    123    uint32_t textures_used;
    124 
    125    /** Bitfield of which textures are used by texelFetch() */
    126    uint32_t textures_used_by_txf;
    127 
    128    /**
    129     * True if this shader uses the fddx/fddy opcodes.
    130     *
    131     * Note that this does not include the "fine" and "coarse" variants.
    132     */
    133    bool uses_fddx_fddy;
    134 
    135    /**
    136     * True if this shader uses 64-bit ALU operations
    137     */
    138    bool uses_64bit;
    139 
    140    /* The size of the gl_ClipDistance[] array, if declared. */
    141    unsigned clip_distance_array_size;
    142 
    143    /* The size of the gl_CullDistance[] array, if declared. */
    144    unsigned cull_distance_array_size;
    145 
    146    /* Whether or not separate shader objects were used */
    147    bool separate_shader;
    148 
    149    /** Was this shader linked with any transform feedback varyings? */
    150    bool has_transform_feedback_varyings;
    151 
    152    union {
    153       struct {
    154          /* Which inputs are doubles */
    155          uint64_t double_inputs;
    156 
    157          /* True if the shader writes position in window space coordinates pre-transform */
    158          bool window_space_position;
    159       } vs;
    160 
    161       struct {
    162          /** The number of vertices recieves per input primitive */
    163          unsigned vertices_in;
    164 
    165          /** The output primitive type (GL enum value) */
    166          unsigned output_primitive;
    167 
    168          /** The input primitive type (GL enum value) */
    169          unsigned input_primitive;
    170 
    171          /** The maximum number of vertices the geometry shader might write. */
    172          unsigned vertices_out;
    173 
    174          /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */
    175          unsigned invocations;
    176 
    177          /** Whether or not this shader uses EndPrimitive */
    178          bool uses_end_primitive;
    179 
    180          /** Whether or not this shader uses non-zero streams */
    181          bool uses_streams;
    182       } gs;
    183 
    184       struct {
    185          bool uses_discard;
    186 
    187          /**
    188           * Whether any inputs are declared with the "sample" qualifier.
    189           */
    190          bool uses_sample_qualifier;
    191 
    192          /**
    193           * Whether early fragment tests are enabled as defined by
    194           * ARB_shader_image_load_store.
    195           */
    196          bool early_fragment_tests;
    197 
    198          /**
    199           * Defined by INTEL_conservative_rasterization.
    200           */
    201          bool inner_coverage;
    202 
    203          bool post_depth_coverage;
    204 
    205          /**
    206           * \name ARB_fragment_coord_conventions
    207           * @{
    208           */
    209          bool pixel_center_integer;
    210          bool origin_upper_left;
    211          /*@}*/
    212 
    213          bool pixel_interlock_ordered;
    214          bool pixel_interlock_unordered;
    215          bool sample_interlock_ordered;
    216          bool sample_interlock_unordered;
    217 
    218          /**
    219           * Flags whether NIR's base types on the FS color outputs should be
    220           * ignored.
    221           *
    222           * GLSL requires that fragment shader output base types match the
    223           * render target's base types for the behavior to be defined.  From
    224           * the GL 4.6 spec:
    225           *
    226           *     "If the values written by the fragment shader do not match the
    227           *      format(s) of the corresponding color buffer(s), the result is
    228           *      undefined."
    229           *
    230           * However, for NIR shaders translated from TGSI, we don't have the
    231           * output types any more, so the driver will need to do whatever
    232           * fixups are necessary to handle effectively untyped data being
    233           * output from the FS.
    234           */
    235          bool untyped_color_outputs;
    236 
    237          /** gl_FragDepth layout for ARB_conservative_depth. */
    238          enum gl_frag_depth_layout depth_layout;
    239       } fs;
    240 
    241       struct {
    242          unsigned local_size[3];
    243 
    244          bool local_size_variable;
    245 
    246          /**
    247           * Size of shared variables accessed by the compute shader.
    248           */
    249          unsigned shared_size;
    250 
    251 
    252          /**
    253           * pointer size is:
    254           *   AddressingModelLogical:    0    (default)
    255           *   AddressingModelPhysical32: 32
    256           *   AddressingModelPhysical64: 64
    257           */
    258          unsigned ptr_size;
    259 
    260          /*
    261           * Arrangement of invocations used to calculate derivatives in a compute
    262           * shader.  From NV_compute_shader_derivatives.
    263           */
    264          enum gl_derivative_group derivative_group;
    265       } cs;
    266 
    267       /* Applies to both TCS and TES. */
    268       struct {
    269          /** The number of vertices in the TCS output patch. */
    270          unsigned tcs_vertices_out;
    271 
    272          uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */
    273          enum gl_tess_spacing spacing;
    274          /** Is the vertex order counterclockwise? */
    275          bool ccw;
    276          bool point_mode;
    277       } tess;
    278    };
    279 } shader_info;
    280 
    281 #ifdef __cplusplus
    282 }
    283 #endif
    284 
    285 #endif /* SHADER_INFO_H */
    286