Home | History | Annotate | Download | only in tgsi
      1 /**************************************************************************
      2  *
      3  * Copyright 2007-2008 VMware, Inc.
      4  * All Rights Reserved.
      5  * Copyright 2009-2010 VMware, Inc.  All rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the
      9  * "Software"), to deal in the Software without restriction, including
     10  * without limitation the rights to use, copy, modify, merge, publish,
     11  * distribute, sub license, and/or sell copies of the Software, and to
     12  * permit persons to whom the Software is furnished to do so, subject to
     13  * the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the
     16  * next paragraph) shall be included in all copies or substantial portions
     17  * of the Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     22  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     26  *
     27  **************************************************************************/
     28 
     29 #ifndef TGSI_EXEC_H
     30 #define TGSI_EXEC_H
     31 
     32 #include "pipe/p_compiler.h"
     33 #include "pipe/p_state.h"
     34 #include "pipe/p_shader_tokens.h"
     35 
     36 #if defined __cplusplus
     37 extern "C" {
     38 #endif
     39 
     40 #define TGSI_CHAN_X 0
     41 #define TGSI_CHAN_Y 1
     42 #define TGSI_CHAN_Z 2
     43 #define TGSI_CHAN_W 3
     44 
     45 #define TGSI_NUM_CHANNELS 4  /* R,G,B,A */
     46 #define TGSI_QUAD_SIZE    4  /* 4 pixel/quad */
     47 
     48 #define TGSI_FOR_EACH_CHANNEL( CHAN )\
     49    for (CHAN = 0; CHAN < TGSI_NUM_CHANNELS; CHAN++)
     50 
     51 #define TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
     52    ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
     53 
     54 #define TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
     55    if (TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
     56 
     57 #define TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
     58    TGSI_FOR_EACH_CHANNEL( CHAN )\
     59       TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
     60 
     61 #define TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\
     62    ((INST)->Dst[1].Register.WriteMask & (1 << (CHAN)))
     63 
     64 #define TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\
     65    if (TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN ))
     66 
     67 #define TGSI_FOR_EACH_DST1_ENABLED_CHANNEL( INST, CHAN )\
     68    TGSI_FOR_EACH_CHANNEL( CHAN )\
     69       TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN )
     70 
     71 /**
     72   * Registers may be treated as float, signed int or unsigned int.
     73   */
     74 union tgsi_exec_channel
     75 {
     76    float    f[TGSI_QUAD_SIZE];
     77    int      i[TGSI_QUAD_SIZE];
     78    unsigned u[TGSI_QUAD_SIZE];
     79 };
     80 
     81 /**
     82   * A vector[RGBA] of channels[4 pixels]
     83   */
     84 struct tgsi_exec_vector
     85 {
     86    union tgsi_exec_channel xyzw[TGSI_NUM_CHANNELS];
     87 };
     88 
     89 /**
     90  * For fragment programs, information for computing fragment input
     91  * values from plane equation of the triangle/line.
     92  */
     93 struct tgsi_interp_coef
     94 {
     95    float a0[TGSI_NUM_CHANNELS];	/* in an xyzw layout */
     96    float dadx[TGSI_NUM_CHANNELS];
     97    float dady[TGSI_NUM_CHANNELS];
     98 };
     99 
    100 enum tgsi_sampler_control
    101 {
    102    TGSI_SAMPLER_LOD_NONE,
    103    TGSI_SAMPLER_LOD_BIAS,
    104    TGSI_SAMPLER_LOD_EXPLICIT,
    105    TGSI_SAMPLER_LOD_ZERO,
    106    TGSI_SAMPLER_DERIVS_EXPLICIT,
    107    TGSI_SAMPLER_GATHER,
    108 };
    109 
    110 struct tgsi_image_params {
    111    unsigned unit;
    112    unsigned tgsi_tex_instr;
    113    enum pipe_format format;
    114    unsigned execmask;
    115 };
    116 
    117 struct tgsi_image {
    118    /* image interfaces */
    119    void (*load)(const struct tgsi_image *image,
    120                 const struct tgsi_image_params *params,
    121                 const int s[TGSI_QUAD_SIZE],
    122                 const int t[TGSI_QUAD_SIZE],
    123                 const int r[TGSI_QUAD_SIZE],
    124                 const int sample[TGSI_QUAD_SIZE],
    125                 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    126 
    127    void (*store)(const struct tgsi_image *image,
    128                  const struct tgsi_image_params *params,
    129                  const int s[TGSI_QUAD_SIZE],
    130                  const int t[TGSI_QUAD_SIZE],
    131                  const int r[TGSI_QUAD_SIZE],
    132                  const int sample[TGSI_QUAD_SIZE],
    133                  float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    134 
    135    void (*op)(const struct tgsi_image *image,
    136               const struct tgsi_image_params *params,
    137               unsigned opcode,
    138               const int s[TGSI_QUAD_SIZE],
    139               const int t[TGSI_QUAD_SIZE],
    140               const int r[TGSI_QUAD_SIZE],
    141               const int sample[TGSI_QUAD_SIZE],
    142               float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
    143               float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    144 
    145    void (*get_dims)(const struct tgsi_image *image,
    146                     const struct tgsi_image_params *params,
    147                     int dims[4]);
    148 };
    149 
    150 struct tgsi_buffer_params {
    151    unsigned unit;
    152    unsigned execmask;
    153    unsigned writemask;
    154 };
    155 
    156 struct tgsi_buffer {
    157    /* buffer interfaces */
    158    void (*load)(const struct tgsi_buffer *buffer,
    159                 const struct tgsi_buffer_params *params,
    160                 const int s[TGSI_QUAD_SIZE],
    161                 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    162 
    163    void (*store)(const struct tgsi_buffer *buffer,
    164                  const struct tgsi_buffer_params *params,
    165                  const int s[TGSI_QUAD_SIZE],
    166                  float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    167 
    168    void (*op)(const struct tgsi_buffer *buffer,
    169               const struct tgsi_buffer_params *params,
    170               unsigned opcode,
    171               const int s[TGSI_QUAD_SIZE],
    172               float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
    173               float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    174 
    175    void (*get_dims)(const struct tgsi_buffer *buffer,
    176                     const struct tgsi_buffer_params *params,
    177                     int *dim);
    178 };
    179 
    180 /**
    181  * Information for sampling textures, which must be implemented
    182  * by code outside the TGSI executor.
    183  */
    184 struct tgsi_sampler
    185 {
    186    /** Get samples for four fragments in a quad */
    187    /* this interface contains 5 sets of channels that vary
    188     * depending on the sampler.
    189     * s - the first texture coordinate for sampling.
    190     * t - the second texture coordinate for sampling - unused for 1D,
    191           layer for 1D arrays.
    192     * r - the third coordinate for sampling for 3D, cube, cube arrays,
    193     *     layer for 2D arrays. Compare value for 1D/2D shadows.
    194     * c0 - Compare value for shadow cube and shadow 2d arrays,
    195     *      layer for cube arrays.
    196     * derivs - explicit derivatives.
    197     * offset - texel offsets
    198     * lod - lod value, except for shadow cube arrays (compare value there).
    199     */
    200    void (*get_samples)(struct tgsi_sampler *sampler,
    201                        const unsigned sview_index,
    202                        const unsigned sampler_index,
    203                        const float s[TGSI_QUAD_SIZE],
    204                        const float t[TGSI_QUAD_SIZE],
    205                        const float r[TGSI_QUAD_SIZE],
    206                        const float c0[TGSI_QUAD_SIZE],
    207                        const float c1[TGSI_QUAD_SIZE],
    208                        float derivs[3][2][TGSI_QUAD_SIZE],
    209                        const int8_t offset[3],
    210                        enum tgsi_sampler_control control,
    211                        float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    212    void (*get_dims)(struct tgsi_sampler *sampler,
    213                     const unsigned sview_index,
    214                     int level, int dims[4]);
    215    void (*get_texel)(struct tgsi_sampler *sampler,
    216                      const unsigned sview_index,
    217                      const int i[TGSI_QUAD_SIZE],
    218                      const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE],
    219                      const int lod[TGSI_QUAD_SIZE], const int8_t offset[3],
    220                      float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    221    void (*query_lod)(const struct tgsi_sampler *tgsi_sampler,
    222                      const unsigned sview_index,
    223                      const unsigned sampler_index,
    224                      const float s[TGSI_QUAD_SIZE],
    225                      const float t[TGSI_QUAD_SIZE],
    226                      const float p[TGSI_QUAD_SIZE],
    227                      const float c0[TGSI_QUAD_SIZE],
    228                      const enum tgsi_sampler_control control,
    229                      float mipmap[TGSI_QUAD_SIZE],
    230                      float lod[TGSI_QUAD_SIZE]);
    231 };
    232 
    233 #define TGSI_EXEC_NUM_TEMPS       4096
    234 #define TGSI_EXEC_NUM_IMMEDIATES  256
    235 
    236 /*
    237  * Locations of various utility registers (_I = Index, _C = Channel)
    238  */
    239 #define TGSI_EXEC_TEMP_00000000_I   (TGSI_EXEC_NUM_TEMPS + 0)
    240 #define TGSI_EXEC_TEMP_00000000_C   0
    241 
    242 #define TGSI_EXEC_TEMP_7FFFFFFF_I   (TGSI_EXEC_NUM_TEMPS + 0)
    243 #define TGSI_EXEC_TEMP_7FFFFFFF_C   1
    244 
    245 #define TGSI_EXEC_TEMP_80000000_I   (TGSI_EXEC_NUM_TEMPS + 0)
    246 #define TGSI_EXEC_TEMP_80000000_C   2
    247 
    248 #define TGSI_EXEC_TEMP_FFFFFFFF_I   (TGSI_EXEC_NUM_TEMPS + 0)
    249 #define TGSI_EXEC_TEMP_FFFFFFFF_C   3
    250 
    251 #define TGSI_EXEC_TEMP_ONE_I        (TGSI_EXEC_NUM_TEMPS + 1)
    252 #define TGSI_EXEC_TEMP_ONE_C        0
    253 
    254 #define TGSI_EXEC_TEMP_TWO_I        (TGSI_EXEC_NUM_TEMPS + 1)
    255 #define TGSI_EXEC_TEMP_TWO_C        1
    256 
    257 #define TGSI_EXEC_TEMP_128_I        (TGSI_EXEC_NUM_TEMPS + 1)
    258 #define TGSI_EXEC_TEMP_128_C        2
    259 
    260 #define TGSI_EXEC_TEMP_MINUS_128_I  (TGSI_EXEC_NUM_TEMPS + 1)
    261 #define TGSI_EXEC_TEMP_MINUS_128_C  3
    262 
    263 #define TGSI_EXEC_TEMP_KILMASK_I    (TGSI_EXEC_NUM_TEMPS + 2)
    264 #define TGSI_EXEC_TEMP_KILMASK_C    0
    265 
    266 #define TGSI_EXEC_TEMP_OUTPUT_I     (TGSI_EXEC_NUM_TEMPS + 2)
    267 #define TGSI_EXEC_TEMP_OUTPUT_C     1
    268 
    269 #define TGSI_EXEC_TEMP_PRIMITIVE_I  (TGSI_EXEC_NUM_TEMPS + 2)
    270 #define TGSI_EXEC_TEMP_PRIMITIVE_C  2
    271 
    272 #define TGSI_EXEC_TEMP_THREE_I      (TGSI_EXEC_NUM_TEMPS + 2)
    273 #define TGSI_EXEC_TEMP_THREE_C      3
    274 
    275 #define TGSI_EXEC_TEMP_HALF_I       (TGSI_EXEC_NUM_TEMPS + 3)
    276 #define TGSI_EXEC_TEMP_HALF_C       0
    277 
    278 /* 4 register buffer for various purposes */
    279 #define TGSI_EXEC_TEMP_R0           (TGSI_EXEC_NUM_TEMPS + 4)
    280 #define TGSI_EXEC_NUM_TEMP_R        4
    281 
    282 #define TGSI_EXEC_TEMP_ADDR         (TGSI_EXEC_NUM_TEMPS + 8)
    283 #define TGSI_EXEC_NUM_ADDRS         3
    284 
    285 #define TGSI_EXEC_NUM_TEMP_EXTRAS   12
    286 
    287 
    288 
    289 #define TGSI_EXEC_MAX_NESTING  32
    290 #define TGSI_EXEC_MAX_COND_NESTING  TGSI_EXEC_MAX_NESTING
    291 #define TGSI_EXEC_MAX_LOOP_NESTING  TGSI_EXEC_MAX_NESTING
    292 #define TGSI_EXEC_MAX_SWITCH_NESTING TGSI_EXEC_MAX_NESTING
    293 #define TGSI_EXEC_MAX_CALL_NESTING  TGSI_EXEC_MAX_NESTING
    294 
    295 /* The maximum number of input attributes per vertex. For 2D
    296  * input register files, this is the stride between two 1D
    297  * arrays.
    298  */
    299 #define TGSI_EXEC_MAX_INPUT_ATTRIBS 32
    300 
    301 /* The maximum number of bytes per constant buffer.
    302  */
    303 #define TGSI_EXEC_MAX_CONST_BUFFER_SIZE  (4096 * sizeof(float[4]))
    304 
    305 /* The maximum number of vertices per primitive */
    306 #define TGSI_MAX_PRIM_VERTICES 6
    307 
    308 /* The maximum number of primitives to be generated */
    309 #define TGSI_MAX_PRIMITIVES 64
    310 
    311 /* The maximum total number of vertices */
    312 #define TGSI_MAX_TOTAL_VERTICES (TGSI_MAX_PRIM_VERTICES * TGSI_MAX_PRIMITIVES * PIPE_MAX_ATTRIBS)
    313 
    314 #define TGSI_MAX_MISC_INPUTS 8
    315 
    316 /** function call/activation record */
    317 struct tgsi_call_record
    318 {
    319    uint CondStackTop;
    320    uint LoopStackTop;
    321    uint ContStackTop;
    322    int SwitchStackTop;
    323    int BreakStackTop;
    324    uint ReturnAddr;
    325 };
    326 
    327 
    328 /* Switch-case block state. */
    329 struct tgsi_switch_record {
    330    uint mask;                          /**< execution mask */
    331    union tgsi_exec_channel selector;   /**< a value case statements are compared to */
    332    uint defaultMask;                   /**< non-execute mask for default case */
    333 };
    334 
    335 
    336 enum tgsi_break_type {
    337    TGSI_EXEC_BREAK_INSIDE_LOOP,
    338    TGSI_EXEC_BREAK_INSIDE_SWITCH
    339 };
    340 
    341 
    342 #define TGSI_EXEC_MAX_BREAK_STACK (TGSI_EXEC_MAX_LOOP_NESTING + TGSI_EXEC_MAX_SWITCH_NESTING)
    343 
    344 
    345 /**
    346  * Run-time virtual machine state for executing TGSI shader.
    347  */
    348 struct tgsi_exec_machine
    349 {
    350    /* Total = program temporaries + internal temporaries
    351     */
    352    struct tgsi_exec_vector       Temps[TGSI_EXEC_NUM_TEMPS +
    353                                        TGSI_EXEC_NUM_TEMP_EXTRAS];
    354 
    355    float                         Imms[TGSI_EXEC_NUM_IMMEDIATES][4];
    356 
    357    float                         ImmArray[TGSI_EXEC_NUM_IMMEDIATES][4];
    358 
    359    struct tgsi_exec_vector       *Inputs;
    360    struct tgsi_exec_vector       *Outputs;
    361 
    362    /* System values */
    363    unsigned                      SysSemanticToIndex[TGSI_SEMANTIC_COUNT];
    364    struct tgsi_exec_vector       SystemValue[TGSI_MAX_MISC_INPUTS];
    365 
    366    struct tgsi_exec_vector       *Addrs;
    367 
    368    struct tgsi_sampler           *Sampler;
    369 
    370    struct tgsi_image             *Image;
    371    struct tgsi_buffer            *Buffer;
    372    unsigned                      ImmLimit;
    373 
    374    const void *Consts[PIPE_MAX_CONSTANT_BUFFERS];
    375    unsigned ConstsSize[PIPE_MAX_CONSTANT_BUFFERS];
    376 
    377    const struct tgsi_token       *Tokens;   /**< Declarations, instructions */
    378    enum pipe_shader_type         ShaderType; /**< PIPE_SHADER_x */
    379 
    380    /* GEOMETRY processor only. */
    381    unsigned                      *Primitives;
    382    unsigned                       NumOutputs;
    383    unsigned                       MaxGeometryShaderOutputs;
    384    unsigned                       MaxOutputVertices;
    385 
    386    /* FRAGMENT processor only. */
    387    const struct tgsi_interp_coef *InterpCoefs;
    388    struct tgsi_exec_vector       QuadPos;
    389    float                         Face;    /**< +1 if front facing, -1 if back facing */
    390    bool                          flatshade_color;
    391 
    392    /* Compute Only */
    393    void                          *LocalMem;
    394    unsigned                      LocalMemSize;
    395 
    396    /* See GLSL 4.50 specification for definition of helper invocations */
    397    uint NonHelperMask;  /**< non-helpers */
    398    /* Conditional execution masks */
    399    uint CondMask;  /**< For IF/ELSE/ENDIF */
    400    uint LoopMask;  /**< For BGNLOOP/ENDLOOP */
    401    uint ContMask;  /**< For loop CONT statements */
    402    uint FuncMask;  /**< For function calls */
    403    uint ExecMask;  /**< = CondMask & LoopMask */
    404 
    405    /* Current switch-case state. */
    406    struct tgsi_switch_record Switch;
    407 
    408    /* Current break type. */
    409    enum tgsi_break_type BreakType;
    410 
    411    /** Condition mask stack (for nested conditionals) */
    412    uint CondStack[TGSI_EXEC_MAX_COND_NESTING];
    413    int CondStackTop;
    414 
    415    /** Loop mask stack (for nested loops) */
    416    uint LoopStack[TGSI_EXEC_MAX_LOOP_NESTING];
    417    int LoopStackTop;
    418 
    419    /** Loop label stack */
    420    uint LoopLabelStack[TGSI_EXEC_MAX_LOOP_NESTING];
    421    int LoopLabelStackTop;
    422 
    423    /** Loop continue mask stack (see comments in tgsi_exec.c) */
    424    uint ContStack[TGSI_EXEC_MAX_LOOP_NESTING];
    425    int ContStackTop;
    426 
    427    /** Switch case stack */
    428    struct tgsi_switch_record SwitchStack[TGSI_EXEC_MAX_SWITCH_NESTING];
    429    int SwitchStackTop;
    430 
    431    enum tgsi_break_type BreakStack[TGSI_EXEC_MAX_BREAK_STACK];
    432    int BreakStackTop;
    433 
    434    /** Function execution mask stack (for executing subroutine code) */
    435    uint FuncStack[TGSI_EXEC_MAX_CALL_NESTING];
    436    int FuncStackTop;
    437 
    438    /** Function call stack for saving/restoring the program counter */
    439    struct tgsi_call_record CallStack[TGSI_EXEC_MAX_CALL_NESTING];
    440    int CallStackTop;
    441 
    442    struct tgsi_full_instruction *Instructions;
    443    uint NumInstructions;
    444 
    445    struct tgsi_full_declaration *Declarations;
    446    uint NumDeclarations;
    447 
    448    struct tgsi_declaration_sampler_view
    449       SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    450 
    451    boolean UsedGeometryShader;
    452 
    453    int pc;
    454 };
    455 
    456 struct tgsi_exec_machine *
    457 tgsi_exec_machine_create(enum pipe_shader_type shader_type);
    458 
    459 void
    460 tgsi_exec_machine_destroy(struct tgsi_exec_machine *mach);
    461 
    462 
    463 void
    464 tgsi_exec_machine_bind_shader(
    465    struct tgsi_exec_machine *mach,
    466    const struct tgsi_token *tokens,
    467    struct tgsi_sampler *sampler,
    468    struct tgsi_image *image,
    469    struct tgsi_buffer *buffer);
    470 
    471 uint
    472 tgsi_exec_machine_run(
    473    struct tgsi_exec_machine *mach, int start_pc );
    474 
    475 
    476 void
    477 tgsi_exec_machine_free_data(struct tgsi_exec_machine *mach);
    478 
    479 
    480 boolean
    481 tgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst);
    482 
    483 
    484 extern void
    485 tgsi_exec_set_constant_buffers(struct tgsi_exec_machine *mach,
    486                                unsigned num_bufs,
    487                                const void **bufs,
    488                                const unsigned *buf_sizes);
    489 
    490 
    491 static inline int
    492 tgsi_exec_get_shader_param(enum pipe_shader_cap param)
    493 {
    494    switch(param) {
    495    case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
    496    case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
    497    case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
    498    case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
    499       return INT_MAX;
    500    case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
    501       return TGSI_EXEC_MAX_NESTING;
    502    case PIPE_SHADER_CAP_MAX_INPUTS:
    503       return TGSI_EXEC_MAX_INPUT_ATTRIBS;
    504    case PIPE_SHADER_CAP_MAX_OUTPUTS:
    505       return 32;
    506    case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
    507       return TGSI_EXEC_MAX_CONST_BUFFER_SIZE;
    508    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
    509       return PIPE_MAX_CONSTANT_BUFFERS;
    510    case PIPE_SHADER_CAP_MAX_TEMPS:
    511       return TGSI_EXEC_NUM_TEMPS;
    512    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
    513       return 1;
    514    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
    515    case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
    516    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    517    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
    518       return 1;
    519    case PIPE_SHADER_CAP_SUBROUTINES:
    520       return 1;
    521    case PIPE_SHADER_CAP_INTEGERS:
    522       return 1;
    523    case PIPE_SHADER_CAP_INT64_ATOMICS:
    524    case PIPE_SHADER_CAP_FP16:
    525       return 0;
    526    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
    527       return PIPE_MAX_SAMPLERS;
    528    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
    529       return PIPE_MAX_SHADER_SAMPLER_VIEWS;
    530    case PIPE_SHADER_CAP_PREFERRED_IR:
    531       return PIPE_SHADER_IR_TGSI;
    532    case PIPE_SHADER_CAP_SUPPORTED_IRS:
    533       return 1 << PIPE_SHADER_IR_TGSI;
    534    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
    535       return 1;
    536    case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
    537    case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
    538    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
    539       return 1;
    540    case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
    541    case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
    542    case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
    543    case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
    544    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
    545    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
    546       return 0;
    547    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
    548       return PIPE_MAX_SHADER_BUFFERS;
    549    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
    550       return PIPE_MAX_SHADER_IMAGES;
    551 
    552    case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
    553       return 32;
    554    }
    555    /* if we get here, we missed a shader cap above (and should have seen
    556     * a compiler warning.)
    557     */
    558    return 0;
    559 }
    560 
    561 #if defined __cplusplus
    562 } /* extern "C" */
    563 #endif
    564 
    565 #endif /* TGSI_EXEC_H */
    566