Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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_TEXTURE_CUBE_ARRAY = 8,
  154.    PIPE_MAX_TEXTURE_TYPES
  155. };
  156.  
  157. #define PIPE_TEX_FACE_POS_X 0
  158. #define PIPE_TEX_FACE_NEG_X 1
  159. #define PIPE_TEX_FACE_POS_Y 2
  160. #define PIPE_TEX_FACE_NEG_Y 3
  161. #define PIPE_TEX_FACE_POS_Z 4
  162. #define PIPE_TEX_FACE_NEG_Z 5
  163. #define PIPE_TEX_FACE_MAX   6
  164.  
  165. #define PIPE_TEX_WRAP_REPEAT                   0
  166. #define PIPE_TEX_WRAP_CLAMP                    1
  167. #define PIPE_TEX_WRAP_CLAMP_TO_EDGE            2
  168. #define PIPE_TEX_WRAP_CLAMP_TO_BORDER          3
  169. #define PIPE_TEX_WRAP_MIRROR_REPEAT            4
  170. #define PIPE_TEX_WRAP_MIRROR_CLAMP             5
  171. #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE     6
  172. #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER   7
  173.  
  174. /* Between mipmaps, ie mipfilter
  175.  */
  176. #define PIPE_TEX_MIPFILTER_NEAREST  0
  177. #define PIPE_TEX_MIPFILTER_LINEAR   1
  178. #define PIPE_TEX_MIPFILTER_NONE     2
  179.  
  180. /* Within a mipmap, ie min/mag filter
  181.  */
  182. #define PIPE_TEX_FILTER_NEAREST      0
  183. #define PIPE_TEX_FILTER_LINEAR       1
  184.  
  185. #define PIPE_TEX_COMPARE_NONE          0
  186. #define PIPE_TEX_COMPARE_R_TO_TEXTURE  1
  187.  
  188. /**
  189.  * Clear buffer bits
  190.  */
  191. /** All color buffers currently bound */
  192. #define PIPE_CLEAR_COLOR        (1 << 0)
  193. #define PIPE_CLEAR_DEPTH        (1 << 1)
  194. #define PIPE_CLEAR_STENCIL      (1 << 2)
  195. /** Depth/stencil combined */
  196. #define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
  197.  
  198. /**
  199.  * Transfer object usage flags
  200.  */
  201. enum pipe_transfer_usage {
  202.    /**
  203.     * Resource contents read back (or accessed directly) at transfer
  204.     * create time.
  205.     */
  206.    PIPE_TRANSFER_READ = (1 << 0),
  207.    
  208.    /**
  209.     * Resource contents will be written back at transfer_unmap
  210.     * time (or modified as a result of being accessed directly).
  211.     */
  212.    PIPE_TRANSFER_WRITE = (1 << 1),
  213.  
  214.    /**
  215.     * Read/modify/write
  216.     */
  217.    PIPE_TRANSFER_READ_WRITE = PIPE_TRANSFER_READ | PIPE_TRANSFER_WRITE,
  218.  
  219.    /**
  220.     * The transfer should map the texture storage directly. The driver may
  221.     * return NULL if that isn't possible, and the state tracker needs to cope
  222.     * with that and use an alternative path without this flag.
  223.     *
  224.     * E.g. the state tracker could have a simpler path which maps textures and
  225.     * does read/modify/write cycles on them directly, and a more complicated
  226.     * path which uses minimal read and write transfers.
  227.     */
  228.    PIPE_TRANSFER_MAP_DIRECTLY = (1 << 2),
  229.  
  230.    /**
  231.     * Discards the memory within the mapped region.
  232.     *
  233.     * It should not be used with PIPE_TRANSFER_READ.
  234.     *
  235.     * See also:
  236.     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_RANGE_BIT flag.
  237.     */
  238.    PIPE_TRANSFER_DISCARD_RANGE = (1 << 8),
  239.  
  240.    /**
  241.     * Fail if the resource cannot be mapped immediately.
  242.     *
  243.     * See also:
  244.     * - Direct3D's D3DLOCK_DONOTWAIT flag.
  245.     * - Mesa3D's MESA_MAP_NOWAIT_BIT flag.
  246.     * - WDDM's D3DDDICB_LOCKFLAGS.DonotWait flag.
  247.     */
  248.    PIPE_TRANSFER_DONTBLOCK = (1 << 9),
  249.  
  250.    /**
  251.     * Do not attempt to synchronize pending operations on the resource when mapping.
  252.     *
  253.     * It should not be used with PIPE_TRANSFER_READ.
  254.     *
  255.     * See also:
  256.     * - OpenGL's ARB_map_buffer_range extension, MAP_UNSYNCHRONIZED_BIT flag.
  257.     * - Direct3D's D3DLOCK_NOOVERWRITE flag.
  258.     * - WDDM's D3DDDICB_LOCKFLAGS.IgnoreSync flag.
  259.     */
  260.    PIPE_TRANSFER_UNSYNCHRONIZED = (1 << 10),
  261.  
  262.    /**
  263.     * Written ranges will be notified later with
  264.     * pipe_context::transfer_flush_region.
  265.     *
  266.     * It should not be used with PIPE_TRANSFER_READ.
  267.     *
  268.     * See also:
  269.     * - pipe_context::transfer_flush_region
  270.     * - OpenGL's ARB_map_buffer_range extension, MAP_FLUSH_EXPLICIT_BIT flag.
  271.     */
  272.    PIPE_TRANSFER_FLUSH_EXPLICIT = (1 << 11),
  273.  
  274.    /**
  275.     * Discards all memory backing the resource.
  276.     *
  277.     * It should not be used with PIPE_TRANSFER_READ.
  278.     *
  279.     * This is equivalent to:
  280.     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_BUFFER_BIT
  281.     * - BufferData(NULL) on a GL buffer
  282.     * - Direct3D's D3DLOCK_DISCARD flag.
  283.     * - WDDM's D3DDDICB_LOCKFLAGS.Discard flag.
  284.     * - D3D10 DDI's D3D10_DDI_MAP_WRITE_DISCARD flag
  285.     * - D3D10's D3D10_MAP_WRITE_DISCARD flag.
  286.     */
  287.    PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE = (1 << 12)
  288.  
  289. };
  290.  
  291. /**
  292.  * Flags for the flush function.
  293.  */
  294. enum pipe_flush_flags {
  295.    PIPE_FLUSH_END_OF_FRAME = (1 << 0)
  296. };
  297.  
  298. /*
  299.  * Resource binding flags -- state tracker must specify in advance all
  300.  * the ways a resource might be used.
  301.  */
  302. #define PIPE_BIND_DEPTH_STENCIL        (1 << 0) /* create_surface */
  303. #define PIPE_BIND_RENDER_TARGET        (1 << 1) /* create_surface */
  304. #define PIPE_BIND_BLENDABLE            (1 << 2) /* create_surface */
  305. #define PIPE_BIND_SAMPLER_VIEW         (1 << 3) /* create_sampler_view */
  306. #define PIPE_BIND_VERTEX_BUFFER        (1 << 4) /* set_vertex_buffers */
  307. #define PIPE_BIND_INDEX_BUFFER         (1 << 5) /* draw_elements */
  308. #define PIPE_BIND_CONSTANT_BUFFER      (1 << 6) /* set_constant_buffer */
  309. #define PIPE_BIND_DISPLAY_TARGET       (1 << 8) /* flush_front_buffer */
  310. #define PIPE_BIND_TRANSFER_WRITE       (1 << 9) /* transfer_map */
  311. #define PIPE_BIND_TRANSFER_READ        (1 << 10) /* transfer_map */
  312. #define PIPE_BIND_STREAM_OUTPUT        (1 << 11) /* set_stream_output_buffers */
  313. #define PIPE_BIND_CURSOR               (1 << 16) /* mouse cursor */
  314. #define PIPE_BIND_CUSTOM               (1 << 17) /* state-tracker/winsys usages */
  315. #define PIPE_BIND_GLOBAL               (1 << 18) /* set_global_binding */
  316. #define PIPE_BIND_SHADER_RESOURCE      (1 << 19) /* set_shader_resources */
  317. #define PIPE_BIND_COMPUTE_RESOURCE     (1 << 20) /* set_compute_resources */
  318.  
  319. /* The first two flags above were previously part of the amorphous
  320.  * TEXTURE_USAGE, most of which are now descriptions of the ways a
  321.  * particular texture can be bound to the gallium pipeline.  The two flags
  322.  * below do not fit within that and probably need to be migrated to some
  323.  * other place.
  324.  *
  325.  * It seems like scanout is used by the Xorg state tracker to ask for
  326.  * a texture suitable for actual scanout (hence the name), which
  327.  * implies extra layout constraints on some hardware.  It may also
  328.  * have some special meaning regarding mouse cursor images.
  329.  *
  330.  * The shared flag is quite underspecified, but certainly isn't a
  331.  * binding flag - it seems more like a message to the winsys to create
  332.  * a shareable allocation.
  333.  */
  334. #define PIPE_BIND_SCANOUT     (1 << 14) /*  */
  335. #define PIPE_BIND_SHARED      (1 << 15) /* get_texture_handle ??? */
  336.  
  337.  
  338. /* Flags for the driver about resource behaviour:
  339.  */
  340. #define PIPE_RESOURCE_FLAG_GEN_MIPS    (1 << 0)  /* Driver performs autogen mips */
  341. #define PIPE_RESOURCE_FLAG_DRV_PRIV    (1 << 16) /* driver/winsys private */
  342. #define PIPE_RESOURCE_FLAG_ST_PRIV     (1 << 24) /* state-tracker/winsys private */
  343.  
  344. /* Hint about the expected lifecycle of a resource.
  345.  */
  346. #define PIPE_USAGE_DEFAULT        0 /* many uploads, draws intermixed */
  347. #define PIPE_USAGE_DYNAMIC        1 /* many uploads, draws intermixed */
  348. #define PIPE_USAGE_STATIC         2 /* same as immutable?? */
  349. #define PIPE_USAGE_IMMUTABLE      3 /* no change after first upload */
  350. #define PIPE_USAGE_STREAM         4 /* upload, draw, upload, draw */
  351. #define PIPE_USAGE_STAGING        5 /* supports data transfers from the GPU to the CPU */
  352.  
  353.  
  354. /**
  355.  * Shaders
  356.  */
  357. #define PIPE_SHADER_VERTEX   0
  358. #define PIPE_SHADER_FRAGMENT 1
  359. #define PIPE_SHADER_GEOMETRY 2
  360. #define PIPE_SHADER_COMPUTE  3
  361. #define PIPE_SHADER_TYPES    4
  362.  
  363.  
  364. /**
  365.  * Primitive types:
  366.  */
  367. #define PIPE_PRIM_POINTS               0
  368. #define PIPE_PRIM_LINES                1
  369. #define PIPE_PRIM_LINE_LOOP            2
  370. #define PIPE_PRIM_LINE_STRIP           3
  371. #define PIPE_PRIM_TRIANGLES            4
  372. #define PIPE_PRIM_TRIANGLE_STRIP       5
  373. #define PIPE_PRIM_TRIANGLE_FAN         6
  374. #define PIPE_PRIM_QUADS                7
  375. #define PIPE_PRIM_QUAD_STRIP           8
  376. #define PIPE_PRIM_POLYGON              9
  377. #define PIPE_PRIM_LINES_ADJACENCY          10
  378. #define PIPE_PRIM_LINE_STRIP_ADJACENCY    11
  379. #define PIPE_PRIM_TRIANGLES_ADJACENCY      12
  380. #define PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY 13
  381. #define PIPE_PRIM_MAX                      14
  382.  
  383.  
  384. /**
  385.  * Query object types
  386.  */
  387. #define PIPE_QUERY_OCCLUSION_COUNTER     0
  388. #define PIPE_QUERY_OCCLUSION_PREDICATE   1
  389. #define PIPE_QUERY_TIMESTAMP             2
  390. #define PIPE_QUERY_TIMESTAMP_DISJOINT    3
  391. #define PIPE_QUERY_TIME_ELAPSED          4
  392. #define PIPE_QUERY_PRIMITIVES_GENERATED  5
  393. #define PIPE_QUERY_PRIMITIVES_EMITTED    6
  394. #define PIPE_QUERY_SO_STATISTICS         7
  395. #define PIPE_QUERY_SO_OVERFLOW_PREDICATE 8
  396. #define PIPE_QUERY_GPU_FINISHED          9
  397. #define PIPE_QUERY_PIPELINE_STATISTICS  10
  398. #define PIPE_QUERY_TYPES                11
  399.  
  400. /* start of driver queries,
  401.  * see pipe_screen::get_driver_query_info */
  402. #define PIPE_QUERY_DRIVER_SPECIFIC     256
  403.  
  404.  
  405. /**
  406.  * Conditional rendering modes
  407.  */
  408. #define PIPE_RENDER_COND_WAIT              0
  409. #define PIPE_RENDER_COND_NO_WAIT           1
  410. #define PIPE_RENDER_COND_BY_REGION_WAIT    2
  411. #define PIPE_RENDER_COND_BY_REGION_NO_WAIT 3
  412.  
  413.  
  414. /**
  415.  * Point sprite coord modes
  416.  */
  417. #define PIPE_SPRITE_COORD_UPPER_LEFT 0
  418. #define PIPE_SPRITE_COORD_LOWER_LEFT 1
  419.  
  420.  
  421. /**
  422.  * Texture swizzles
  423.  */
  424. #define PIPE_SWIZZLE_RED   0
  425. #define PIPE_SWIZZLE_GREEN 1
  426. #define PIPE_SWIZZLE_BLUE  2
  427. #define PIPE_SWIZZLE_ALPHA 3
  428. #define PIPE_SWIZZLE_ZERO  4
  429. #define PIPE_SWIZZLE_ONE   5
  430.  
  431.  
  432. #define PIPE_TIMEOUT_INFINITE 0xffffffffffffffffull
  433.  
  434. /**
  435.  * Implementation capabilities/limits which are queried through
  436.  * pipe_screen::get_param()
  437.  */
  438. enum pipe_cap {
  439.    PIPE_CAP_NPOT_TEXTURES = 1,
  440.    PIPE_CAP_TWO_SIDED_STENCIL = 2,
  441.    PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS = 4,
  442.    PIPE_CAP_ANISOTROPIC_FILTER = 5,
  443.    PIPE_CAP_POINT_SPRITE = 6,
  444.    PIPE_CAP_MAX_RENDER_TARGETS = 7,
  445.    PIPE_CAP_OCCLUSION_QUERY = 8,
  446.    PIPE_CAP_QUERY_TIME_ELAPSED = 9,
  447.    PIPE_CAP_TEXTURE_SHADOW_MAP = 10,
  448.    PIPE_CAP_TEXTURE_SWIZZLE = 11,
  449.    PIPE_CAP_MAX_TEXTURE_2D_LEVELS = 12,
  450.    PIPE_CAP_MAX_TEXTURE_3D_LEVELS = 13,
  451.    PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS = 14,
  452.    PIPE_CAP_TEXTURE_MIRROR_CLAMP = 25,
  453.    PIPE_CAP_BLEND_EQUATION_SEPARATE = 28,
  454.    PIPE_CAP_SM3 = 29,  /*< Shader Model, supported */
  455.    PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS = 30,
  456.    PIPE_CAP_PRIMITIVE_RESTART = 31,
  457.    /** Maximum texture image units accessible from vertex and fragment shaders
  458.     * combined */
  459.    PIPE_CAP_MAX_COMBINED_SAMPLERS = 32,
  460.    /** blend enables and write masks per rendertarget */
  461.    PIPE_CAP_INDEP_BLEND_ENABLE = 33,
  462.    /** different blend funcs per rendertarget */
  463.    PIPE_CAP_INDEP_BLEND_FUNC = 34,
  464.    PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS = 36,
  465.    PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT = 37,
  466.    PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT = 38,
  467.    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER = 39,
  468.    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER = 40,
  469.    PIPE_CAP_DEPTH_CLIP_DISABLE = 41,
  470.    PIPE_CAP_SHADER_STENCIL_EXPORT = 42,
  471.    PIPE_CAP_TGSI_INSTANCEID = 43,
  472.    PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR = 44,
  473.    PIPE_CAP_FRAGMENT_COLOR_CLAMPED = 45,
  474.    PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46,
  475.    PIPE_CAP_SEAMLESS_CUBE_MAP = 47,
  476.    PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE = 48,
  477.    PIPE_CAP_SCALED_RESOLVE = 49,
  478.    PIPE_CAP_MIN_TEXEL_OFFSET = 50,
  479.    PIPE_CAP_MAX_TEXEL_OFFSET = 51,
  480.    PIPE_CAP_CONDITIONAL_RENDER = 52,
  481.    PIPE_CAP_TEXTURE_BARRIER = 53,
  482.    PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS = 55,
  483.    PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS = 56,
  484.    PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME = 57,
  485.    PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS = 59, /* temporary */
  486.    PIPE_CAP_VERTEX_COLOR_UNCLAMPED = 60,
  487.    PIPE_CAP_VERTEX_COLOR_CLAMPED = 61,
  488.    PIPE_CAP_GLSL_FEATURE_LEVEL = 62,
  489.    PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 63,
  490.    PIPE_CAP_USER_VERTEX_BUFFERS = 64,
  491.    PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY = 65,
  492.    PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY = 66,
  493.    PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY = 67,
  494.    PIPE_CAP_COMPUTE = 68,
  495.    PIPE_CAP_USER_INDEX_BUFFERS = 69,
  496.    PIPE_CAP_USER_CONSTANT_BUFFERS = 70,
  497.    PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 71,
  498.    PIPE_CAP_START_INSTANCE = 72,
  499.    PIPE_CAP_QUERY_TIMESTAMP = 73,
  500.    PIPE_CAP_TEXTURE_MULTISAMPLE = 74,
  501.    PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT = 75,
  502.    PIPE_CAP_CUBE_MAP_ARRAY = 76,
  503.    PIPE_CAP_TEXTURE_BUFFER_OBJECTS = 77,
  504.    PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 78,
  505.    PIPE_CAP_TGSI_TEXCOORD = 79,
  506.    PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER = 80,
  507.    PIPE_CAP_QUERY_PIPELINE_STATISTICS = 81,
  508.    PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK = 82,
  509.    PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE = 83,
  510.    PIPE_CAP_MAX_VIEWPORTS = 84
  511. };
  512.  
  513. #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
  514. #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600 (1 << 1)
  515.  
  516.  
  517. /**
  518.  * Implementation limits which are queried through
  519.  * pipe_screen::get_paramf()
  520.  */
  521. enum pipe_capf
  522. {
  523.    PIPE_CAPF_MAX_LINE_WIDTH = 15,
  524.    PIPE_CAPF_MAX_LINE_WIDTH_AA = 16,
  525.    PIPE_CAPF_MAX_POINT_WIDTH = 17,
  526.    PIPE_CAPF_MAX_POINT_WIDTH_AA = 18,
  527.    PIPE_CAPF_MAX_TEXTURE_ANISOTROPY = 19,
  528.    PIPE_CAPF_MAX_TEXTURE_LOD_BIAS = 20,
  529.    PIPE_CAPF_GUARD_BAND_LEFT = 21,
  530.    PIPE_CAPF_GUARD_BAND_TOP = 22,
  531.    PIPE_CAPF_GUARD_BAND_RIGHT = 23,
  532.    PIPE_CAPF_GUARD_BAND_BOTTOM = 24
  533. };
  534.  
  535. /* Shader caps not specific to any single stage */
  536. enum pipe_shader_cap
  537. {
  538.    PIPE_SHADER_CAP_MAX_INSTRUCTIONS = 0, /* if 0, it means the stage is unsupported */
  539.    PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS = 1,
  540.    PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS = 2,
  541.    PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS = 3,
  542.    PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH = 4,
  543.    PIPE_SHADER_CAP_MAX_INPUTS = 5,
  544.    PIPE_SHADER_CAP_MAX_CONSTS = 6,
  545.    PIPE_SHADER_CAP_MAX_CONST_BUFFERS = 7,
  546.    PIPE_SHADER_CAP_MAX_TEMPS = 8,
  547.    PIPE_SHADER_CAP_MAX_ADDRS = 9,
  548.    PIPE_SHADER_CAP_MAX_PREDS = 10,
  549.    /* boolean caps */
  550.    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED = 11,
  551.    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR = 12,
  552.    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR = 13,
  553.    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR = 14,
  554.    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR = 15,
  555.    PIPE_SHADER_CAP_SUBROUTINES = 16, /* BGNSUB, ENDSUB, CAL, RET */
  556.    PIPE_SHADER_CAP_INTEGERS = 17,
  557.    PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS = 18,
  558.    PIPE_SHADER_CAP_PREFERRED_IR = 19,
  559.    PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED = 20
  560. };
  561.  
  562. /**
  563.  * Shader intermediate representation.
  564.  */
  565. enum pipe_shader_ir
  566. {
  567.    PIPE_SHADER_IR_TGSI,
  568.    PIPE_SHADER_IR_LLVM
  569. };
  570.  
  571. /**
  572.  * Compute-specific implementation capability.  They can be queried
  573.  * using pipe_screen::get_compute_param.
  574.  */
  575. enum pipe_compute_cap
  576. {
  577.    PIPE_COMPUTE_CAP_IR_TARGET,
  578.    PIPE_COMPUTE_CAP_GRID_DIMENSION,
  579.    PIPE_COMPUTE_CAP_MAX_GRID_SIZE,
  580.    PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE,
  581.    PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
  582.    PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE,
  583.    PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
  584.    PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE,
  585.    PIPE_COMPUTE_CAP_MAX_INPUT_SIZE,
  586.    PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE
  587. };
  588.  
  589. /**
  590.  * Composite query types
  591.  */
  592.  
  593. /**
  594.  * Query result for PIPE_QUERY_SO_STATISTICS.
  595.  */
  596. struct pipe_query_data_so_statistics
  597. {
  598.    uint64_t num_primitives_written;
  599.    uint64_t primitives_storage_needed;
  600. };
  601.  
  602. /**
  603.  * Query result for PIPE_QUERY_TIMESTAMP_DISJOINT.
  604.  */
  605. struct pipe_query_data_timestamp_disjoint
  606. {
  607.    uint64_t frequency;
  608.    boolean  disjoint;
  609. };
  610.  
  611. /**
  612.  * Query result for PIPE_QUERY_PIPELINE_STATISTICS.
  613.  */
  614. struct pipe_query_data_pipeline_statistics
  615. {
  616.    uint64_t ia_vertices;    /**< Num vertices read by the vertex fetcher. */
  617.    uint64_t ia_primitives;  /**< Num primitives read by the vertex fetcher. */
  618.    uint64_t vs_invocations; /**< Num vertex shader invocations. */
  619.    uint64_t gs_invocations; /**< Num geometry shader invocations. */
  620.    uint64_t gs_primitives;  /**< Num primitives output by a geometry shader. */
  621.    uint64_t c_invocations;  /**< Num primitives sent to the rasterizer. */
  622.    uint64_t c_primitives;   /**< Num primitives that were rendered. */
  623.    uint64_t ps_invocations; /**< Num pixel shader invocations. */
  624.    uint64_t hs_invocations; /**< Num hull shader invocations. */
  625.    uint64_t ds_invocations; /**< Num domain shader invocations. */
  626.    uint64_t cs_invocations; /**< Num compute shader invocations. */
  627. };
  628.  
  629. /**
  630.  * Query result (returned by pipe_context::get_query_result).
  631.  */
  632. union pipe_query_result
  633. {
  634.    /* PIPE_QUERY_OCCLUSION_PREDICATE */
  635.    /* PIPE_QUERY_SO_OVERFLOW_PREDICATE */
  636.    /* PIPE_QUERY_GPU_FINISHED */
  637.    boolean b;
  638.  
  639.    /* PIPE_QUERY_OCCLUSION_COUNTER */
  640.    /* PIPE_QUERY_TIMESTAMP */
  641.    /* PIPE_QUERY_TIME_ELAPSED */
  642.    /* PIPE_QUERY_PRIMITIVES_GENERATED */
  643.    /* PIPE_QUERY_PRIMITIVES_EMITTED */
  644.    uint64_t u64;
  645.  
  646.    /* PIPE_QUERY_SO_STATISTICS */
  647.    struct pipe_query_data_so_statistics so_statistics;
  648.  
  649.    /* PIPE_QUERY_TIMESTAMP_DISJOINT */
  650.    struct pipe_query_data_timestamp_disjoint timestamp_disjoint;
  651.  
  652.    /* PIPE_QUERY_PIPELINE_STATISTICS */
  653.    struct pipe_query_data_pipeline_statistics pipeline_statistics;
  654. };
  655.  
  656. union pipe_color_union
  657. {
  658.    float f[4];
  659.    int i[4];
  660.    unsigned int ui[4];
  661. };
  662.  
  663. struct pipe_driver_query_info
  664. {
  665.    const char *name;
  666.    unsigned query_type; /* PIPE_QUERY_DRIVER_SPECIFIC + i */
  667.    uint64_t max_value; /* max value that can be returned */
  668.    boolean uses_byte_units; /* whether the result is in bytes */
  669. };
  670.  
  671. #ifdef __cplusplus
  672. }
  673. #endif
  674.  
  675. #endif
  676.