Home | History | Annotate | Download | only in pipe
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
      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 above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #ifndef PIPE_DEFINES_H
     29 #define PIPE_DEFINES_H
     30 
     31 #include "p_compiler.h"
     32 
     33 #ifdef __cplusplus
     34 extern "C" {
     35 #endif
     36 
     37 /**
     38  * Gallium error codes.
     39  *
     40  * - A zero value always means success.
     41  * - A negative value always means failure.
     42  * - The meaning of a positive value is function dependent.
     43  */
     44 enum pipe_error {
     45    PIPE_OK = 0,
     46    PIPE_ERROR = -1,    /**< Generic error */
     47    PIPE_ERROR_BAD_INPUT = -2,
     48    PIPE_ERROR_OUT_OF_MEMORY = -3,
     49    PIPE_ERROR_RETRY = -4
     50    /* TODO */
     51 };
     52 
     53 
     54 #define PIPE_BLENDFACTOR_ONE                 0x1
     55 #define PIPE_BLENDFACTOR_SRC_COLOR           0x2
     56 #define PIPE_BLENDFACTOR_SRC_ALPHA           0x3
     57 #define PIPE_BLENDFACTOR_DST_ALPHA           0x4
     58 #define PIPE_BLENDFACTOR_DST_COLOR           0x5
     59 #define PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE  0x6
     60 #define PIPE_BLENDFACTOR_CONST_COLOR         0x7
     61 #define PIPE_BLENDFACTOR_CONST_ALPHA         0x8
     62 #define PIPE_BLENDFACTOR_SRC1_COLOR          0x9
     63 #define PIPE_BLENDFACTOR_SRC1_ALPHA          0x0A
     64 #define PIPE_BLENDFACTOR_ZERO                0x11
     65 #define PIPE_BLENDFACTOR_INV_SRC_COLOR       0x12
     66 #define PIPE_BLENDFACTOR_INV_SRC_ALPHA       0x13
     67 #define PIPE_BLENDFACTOR_INV_DST_ALPHA       0x14
     68 #define PIPE_BLENDFACTOR_INV_DST_COLOR       0x15
     69 #define PIPE_BLENDFACTOR_INV_CONST_COLOR     0x17
     70 #define PIPE_BLENDFACTOR_INV_CONST_ALPHA     0x18
     71 #define PIPE_BLENDFACTOR_INV_SRC1_COLOR      0x19
     72 #define PIPE_BLENDFACTOR_INV_SRC1_ALPHA      0x1A
     73 
     74 #define PIPE_BLEND_ADD               0
     75 #define PIPE_BLEND_SUBTRACT          1
     76 #define PIPE_BLEND_REVERSE_SUBTRACT  2
     77 #define PIPE_BLEND_MIN               3
     78 #define PIPE_BLEND_MAX               4
     79 
     80 #define PIPE_LOGICOP_CLEAR            0
     81 #define PIPE_LOGICOP_NOR              1
     82 #define PIPE_LOGICOP_AND_INVERTED     2
     83 #define PIPE_LOGICOP_COPY_INVERTED    3
     84 #define PIPE_LOGICOP_AND_REVERSE      4
     85 #define PIPE_LOGICOP_INVERT           5
     86 #define PIPE_LOGICOP_XOR              6
     87 #define PIPE_LOGICOP_NAND             7
     88 #define PIPE_LOGICOP_AND              8
     89 #define PIPE_LOGICOP_EQUIV            9
     90 #define PIPE_LOGICOP_NOOP             10
     91 #define PIPE_LOGICOP_OR_INVERTED      11
     92 #define PIPE_LOGICOP_COPY             12
     93 #define PIPE_LOGICOP_OR_REVERSE       13
     94 #define PIPE_LOGICOP_OR               14
     95 #define PIPE_LOGICOP_SET              15
     96 
     97 #define PIPE_MASK_R  0x1
     98 #define PIPE_MASK_G  0x2
     99 #define PIPE_MASK_B  0x4
    100 #define PIPE_MASK_A  0x8
    101 #define PIPE_MASK_RGBA 0xf
    102 #define PIPE_MASK_Z  0x10
    103 #define PIPE_MASK_S  0x20
    104 #define PIPE_MASK_ZS 0x30
    105 #define PIPE_MASK_RGBAZS (PIPE_MASK_RGBA|PIPE_MASK_ZS)
    106 
    107 
    108 /**
    109  * Inequality functions.  Used for depth test, stencil compare, alpha
    110  * test, shadow compare, etc.
    111  */
    112 #define PIPE_FUNC_NEVER    0
    113 #define PIPE_FUNC_LESS     1
    114 #define PIPE_FUNC_EQUAL    2
    115 #define PIPE_FUNC_LEQUAL   3
    116 #define PIPE_FUNC_GREATER  4
    117 #define PIPE_FUNC_NOTEQUAL 5
    118 #define PIPE_FUNC_GEQUAL   6
    119 #define PIPE_FUNC_ALWAYS   7
    120 
    121 /** Polygon fill mode */
    122 #define PIPE_POLYGON_MODE_FILL  0
    123 #define PIPE_POLYGON_MODE_LINE  1
    124 #define PIPE_POLYGON_MODE_POINT 2
    125 
    126 /** Polygon face specification, eg for culling */
    127 #define PIPE_FACE_NONE           0
    128 #define PIPE_FACE_FRONT          1
    129 #define PIPE_FACE_BACK           2
    130 #define PIPE_FACE_FRONT_AND_BACK (PIPE_FACE_FRONT | PIPE_FACE_BACK)
    131 
    132 /** Stencil ops */
    133 #define PIPE_STENCIL_OP_KEEP       0
    134 #define PIPE_STENCIL_OP_ZERO       1
    135 #define PIPE_STENCIL_OP_REPLACE    2
    136 #define PIPE_STENCIL_OP_INCR       3
    137 #define PIPE_STENCIL_OP_DECR       4
    138 #define PIPE_STENCIL_OP_INCR_WRAP  5
    139 #define PIPE_STENCIL_OP_DECR_WRAP  6
    140 #define PIPE_STENCIL_OP_INVERT     7
    141 
    142 /** Texture types.
    143  * See the documentation for info on PIPE_TEXTURE_RECT vs PIPE_TEXTURE_2D */
    144 enum pipe_texture_target {
    145    PIPE_BUFFER           = 0,
    146    PIPE_TEXTURE_1D       = 1,
    147    PIPE_TEXTURE_2D       = 2,
    148    PIPE_TEXTURE_3D       = 3,
    149    PIPE_TEXTURE_CUBE     = 4,
    150    PIPE_TEXTURE_RECT     = 5,
    151    PIPE_TEXTURE_1D_ARRAY = 6,
    152    PIPE_TEXTURE_2D_ARRAY = 7,
    153    PIPE_MAX_TEXTURE_TYPES
    154 };
    155 
    156 #define PIPE_TEX_FACE_POS_X 0
    157 #define PIPE_TEX_FACE_NEG_X 1
    158 #define PIPE_TEX_FACE_POS_Y 2
    159 #define PIPE_TEX_FACE_NEG_Y 3
    160 #define PIPE_TEX_FACE_POS_Z 4
    161 #define PIPE_TEX_FACE_NEG_Z 5
    162 #define PIPE_TEX_FACE_MAX   6
    163 
    164 #define PIPE_TEX_WRAP_REPEAT                   0
    165 #define PIPE_TEX_WRAP_CLAMP                    1
    166 #define PIPE_TEX_WRAP_CLAMP_TO_EDGE            2
    167 #define PIPE_TEX_WRAP_CLAMP_TO_BORDER          3
    168 #define PIPE_TEX_WRAP_MIRROR_REPEAT            4
    169 #define PIPE_TEX_WRAP_MIRROR_CLAMP             5
    170 #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE     6
    171 #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER   7
    172 
    173 /* Between mipmaps, ie mipfilter
    174  */
    175 #define PIPE_TEX_MIPFILTER_NEAREST  0
    176 #define PIPE_TEX_MIPFILTER_LINEAR   1
    177 #define PIPE_TEX_MIPFILTER_NONE     2
    178 
    179 /* Within a mipmap, ie min/mag filter
    180  */
    181 #define PIPE_TEX_FILTER_NEAREST      0
    182 #define PIPE_TEX_FILTER_LINEAR       1
    183 
    184 #define PIPE_TEX_COMPARE_NONE          0
    185 #define PIPE_TEX_COMPARE_R_TO_TEXTURE  1
    186 
    187 /**
    188  * Clear buffer bits
    189  */
    190 /** All color buffers currently bound */
    191 #define PIPE_CLEAR_COLOR        (1 << 0)
    192 #define PIPE_CLEAR_DEPTH        (1 << 1)
    193 #define PIPE_CLEAR_STENCIL      (1 << 2)
    194 /** Depth/stencil combined */
    195 #define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
    196 
    197 /**
    198  * Transfer object usage flags
    199  */
    200 enum pipe_transfer_usage {
    201    /**
    202     * Resource contents read back (or accessed directly) at transfer
    203     * create time.
    204     */
    205    PIPE_TRANSFER_READ = (1 << 0),
    206 
    207    /**
    208     * Resource contents will be written back at transfer_destroy
    209     * time (or modified as a result of being accessed directly).
    210     */
    211    PIPE_TRANSFER_WRITE = (1 << 1),
    212 
    213    /**
    214     * Read/modify/write
    215     */
    216    PIPE_TRANSFER_READ_WRITE = PIPE_TRANSFER_READ | PIPE_TRANSFER_WRITE,
    217 
    218    /**
    219     * The transfer should map the texture storage directly. The driver may
    220     * return NULL if that isn't possible, and the state tracker needs to cope
    221     * with that and use an alternative path without this flag.
    222     *
    223     * E.g. the state tracker could have a simpler path which maps textures and
    224     * does read/modify/write cycles on them directly, and a more complicated
    225     * path which uses minimal read and write transfers.
    226     */
    227    PIPE_TRANSFER_MAP_DIRECTLY = (1 << 2),
    228 
    229    /**
    230     * Discards the memory within the mapped region.
    231     *
    232     * It should not be used with PIPE_TRANSFER_READ.
    233     *
    234     * See also:
    235     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_RANGE_BIT flag.
    236     */
    237    PIPE_TRANSFER_DISCARD_RANGE = (1 << 8),
    238 
    239    /**
    240     * Fail if the resource cannot be mapped immediately.
    241     *
    242     * See also:
    243     * - Direct3D's D3DLOCK_DONOTWAIT flag.
    244     * - Mesa3D's MESA_MAP_NOWAIT_BIT flag.
    245     * - WDDM's D3DDDICB_LOCKFLAGS.DonotWait flag.
    246     */
    247    PIPE_TRANSFER_DONTBLOCK = (1 << 9),
    248 
    249    /**
    250     * Do not attempt to synchronize pending operations on the resource when mapping.
    251     *
    252     * It should not be used with PIPE_TRANSFER_READ.
    253     *
    254     * See also:
    255     * - OpenGL's ARB_map_buffer_range extension, MAP_UNSYNCHRONIZED_BIT flag.
    256     * - Direct3D's D3DLOCK_NOOVERWRITE flag.
    257     * - WDDM's D3DDDICB_LOCKFLAGS.IgnoreSync flag.
    258     */
    259    PIPE_TRANSFER_UNSYNCHRONIZED = (1 << 10),
    260 
    261    /**
    262     * Written ranges will be notified later with
    263     * pipe_context::transfer_flush_region.
    264     *
    265     * It should not be used with PIPE_TRANSFER_READ.
    266     *
    267     * See also:
    268     * - pipe_context::transfer_flush_region
    269     * - OpenGL's ARB_map_buffer_range extension, MAP_FLUSH_EXPLICIT_BIT flag.
    270     */
    271    PIPE_TRANSFER_FLUSH_EXPLICIT = (1 << 11),
    272 
    273    /**
    274     * Discards all memory backing the resource.
    275     *
    276     * It should not be used with PIPE_TRANSFER_READ.
    277     *
    278     * This is equivalent to:
    279     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_BUFFER_BIT
    280     * - BufferData(NULL) on a GL buffer
    281     * - Direct3D's D3DLOCK_DISCARD flag.
    282     * - WDDM's D3DDDICB_LOCKFLAGS.Discard flag.
    283     * - D3D10 DDI's D3D10_DDI_MAP_WRITE_DISCARD flag
    284     * - D3D10's D3D10_MAP_WRITE_DISCARD flag.
    285     */
    286    PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE = (1 << 12)
    287 
    288 };
    289 
    290 
    291 /*
    292  * Resource binding flags -- state tracker must specify in advance all
    293  * the ways a resource might be used.
    294  */
    295 #define PIPE_BIND_DEPTH_STENCIL        (1 << 0) /* create_surface */
    296 #define PIPE_BIND_RENDER_TARGET        (1 << 1) /* create_surface */
    297 #define PIPE_BIND_BLENDABLE            (1 << 2) /* create_surface */
    298 #define PIPE_BIND_SAMPLER_VIEW         (1 << 3) /* create_sampler_view */
    299 #define PIPE_BIND_VERTEX_BUFFER        (1 << 4) /* set_vertex_buffers */
    300 #define PIPE_BIND_INDEX_BUFFER         (1 << 5) /* draw_elements */
    301 #define PIPE_BIND_CONSTANT_BUFFER      (1 << 6) /* set_constant_buffer */
    302 #define PIPE_BIND_DISPLAY_TARGET       (1 << 8) /* flush_front_buffer */
    303 #define PIPE_BIND_TRANSFER_WRITE       (1 << 9) /* get_transfer */
    304 #define PIPE_BIND_TRANSFER_READ        (1 << 10) /* get_transfer */
    305 #define PIPE_BIND_STREAM_OUTPUT        (1 << 11) /* set_stream_output_buffers */
    306 #define PIPE_BIND_CURSOR               (1 << 16) /* mouse cursor */
    307 #define PIPE_BIND_CUSTOM               (1 << 17) /* state-tracker/winsys usages */
    308 #define PIPE_BIND_GLOBAL               (1 << 18) /* set_global_binding */
    309 #define PIPE_BIND_SHADER_RESOURCE      (1 << 19) /* set_shader_resources */
    310 #define PIPE_BIND_COMPUTE_RESOURCE     (1 << 20) /* set_compute_resources */
    311 
    312 /* The first two flags above were previously part of the amorphous
    313  * TEXTURE_USAGE, most of which are now descriptions of the ways a
    314  * particular texture can be bound to the gallium pipeline.  The two flags
    315  * below do not fit within that and probably need to be migrated to some
    316  * other place.
    317  *
    318  * It seems like scanout is used by the Xorg state tracker to ask for
    319  * a texture suitable for actual scanout (hence the name), which
    320  * implies extra layout constraints on some hardware.  It may also
    321  * have some special meaning regarding mouse cursor images.
    322  *
    323  * The shared flag is quite underspecified, but certainly isn't a
    324  * binding flag - it seems more like a message to the winsys to create
    325  * a shareable allocation.
    326  */
    327 #define PIPE_BIND_SCANOUT     (1 << 14) /*  */
    328 #define PIPE_BIND_SHARED      (1 << 15) /* get_texture_handle ??? */
    329 
    330 
    331 /* Flags for the driver about resource behaviour:
    332  */
    333 #define PIPE_RESOURCE_FLAG_GEN_MIPS    (1 << 0)  /* Driver performs autogen mips */
    334 #define PIPE_RESOURCE_FLAG_DRV_PRIV    (1 << 16) /* driver/winsys private */
    335 #define PIPE_RESOURCE_FLAG_ST_PRIV     (1 << 24) /* state-tracker/winsys private */
    336 
    337 /* Hint about the expected lifecycle of a resource.
    338  */
    339 #define PIPE_USAGE_DEFAULT        0 /* many uploads, draws intermixed */
    340 #define PIPE_USAGE_DYNAMIC        1 /* many uploads, draws intermixed */
    341 #define PIPE_USAGE_STATIC         2 /* same as immutable?? */
    342 #define PIPE_USAGE_IMMUTABLE      3 /* no change after first upload */
    343 #define PIPE_USAGE_STREAM         4 /* upload, draw, upload, draw */
    344 #define PIPE_USAGE_STAGING        5 /* supports data transfers from the GPU to the CPU */
    345 
    346 
    347 /**
    348  * Shaders
    349  */
    350 #define PIPE_SHADER_VERTEX   0
    351 #define PIPE_SHADER_FRAGMENT 1
    352 #define PIPE_SHADER_GEOMETRY 2
    353 #define PIPE_SHADER_COMPUTE  3
    354 #define PIPE_SHADER_TYPES    4
    355 
    356 
    357 /**
    358  * Primitive types:
    359  */
    360 #define PIPE_PRIM_POINTS               0
    361 #define PIPE_PRIM_LINES                1
    362 #define PIPE_PRIM_LINE_LOOP            2
    363 #define PIPE_PRIM_LINE_STRIP           3
    364 #define PIPE_PRIM_TRIANGLES            4
    365 #define PIPE_PRIM_TRIANGLE_STRIP       5
    366 #define PIPE_PRIM_TRIANGLE_FAN         6
    367 #define PIPE_PRIM_QUADS                7
    368 #define PIPE_PRIM_QUAD_STRIP           8
    369 #define PIPE_PRIM_POLYGON              9
    370 #define PIPE_PRIM_LINES_ADJACENCY          10
    371 #define PIPE_PRIM_LINE_STRIP_ADJACENCY    11
    372 #define PIPE_PRIM_TRIANGLES_ADJACENCY      12
    373 #define PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY 13
    374 #define PIPE_PRIM_MAX                      14
    375 
    376 
    377 /**
    378  * Query object types
    379  */
    380 #define PIPE_QUERY_OCCLUSION_COUNTER     0
    381 #define PIPE_QUERY_OCCLUSION_PREDICATE   1
    382 #define PIPE_QUERY_TIMESTAMP             2
    383 #define PIPE_QUERY_TIMESTAMP_DISJOINT    3
    384 #define PIPE_QUERY_TIME_ELAPSED          4
    385 #define PIPE_QUERY_PRIMITIVES_GENERATED  5
    386 #define PIPE_QUERY_PRIMITIVES_EMITTED    6
    387 #define PIPE_QUERY_SO_STATISTICS         7
    388 #define PIPE_QUERY_SO_OVERFLOW_PREDICATE 8
    389 #define PIPE_QUERY_GPU_FINISHED          9
    390 #define PIPE_QUERY_PIPELINE_STATISTICS  10
    391 #define PIPE_QUERY_TYPES                11
    392 
    393 
    394 /**
    395  * Conditional rendering modes
    396  */
    397 #define PIPE_RENDER_COND_WAIT              0
    398 #define PIPE_RENDER_COND_NO_WAIT           1
    399 #define PIPE_RENDER_COND_BY_REGION_WAIT    2
    400 #define PIPE_RENDER_COND_BY_REGION_NO_WAIT 3
    401 
    402 
    403 /**
    404  * Point sprite coord modes
    405  */
    406 #define PIPE_SPRITE_COORD_UPPER_LEFT 0
    407 #define PIPE_SPRITE_COORD_LOWER_LEFT 1
    408 
    409 
    410 /**
    411  * Texture swizzles
    412  */
    413 #define PIPE_SWIZZLE_RED   0
    414 #define PIPE_SWIZZLE_GREEN 1
    415 #define PIPE_SWIZZLE_BLUE  2
    416 #define PIPE_SWIZZLE_ALPHA 3
    417 #define PIPE_SWIZZLE_ZERO  4
    418 #define PIPE_SWIZZLE_ONE   5
    419 
    420 
    421 #define PIPE_TIMEOUT_INFINITE 0xffffffffffffffffull
    422 
    423 /**
    424  * Implementation capabilities/limits which are queried through
    425  * pipe_screen::get_param()
    426  */
    427 enum pipe_cap {
    428    PIPE_CAP_NPOT_TEXTURES = 1,
    429    PIPE_CAP_TWO_SIDED_STENCIL = 2,
    430    PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS = 4,
    431    PIPE_CAP_ANISOTROPIC_FILTER = 5,
    432    PIPE_CAP_POINT_SPRITE = 6,
    433    PIPE_CAP_MAX_RENDER_TARGETS = 7,
    434    PIPE_CAP_OCCLUSION_QUERY = 8,
    435    PIPE_CAP_TIMER_QUERY = 9,
    436    PIPE_CAP_TEXTURE_SHADOW_MAP = 10,
    437    PIPE_CAP_TEXTURE_SWIZZLE = 11,
    438    PIPE_CAP_MAX_TEXTURE_2D_LEVELS = 12,
    439    PIPE_CAP_MAX_TEXTURE_3D_LEVELS = 13,
    440    PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS = 14,
    441    PIPE_CAP_TEXTURE_MIRROR_CLAMP = 25,
    442    PIPE_CAP_BLEND_EQUATION_SEPARATE = 28,
    443    PIPE_CAP_SM3 = 29,  /*< Shader Model, supported */
    444    PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS = 30,
    445    PIPE_CAP_PRIMITIVE_RESTART = 31,
    446    /** Maximum texture image units accessible from vertex and fragment shaders
    447     * combined */
    448    PIPE_CAP_MAX_COMBINED_SAMPLERS = 32,
    449    /** blend enables and write masks per rendertarget */
    450    PIPE_CAP_INDEP_BLEND_ENABLE = 33,
    451    /** different blend funcs per rendertarget */
    452    PIPE_CAP_INDEP_BLEND_FUNC = 34,
    453    PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE = 35,
    454    PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS = 36,
    455    PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT = 37,
    456    PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT = 38,
    457    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER = 39,
    458    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER = 40,
    459    PIPE_CAP_DEPTH_CLIP_DISABLE = 41,
    460    PIPE_CAP_SHADER_STENCIL_EXPORT = 42,
    461    PIPE_CAP_TGSI_INSTANCEID = 43,
    462    PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR = 44,
    463    PIPE_CAP_FRAGMENT_COLOR_CLAMPED = 45,
    464    PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46,
    465    PIPE_CAP_SEAMLESS_CUBE_MAP = 47,
    466    PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE = 48,
    467    PIPE_CAP_SCALED_RESOLVE = 49,
    468    PIPE_CAP_MIN_TEXEL_OFFSET = 50,
    469    PIPE_CAP_MAX_TEXEL_OFFSET = 51,
    470    PIPE_CAP_CONDITIONAL_RENDER = 52,
    471    PIPE_CAP_TEXTURE_BARRIER = 53,
    472    PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS = 55,
    473    PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS = 56,
    474    PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME = 57,
    475    PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS = 58, /* temporary */
    476    PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS = 59, /* temporary */
    477    PIPE_CAP_VERTEX_COLOR_UNCLAMPED = 60,
    478    PIPE_CAP_VERTEX_COLOR_CLAMPED = 61,
    479    PIPE_CAP_GLSL_FEATURE_LEVEL = 62,
    480    PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 63,
    481    PIPE_CAP_USER_VERTEX_BUFFERS = 64,
    482    PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY = 65,
    483    PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY = 66,
    484    PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY = 67,
    485    PIPE_CAP_COMPUTE = 68,
    486    PIPE_CAP_USER_INDEX_BUFFERS = 69,
    487    PIPE_CAP_USER_CONSTANT_BUFFERS = 70,
    488    PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 71,
    489    PIPE_CAP_START_INSTANCE = 72,
    490    PIPE_CAP_QUERY_TIMESTAMP = 73
    491 };
    492 
    493 /**
    494  * Implementation limits which are queried through
    495  * pipe_screen::get_paramf()
    496  */
    497 enum pipe_capf
    498 {
    499    PIPE_CAPF_MAX_LINE_WIDTH = 15,
    500    PIPE_CAPF_MAX_LINE_WIDTH_AA = 16,
    501    PIPE_CAPF_MAX_POINT_WIDTH = 17,
    502    PIPE_CAPF_MAX_POINT_WIDTH_AA = 18,
    503    PIPE_CAPF_MAX_TEXTURE_ANISOTROPY = 19,
    504    PIPE_CAPF_MAX_TEXTURE_LOD_BIAS = 20,
    505    PIPE_CAPF_GUARD_BAND_LEFT = 21,
    506    PIPE_CAPF_GUARD_BAND_TOP = 22,
    507    PIPE_CAPF_GUARD_BAND_RIGHT = 23,
    508    PIPE_CAPF_GUARD_BAND_BOTTOM = 24
    509 };
    510 
    511 /* Shader caps not specific to any single stage */
    512 enum pipe_shader_cap
    513 {
    514    PIPE_SHADER_CAP_MAX_INSTRUCTIONS = 0, /* if 0, it means the stage is unsupported */
    515    PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS = 1,
    516    PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS = 2,
    517    PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS = 3,
    518    PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH = 4,
    519    PIPE_SHADER_CAP_MAX_INPUTS = 5,
    520    PIPE_SHADER_CAP_MAX_CONSTS = 6,
    521    PIPE_SHADER_CAP_MAX_CONST_BUFFERS = 7,
    522    PIPE_SHADER_CAP_MAX_TEMPS = 8,
    523    PIPE_SHADER_CAP_MAX_ADDRS = 9,
    524    PIPE_SHADER_CAP_MAX_PREDS = 10,
    525    /* boolean caps */
    526    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED = 11,
    527    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR = 12,
    528    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR = 13,
    529    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR = 14,
    530    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR = 15,
    531    PIPE_SHADER_CAP_SUBROUTINES = 16, /* BGNSUB, ENDSUB, CAL, RET */
    532    PIPE_SHADER_CAP_INTEGERS = 17,
    533    PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS = 18,
    534    PIPE_SHADER_CAP_PREFERRED_IR = 19
    535 };
    536 
    537 /**
    538  * Shader intermediate representation.
    539  */
    540 enum pipe_shader_ir
    541 {
    542    PIPE_SHADER_IR_TGSI,
    543    PIPE_SHADER_IR_LLVM
    544 };
    545 
    546 /**
    547  * Compute-specific implementation capability.  They can be queried
    548  * using pipe_screen::get_compute_param.
    549  */
    550 enum pipe_compute_cap
    551 {
    552    PIPE_COMPUTE_CAP_IR_TARGET,
    553    PIPE_COMPUTE_CAP_GRID_DIMENSION,
    554    PIPE_COMPUTE_CAP_MAX_GRID_SIZE,
    555    PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE,
    556    PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
    557    PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE,
    558    PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
    559    PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE,
    560    PIPE_COMPUTE_CAP_MAX_INPUT_SIZE
    561 };
    562 
    563 /**
    564  * Composite query types
    565  */
    566 
    567 /**
    568  * Query result for PIPE_QUERY_SO_STATISTICS.
    569  */
    570 struct pipe_query_data_so_statistics
    571 {
    572    uint64_t num_primitives_written;
    573    uint64_t primitives_storage_needed;
    574 };
    575 
    576 /**
    577  * Query result for PIPE_QUERY_TIMESTAMP_DISJOINT.
    578  */
    579 struct pipe_query_data_timestamp_disjoint
    580 {
    581    uint64_t frequency;
    582    boolean  disjoint;
    583 };
    584 
    585 /**
    586  * Query result for PIPE_QUERY_PIPELINE_STATISTICS.
    587  */
    588 struct pipe_query_data_pipeline_statistics
    589 {
    590    uint64_t ia_vertices;    /**< Num vertices read by the vertex fetcher. */
    591    uint64_t ia_primitives;  /**< Num primitives read by the vertex fetcher. */
    592    uint64_t vs_invocations; /**< Num vertex shader invocations. */
    593    uint64_t gs_invocations; /**< Num geometry shader invocations. */
    594    uint64_t gs_primitives;  /**< Num primitives output by a geometry shader. */
    595    uint64_t c_invocations;  /**< Num primitives sent to the rasterizer. */
    596    uint64_t c_primitives;   /**< Num primitives that were rendered. */
    597    uint64_t ps_invocations; /**< Num pixel shader invocations. */
    598    uint64_t hs_invocations; /**< Num hull shader invocations. */
    599    uint64_t ds_invocations; /**< Num domain shader invocations. */
    600    uint64_t cs_invocations; /**< Num compute shader invocations. */
    601 };
    602 
    603 /**
    604  * Query result (returned by pipe_context::get_query_result).
    605  */
    606 union pipe_query_result
    607 {
    608    /* PIPE_QUERY_OCCLUSION_PREDICATE */
    609    /* PIPE_QUERY_SO_OVERFLOW_PREDICATE */
    610    /* PIPE_QUERY_GPU_FINISHED */
    611    boolean b;
    612 
    613    /* PIPE_QUERY_OCCLUSION_COUNTER */
    614    /* PIPE_QUERY_TIMESTAMP */
    615    /* PIPE_QUERY_TIME_ELAPSED */
    616    /* PIPE_QUERY_PRIMITIVES_GENERATED */
    617    /* PIPE_QUERY_PRIMITIVES_EMITTED */
    618    uint64_t u64;
    619 
    620    /* PIPE_QUERY_SO_STATISTICS */
    621    struct pipe_query_data_so_statistics so_statistics;
    622 
    623    /* PIPE_QUERY_TIMESTAMP_DISJOINT */
    624    struct pipe_query_data_timestamp_disjoint timestamp_disjoint;
    625 
    626    /* PIPE_QUERY_PIPELINE_STATISTICS */
    627    struct pipe_query_data_pipeline_statistics pipeline_statistics;
    628 };
    629 
    630 union pipe_color_union
    631 {
    632    float f[4];
    633    int i[4];
    634    unsigned int ui[4];
    635 };
    636 
    637 #ifdef __cplusplus
    638 }
    639 #endif
    640 
    641 #endif
    642