Home | History | Annotate | Download | only in gallivm
      1 /**************************************************************************
      2  *
      3  * Copyright 2010-2012 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     17  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
     18  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     19  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     20  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  *
     22  * The above copyright notice and this permission notice (including the
     23  * next paragraph) shall be included in all copies or substantial portions
     24  * of the Software.
     25  *
     26  **************************************************************************/
     27 
     28 
     29 #ifndef LP_BLD_LIMITS_H_
     30 #define LP_BLD_LIMITS_H_
     31 
     32 
     33 #include <limits.h>
     34 
     35 #include "pipe/p_state.h"
     36 #include "pipe/p_defines.h"
     37 
     38 
     39 /*
     40  * TGSI translation limits.
     41  *
     42  * Some are slightly above SM 3.0 requirements to give some wiggle room to
     43  * the state trackers.
     44  */
     45 
     46 #define LP_MAX_TGSI_TEMPS 4096
     47 
     48 #define LP_MAX_TGSI_ADDRS 16
     49 
     50 #define LP_MAX_TGSI_IMMEDIATES 4096
     51 
     52 #define LP_MAX_TGSI_PREDS 16
     53 
     54 #define LP_MAX_TGSI_CONSTS 4096
     55 
     56 #define LP_MAX_TGSI_CONST_BUFFERS 16
     57 
     58 #define LP_MAX_TGSI_CONST_BUFFER_SIZE (LP_MAX_TGSI_CONSTS * sizeof(float[4]))
     59 
     60 /*
     61  * For quick access we cache registers in statically
     62  * allocated arrays. Here we define the maximum size
     63  * for those arrays.
     64  */
     65 #define LP_MAX_INLINED_TEMPS 256
     66 
     67 #define LP_MAX_INLINED_IMMEDIATES 256
     68 
     69 /**
     70  * Maximum control flow nesting
     71  *
     72  * SM4.0 requires 64 (per subroutine actually, subroutine nesting itself is 32)
     73  * SM3.0 requires 24 (most likely per subroutine too)
     74  * add 2 more (some translation could add one more)
     75  */
     76 #define LP_MAX_TGSI_NESTING 66
     77 
     78 /**
     79  * Maximum iterations before loop termination
     80  * Shared between every loop in a TGSI shader
     81  */
     82 #define LP_MAX_TGSI_LOOP_ITERATIONS 65535
     83 
     84 
     85 /**
     86  * Some of these limits are actually infinite (i.e., only limited by available
     87  * memory), however advertising INT_MAX would cause some test problems to
     88  * actually try to allocate the maximum and run out of memory and crash.  So
     89  * stick with something reasonable here.
     90  */
     91 static inline int
     92 gallivm_get_shader_param(enum pipe_shader_cap param)
     93 {
     94    switch(param) {
     95    case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
     96    case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
     97    case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
     98    case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
     99       return 1 * 1024 * 1024;
    100    case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
    101       return LP_MAX_TGSI_NESTING;
    102    case PIPE_SHADER_CAP_MAX_INPUTS:
    103       return 32;
    104    case PIPE_SHADER_CAP_MAX_OUTPUTS:
    105       return 32;
    106    case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
    107       return LP_MAX_TGSI_CONST_BUFFER_SIZE;
    108    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
    109       return PIPE_MAX_CONSTANT_BUFFERS;
    110    case PIPE_SHADER_CAP_MAX_TEMPS:
    111       return LP_MAX_TGSI_TEMPS;
    112    case PIPE_SHADER_CAP_MAX_PREDS:
    113       return LP_MAX_TGSI_PREDS;
    114    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
    115       return 1;
    116    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
    117    case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
    118    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    119    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
    120       return 1;
    121    case PIPE_SHADER_CAP_SUBROUTINES:
    122       return 1;
    123    case PIPE_SHADER_CAP_INTEGERS:
    124       return 1;
    125    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
    126       return PIPE_MAX_SAMPLERS;
    127    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
    128       return PIPE_MAX_SHADER_SAMPLER_VIEWS;
    129    case PIPE_SHADER_CAP_PREFERRED_IR:
    130       return PIPE_SHADER_IR_TGSI;
    131    case PIPE_SHADER_CAP_SUPPORTED_IRS:
    132       return 1 << PIPE_SHADER_IR_TGSI;
    133    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
    134    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
    135       return 1;
    136    case PIPE_SHADER_CAP_DOUBLES:
    137       return 1;
    138    case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
    139    case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
    140    case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
    141    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
    142    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
    143    case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
    144       return 0;
    145    case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
    146       return 32;
    147    }
    148    /* if we get here, we missed a shader cap above (and should have seen
    149     * a compiler warning.)
    150     */
    151    return 0;
    152 }
    153 
    154 
    155 #endif /* LP_BLD_LIMITS_H_ */
    156