Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 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 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 VMWARE 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. {
  46.    PIPE_OK = 0,
  47.    PIPE_ERROR = -1,    /**< Generic error */
  48.    PIPE_ERROR_BAD_INPUT = -2,
  49.    PIPE_ERROR_OUT_OF_MEMORY = -3,
  50.    PIPE_ERROR_RETRY = -4
  51.    /* TODO */
  52. };
  53.  
  54.  
  55. #define PIPE_BLENDFACTOR_ONE                 0x1
  56. #define PIPE_BLENDFACTOR_SRC_COLOR           0x2
  57. #define PIPE_BLENDFACTOR_SRC_ALPHA           0x3
  58. #define PIPE_BLENDFACTOR_DST_ALPHA           0x4
  59. #define PIPE_BLENDFACTOR_DST_COLOR           0x5
  60. #define PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE  0x6
  61. #define PIPE_BLENDFACTOR_CONST_COLOR         0x7
  62. #define PIPE_BLENDFACTOR_CONST_ALPHA         0x8
  63. #define PIPE_BLENDFACTOR_SRC1_COLOR          0x9
  64. #define PIPE_BLENDFACTOR_SRC1_ALPHA          0x0A
  65. #define PIPE_BLENDFACTOR_ZERO                0x11
  66. #define PIPE_BLENDFACTOR_INV_SRC_COLOR       0x12
  67. #define PIPE_BLENDFACTOR_INV_SRC_ALPHA       0x13
  68. #define PIPE_BLENDFACTOR_INV_DST_ALPHA       0x14
  69. #define PIPE_BLENDFACTOR_INV_DST_COLOR       0x15
  70. #define PIPE_BLENDFACTOR_INV_CONST_COLOR     0x17
  71. #define PIPE_BLENDFACTOR_INV_CONST_ALPHA     0x18
  72. #define PIPE_BLENDFACTOR_INV_SRC1_COLOR      0x19
  73. #define PIPE_BLENDFACTOR_INV_SRC1_ALPHA      0x1A
  74.  
  75. #define PIPE_BLEND_ADD               0
  76. #define PIPE_BLEND_SUBTRACT          1
  77. #define PIPE_BLEND_REVERSE_SUBTRACT  2
  78. #define PIPE_BLEND_MIN               3
  79. #define PIPE_BLEND_MAX               4
  80.  
  81. #define PIPE_LOGICOP_CLEAR            0
  82. #define PIPE_LOGICOP_NOR              1
  83. #define PIPE_LOGICOP_AND_INVERTED     2
  84. #define PIPE_LOGICOP_COPY_INVERTED    3
  85. #define PIPE_LOGICOP_AND_REVERSE      4
  86. #define PIPE_LOGICOP_INVERT           5
  87. #define PIPE_LOGICOP_XOR              6
  88. #define PIPE_LOGICOP_NAND             7
  89. #define PIPE_LOGICOP_AND              8
  90. #define PIPE_LOGICOP_EQUIV            9
  91. #define PIPE_LOGICOP_NOOP             10
  92. #define PIPE_LOGICOP_OR_INVERTED      11
  93. #define PIPE_LOGICOP_COPY             12
  94. #define PIPE_LOGICOP_OR_REVERSE       13
  95. #define PIPE_LOGICOP_OR               14
  96. #define PIPE_LOGICOP_SET              15  
  97.  
  98. #define PIPE_MASK_R  0x1
  99. #define PIPE_MASK_G  0x2
  100. #define PIPE_MASK_B  0x4
  101. #define PIPE_MASK_A  0x8
  102. #define PIPE_MASK_RGBA 0xf
  103. #define PIPE_MASK_Z  0x10
  104. #define PIPE_MASK_S  0x20
  105. #define PIPE_MASK_ZS 0x30
  106. #define PIPE_MASK_RGBAZS (PIPE_MASK_RGBA|PIPE_MASK_ZS)
  107.  
  108.  
  109. /**
  110.  * Inequality functions.  Used for depth test, stencil compare, alpha
  111.  * test, shadow compare, etc.
  112.  */
  113. #define PIPE_FUNC_NEVER    0
  114. #define PIPE_FUNC_LESS     1
  115. #define PIPE_FUNC_EQUAL    2
  116. #define PIPE_FUNC_LEQUAL   3
  117. #define PIPE_FUNC_GREATER  4
  118. #define PIPE_FUNC_NOTEQUAL 5
  119. #define PIPE_FUNC_GEQUAL   6
  120. #define PIPE_FUNC_ALWAYS   7
  121.  
  122. /** Polygon fill mode */
  123. #define PIPE_POLYGON_MODE_FILL  0
  124. #define PIPE_POLYGON_MODE_LINE  1
  125. #define PIPE_POLYGON_MODE_POINT 2
  126.  
  127. /** Polygon face specification, eg for culling */
  128. #define PIPE_FACE_NONE           0
  129. #define PIPE_FACE_FRONT          1
  130. #define PIPE_FACE_BACK           2
  131. #define PIPE_FACE_FRONT_AND_BACK (PIPE_FACE_FRONT | PIPE_FACE_BACK)
  132.  
  133. /** Stencil ops */
  134. #define PIPE_STENCIL_OP_KEEP       0
  135. #define PIPE_STENCIL_OP_ZERO       1
  136. #define PIPE_STENCIL_OP_REPLACE    2
  137. #define PIPE_STENCIL_OP_INCR       3
  138. #define PIPE_STENCIL_OP_DECR       4
  139. #define PIPE_STENCIL_OP_INCR_WRAP  5
  140. #define PIPE_STENCIL_OP_DECR_WRAP  6
  141. #define PIPE_STENCIL_OP_INVERT     7
  142.  
  143. /** Texture types.
  144.  * See the documentation for info on PIPE_TEXTURE_RECT vs PIPE_TEXTURE_2D
  145.  */
  146. enum pipe_texture_target
  147. {
  148.    PIPE_BUFFER           = 0,
  149.    PIPE_TEXTURE_1D       = 1,
  150.    PIPE_TEXTURE_2D       = 2,
  151.    PIPE_TEXTURE_3D       = 3,
  152.    PIPE_TEXTURE_CUBE     = 4,
  153.    PIPE_TEXTURE_RECT     = 5,
  154.    PIPE_TEXTURE_1D_ARRAY = 6,
  155.    PIPE_TEXTURE_2D_ARRAY = 7,
  156.    PIPE_TEXTURE_CUBE_ARRAY = 8,
  157.    PIPE_MAX_TEXTURE_TYPES
  158. };
  159.  
  160. #define PIPE_TEX_FACE_POS_X 0
  161. #define PIPE_TEX_FACE_NEG_X 1
  162. #define PIPE_TEX_FACE_POS_Y 2
  163. #define PIPE_TEX_FACE_NEG_Y 3
  164. #define PIPE_TEX_FACE_POS_Z 4
  165. #define PIPE_TEX_FACE_NEG_Z 5
  166. #define PIPE_TEX_FACE_MAX   6
  167.  
  168. #define PIPE_TEX_WRAP_REPEAT                   0
  169. #define PIPE_TEX_WRAP_CLAMP                    1
  170. #define PIPE_TEX_WRAP_CLAMP_TO_EDGE            2
  171. #define PIPE_TEX_WRAP_CLAMP_TO_BORDER          3
  172. #define PIPE_TEX_WRAP_MIRROR_REPEAT            4
  173. #define PIPE_TEX_WRAP_MIRROR_CLAMP             5
  174. #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE     6
  175. #define PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER   7
  176.  
  177. /** Between mipmaps, ie mipfilter */
  178. #define PIPE_TEX_MIPFILTER_NEAREST  0
  179. #define PIPE_TEX_MIPFILTER_LINEAR   1
  180. #define PIPE_TEX_MIPFILTER_NONE     2
  181.  
  182. /** Within a mipmap, ie min/mag filter */
  183. #define PIPE_TEX_FILTER_NEAREST      0
  184. #define PIPE_TEX_FILTER_LINEAR       1
  185.  
  186. #define PIPE_TEX_COMPARE_NONE          0
  187. #define PIPE_TEX_COMPARE_R_TO_TEXTURE  1
  188.  
  189. /**
  190.  * Clear buffer bits
  191.  */
  192. #define PIPE_CLEAR_DEPTH        (1 << 0)
  193. #define PIPE_CLEAR_STENCIL      (1 << 1)
  194. #define PIPE_CLEAR_COLOR0       (1 << 2)
  195. #define PIPE_CLEAR_COLOR1       (1 << 3)
  196. #define PIPE_CLEAR_COLOR2       (1 << 4)
  197. #define PIPE_CLEAR_COLOR3       (1 << 5)
  198. #define PIPE_CLEAR_COLOR4       (1 << 6)
  199. #define PIPE_CLEAR_COLOR5       (1 << 7)
  200. #define PIPE_CLEAR_COLOR6       (1 << 8)
  201. #define PIPE_CLEAR_COLOR7       (1 << 9)
  202. /** Combined flags */
  203. /** All color buffers currently bound */
  204. #define PIPE_CLEAR_COLOR        (PIPE_CLEAR_COLOR0 | PIPE_CLEAR_COLOR1 | \
  205.                                  PIPE_CLEAR_COLOR2 | PIPE_CLEAR_COLOR3 | \
  206.                                  PIPE_CLEAR_COLOR4 | PIPE_CLEAR_COLOR5 | \
  207.                                  PIPE_CLEAR_COLOR6 | PIPE_CLEAR_COLOR7)
  208. #define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
  209.  
  210. /**
  211.  * Transfer object usage flags
  212.  */
  213. enum pipe_transfer_usage
  214. {
  215.    /**
  216.     * Resource contents read back (or accessed directly) at transfer
  217.     * create time.
  218.     */
  219.    PIPE_TRANSFER_READ = (1 << 0),
  220.    
  221.    /**
  222.     * Resource contents will be written back at transfer_unmap
  223.     * time (or modified as a result of being accessed directly).
  224.     */
  225.    PIPE_TRANSFER_WRITE = (1 << 1),
  226.  
  227.    /**
  228.     * Read/modify/write
  229.     */
  230.    PIPE_TRANSFER_READ_WRITE = PIPE_TRANSFER_READ | PIPE_TRANSFER_WRITE,
  231.  
  232.    /**
  233.     * The transfer should map the texture storage directly. The driver may
  234.     * return NULL if that isn't possible, and the state tracker needs to cope
  235.     * with that and use an alternative path without this flag.
  236.     *
  237.     * E.g. the state tracker could have a simpler path which maps textures and
  238.     * does read/modify/write cycles on them directly, and a more complicated
  239.     * path which uses minimal read and write transfers.
  240.     */
  241.    PIPE_TRANSFER_MAP_DIRECTLY = (1 << 2),
  242.  
  243.    /**
  244.     * Discards the memory within the mapped region.
  245.     *
  246.     * It should not be used with PIPE_TRANSFER_READ.
  247.     *
  248.     * See also:
  249.     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_RANGE_BIT flag.
  250.     */
  251.    PIPE_TRANSFER_DISCARD_RANGE = (1 << 8),
  252.  
  253.    /**
  254.     * Fail if the resource cannot be mapped immediately.
  255.     *
  256.     * See also:
  257.     * - Direct3D's D3DLOCK_DONOTWAIT flag.
  258.     * - Mesa3D's MESA_MAP_NOWAIT_BIT flag.
  259.     * - WDDM's D3DDDICB_LOCKFLAGS.DonotWait flag.
  260.     */
  261.    PIPE_TRANSFER_DONTBLOCK = (1 << 9),
  262.  
  263.    /**
  264.     * Do not attempt to synchronize pending operations on the resource when mapping.
  265.     *
  266.     * It should not be used with PIPE_TRANSFER_READ.
  267.     *
  268.     * See also:
  269.     * - OpenGL's ARB_map_buffer_range extension, MAP_UNSYNCHRONIZED_BIT flag.
  270.     * - Direct3D's D3DLOCK_NOOVERWRITE flag.
  271.     * - WDDM's D3DDDICB_LOCKFLAGS.IgnoreSync flag.
  272.     */
  273.    PIPE_TRANSFER_UNSYNCHRONIZED = (1 << 10),
  274.  
  275.    /**
  276.     * Written ranges will be notified later with
  277.     * pipe_context::transfer_flush_region.
  278.     *
  279.     * It should not be used with PIPE_TRANSFER_READ.
  280.     *
  281.     * See also:
  282.     * - pipe_context::transfer_flush_region
  283.     * - OpenGL's ARB_map_buffer_range extension, MAP_FLUSH_EXPLICIT_BIT flag.
  284.     */
  285.    PIPE_TRANSFER_FLUSH_EXPLICIT = (1 << 11),
  286.  
  287.    /**
  288.     * Discards all memory backing the resource.
  289.     *
  290.     * It should not be used with PIPE_TRANSFER_READ.
  291.     *
  292.     * This is equivalent to:
  293.     * - OpenGL's ARB_map_buffer_range extension, MAP_INVALIDATE_BUFFER_BIT
  294.     * - BufferData(NULL) on a GL buffer
  295.     * - Direct3D's D3DLOCK_DISCARD flag.
  296.     * - WDDM's D3DDDICB_LOCKFLAGS.Discard flag.
  297.     * - D3D10 DDI's D3D10_DDI_MAP_WRITE_DISCARD flag
  298.     * - D3D10's D3D10_MAP_WRITE_DISCARD flag.
  299.     */
  300.    PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE = (1 << 12),
  301.  
  302.    /**
  303.     * Allows the resource to be used for rendering while mapped.
  304.     *
  305.     * PIPE_RESOURCE_FLAG_MAP_PERSISTENT must be set when creating
  306.     * the resource.
  307.     *
  308.     * If COHERENT is not set, memory_barrier(PIPE_BARRIER_MAPPED_BUFFER)
  309.     * must be called to ensure the device can see what the CPU has written.
  310.     */
  311.    PIPE_TRANSFER_PERSISTENT = (1 << 13),
  312.  
  313.    /**
  314.     * If PERSISTENT is set, this ensures any writes done by the device are
  315.     * immediately visible to the CPU and vice versa.
  316.     *
  317.     * PIPE_RESOURCE_FLAG_MAP_COHERENT must be set when creating
  318.     * the resource.
  319.     */
  320.    PIPE_TRANSFER_COHERENT = (1 << 14)
  321. };
  322.  
  323. /**
  324.  * Flags for the flush function.
  325.  */
  326. enum pipe_flush_flags
  327. {
  328.    PIPE_FLUSH_END_OF_FRAME = (1 << 0)
  329. };
  330.  
  331. /**
  332.  * Flags for pipe_context::memory_barrier.
  333.  */
  334. #define PIPE_BARRIER_MAPPED_BUFFER     (1 << 0)
  335.  
  336. /**
  337.  * Resource binding flags -- state tracker must specify in advance all
  338.  * the ways a resource might be used.
  339.  */
  340. #define PIPE_BIND_DEPTH_STENCIL        (1 << 0) /* create_surface */
  341. #define PIPE_BIND_RENDER_TARGET        (1 << 1) /* create_surface */
  342. #define PIPE_BIND_BLENDABLE            (1 << 2) /* create_surface */
  343. #define PIPE_BIND_SAMPLER_VIEW         (1 << 3) /* create_sampler_view */
  344. #define PIPE_BIND_VERTEX_BUFFER        (1 << 4) /* set_vertex_buffers */
  345. #define PIPE_BIND_INDEX_BUFFER         (1 << 5) /* draw_elements */
  346. #define PIPE_BIND_CONSTANT_BUFFER      (1 << 6) /* set_constant_buffer */
  347. #define PIPE_BIND_DISPLAY_TARGET       (1 << 7) /* flush_front_buffer */
  348. #define PIPE_BIND_TRANSFER_WRITE       (1 << 8) /* transfer_map */
  349. #define PIPE_BIND_TRANSFER_READ        (1 << 9) /* transfer_map */
  350. #define PIPE_BIND_STREAM_OUTPUT        (1 << 10) /* set_stream_output_buffers */
  351. #define PIPE_BIND_CURSOR               (1 << 11) /* mouse cursor */
  352. #define PIPE_BIND_CUSTOM               (1 << 12) /* state-tracker/winsys usages */
  353. #define PIPE_BIND_GLOBAL               (1 << 13) /* set_global_binding */
  354. #define PIPE_BIND_SHADER_RESOURCE      (1 << 14) /* set_shader_resources */
  355. #define PIPE_BIND_COMPUTE_RESOURCE     (1 << 15) /* set_compute_resources */
  356. #define PIPE_BIND_COMMAND_ARGS_BUFFER  (1 << 16) /* pipe_draw_info.indirect */
  357.  
  358. /**
  359.  * The first two flags above were previously part of the amorphous
  360.  * TEXTURE_USAGE, most of which are now descriptions of the ways a
  361.  * particular texture can be bound to the gallium pipeline.  The two flags
  362.  * below do not fit within that and probably need to be migrated to some
  363.  * other place.
  364.  *
  365.  * It seems like scanout is used by the Xorg state tracker to ask for
  366.  * a texture suitable for actual scanout (hence the name), which
  367.  * implies extra layout constraints on some hardware.  It may also
  368.  * have some special meaning regarding mouse cursor images.
  369.  *
  370.  * The shared flag is quite underspecified, but certainly isn't a
  371.  * binding flag - it seems more like a message to the winsys to create
  372.  * a shareable allocation.
  373.  *
  374.  * The third flag has been added to be able to force textures to be created
  375.  * in linear mode (no tiling).
  376.  */
  377. #define PIPE_BIND_SCANOUT     (1 << 17) /*  */
  378. #define PIPE_BIND_SHARED      (1 << 18) /* get_texture_handle ??? */
  379. #define PIPE_BIND_LINEAR      (1 << 19)
  380.  
  381.  
  382. /**
  383.  * Flags for the driver about resource behaviour:
  384.  */
  385. #define PIPE_RESOURCE_FLAG_MAP_PERSISTENT (1 << 0)
  386. #define PIPE_RESOURCE_FLAG_MAP_COHERENT   (1 << 1)
  387. #define PIPE_RESOURCE_FLAG_DRV_PRIV    (1 << 16) /* driver/winsys private */
  388. #define PIPE_RESOURCE_FLAG_ST_PRIV     (1 << 24) /* state-tracker/winsys private */
  389.  
  390. /**
  391.  * Hint about the expected lifecycle of a resource.
  392.  * Sorted according to GPU vs CPU access.
  393.  */
  394. #define PIPE_USAGE_DEFAULT        0 /* fast GPU access */
  395. #define PIPE_USAGE_IMMUTABLE      1 /* fast GPU access, immutable */
  396. #define PIPE_USAGE_DYNAMIC        2 /* uploaded data is used multiple times */
  397. #define PIPE_USAGE_STREAM         3 /* uploaded data is used once */
  398. #define PIPE_USAGE_STAGING        4 /* fast CPU access */
  399.  
  400.  
  401. /**
  402.  * Shaders
  403.  */
  404. #define PIPE_SHADER_VERTEX   0
  405. #define PIPE_SHADER_FRAGMENT 1
  406. #define PIPE_SHADER_GEOMETRY 2
  407. #define PIPE_SHADER_TESS_CTRL 3
  408. #define PIPE_SHADER_TESS_EVAL 4
  409. #define PIPE_SHADER_COMPUTE  5
  410. #define PIPE_SHADER_TYPES    6
  411.  
  412.  
  413. /**
  414.  * Primitive types:
  415.  */
  416. #define PIPE_PRIM_POINTS                    0
  417. #define PIPE_PRIM_LINES                     1
  418. #define PIPE_PRIM_LINE_LOOP                 2
  419. #define PIPE_PRIM_LINE_STRIP                3
  420. #define PIPE_PRIM_TRIANGLES                 4
  421. #define PIPE_PRIM_TRIANGLE_STRIP            5
  422. #define PIPE_PRIM_TRIANGLE_FAN              6
  423. #define PIPE_PRIM_QUADS                     7
  424. #define PIPE_PRIM_QUAD_STRIP                8
  425. #define PIPE_PRIM_POLYGON                   9
  426. #define PIPE_PRIM_LINES_ADJACENCY          10
  427. #define PIPE_PRIM_LINE_STRIP_ADJACENCY     11
  428. #define PIPE_PRIM_TRIANGLES_ADJACENCY      12
  429. #define PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY 13
  430. #define PIPE_PRIM_PATCHES                  14
  431. #define PIPE_PRIM_MAX                      15
  432.  
  433.  
  434. /**
  435.  * Tessellator spacing types
  436.  */
  437. #define PIPE_TESS_SPACING_FRACTIONAL_ODD    0
  438. #define PIPE_TESS_SPACING_FRACTIONAL_EVEN   1
  439. #define PIPE_TESS_SPACING_EQUAL             2
  440.  
  441. /**
  442.  * Query object types
  443.  */
  444. #define PIPE_QUERY_OCCLUSION_COUNTER     0
  445. #define PIPE_QUERY_OCCLUSION_PREDICATE   1
  446. #define PIPE_QUERY_TIMESTAMP             2
  447. #define PIPE_QUERY_TIMESTAMP_DISJOINT    3
  448. #define PIPE_QUERY_TIME_ELAPSED          4
  449. #define PIPE_QUERY_PRIMITIVES_GENERATED  5
  450. #define PIPE_QUERY_PRIMITIVES_EMITTED    6
  451. #define PIPE_QUERY_SO_STATISTICS         7
  452. #define PIPE_QUERY_SO_OVERFLOW_PREDICATE 8
  453. #define PIPE_QUERY_GPU_FINISHED          9
  454. #define PIPE_QUERY_PIPELINE_STATISTICS  10
  455. #define PIPE_QUERY_TYPES                11
  456. /* start of driver queries, see pipe_screen::get_driver_query_info */
  457. #define PIPE_QUERY_DRIVER_SPECIFIC     256
  458.  
  459.  
  460. /**
  461.  * Conditional rendering modes
  462.  */
  463. #define PIPE_RENDER_COND_WAIT              0
  464. #define PIPE_RENDER_COND_NO_WAIT           1
  465. #define PIPE_RENDER_COND_BY_REGION_WAIT    2
  466. #define PIPE_RENDER_COND_BY_REGION_NO_WAIT 3
  467.  
  468.  
  469. /**
  470.  * Point sprite coord modes
  471.  */
  472. #define PIPE_SPRITE_COORD_UPPER_LEFT 0
  473. #define PIPE_SPRITE_COORD_LOWER_LEFT 1
  474.  
  475.  
  476. /**
  477.  * Texture swizzles
  478.  */
  479. #define PIPE_SWIZZLE_RED   0
  480. #define PIPE_SWIZZLE_GREEN 1
  481. #define PIPE_SWIZZLE_BLUE  2
  482. #define PIPE_SWIZZLE_ALPHA 3
  483. #define PIPE_SWIZZLE_ZERO  4
  484. #define PIPE_SWIZZLE_ONE   5
  485.  
  486.  
  487. #define PIPE_TIMEOUT_INFINITE 0xffffffffffffffffull
  488.  
  489.  
  490. /**
  491.  * Device reset status.
  492.  */
  493. enum pipe_reset_status
  494. {
  495.    PIPE_NO_RESET = 0,
  496.    PIPE_GUILTY_CONTEXT_RESET = 1,
  497.    PIPE_INNOCENT_CONTEXT_RESET = 2,
  498.    PIPE_UNKNOWN_CONTEXT_RESET = 3
  499. };
  500.  
  501.  
  502. /**
  503.  * Implementation capabilities/limits which are queried through
  504.  * pipe_screen::get_param()
  505.  */
  506. enum pipe_cap
  507. {
  508.    PIPE_CAP_NPOT_TEXTURES = 1,
  509.    PIPE_CAP_TWO_SIDED_STENCIL = 2,
  510.    PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS = 4,
  511.    PIPE_CAP_ANISOTROPIC_FILTER = 5,
  512.    PIPE_CAP_POINT_SPRITE = 6,
  513.    PIPE_CAP_MAX_RENDER_TARGETS = 7,
  514.    PIPE_CAP_OCCLUSION_QUERY = 8,
  515.    PIPE_CAP_QUERY_TIME_ELAPSED = 9,
  516.    PIPE_CAP_TEXTURE_SHADOW_MAP = 10,
  517.    PIPE_CAP_TEXTURE_SWIZZLE = 11,
  518.    PIPE_CAP_MAX_TEXTURE_2D_LEVELS = 12,
  519.    PIPE_CAP_MAX_TEXTURE_3D_LEVELS = 13,
  520.    PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS = 14,
  521.    PIPE_CAP_TEXTURE_MIRROR_CLAMP = 25,
  522.    PIPE_CAP_BLEND_EQUATION_SEPARATE = 28,
  523.    PIPE_CAP_SM3 = 29,  /*< Shader Model, supported */
  524.    PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS = 30,
  525.    PIPE_CAP_PRIMITIVE_RESTART = 31,
  526.    /** blend enables and write masks per rendertarget */
  527.    PIPE_CAP_INDEP_BLEND_ENABLE = 33,
  528.    /** different blend funcs per rendertarget */
  529.    PIPE_CAP_INDEP_BLEND_FUNC = 34,
  530.    PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS = 36,
  531.    PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT = 37,
  532.    PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT = 38,
  533.    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER = 39,
  534.    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER = 40,
  535.    PIPE_CAP_DEPTH_CLIP_DISABLE = 41,
  536.    PIPE_CAP_SHADER_STENCIL_EXPORT = 42,
  537.    PIPE_CAP_TGSI_INSTANCEID = 43,
  538.    PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR = 44,
  539.    PIPE_CAP_FRAGMENT_COLOR_CLAMPED = 45,
  540.    PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46,
  541.    PIPE_CAP_SEAMLESS_CUBE_MAP = 47,
  542.    PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE = 48,
  543.    PIPE_CAP_MIN_TEXEL_OFFSET = 50,
  544.    PIPE_CAP_MAX_TEXEL_OFFSET = 51,
  545.    PIPE_CAP_CONDITIONAL_RENDER = 52,
  546.    PIPE_CAP_TEXTURE_BARRIER = 53,
  547.    PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS = 55,
  548.    PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS = 56,
  549.    PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME = 57,
  550.    PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS = 59, /* temporary */
  551.    PIPE_CAP_VERTEX_COLOR_UNCLAMPED = 60,
  552.    PIPE_CAP_VERTEX_COLOR_CLAMPED = 61,
  553.    PIPE_CAP_GLSL_FEATURE_LEVEL = 62,
  554.    PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 63,
  555.    PIPE_CAP_USER_VERTEX_BUFFERS = 64,
  556.    PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY = 65,
  557.    PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY = 66,
  558.    PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY = 67,
  559.    PIPE_CAP_COMPUTE = 68,
  560.    PIPE_CAP_USER_INDEX_BUFFERS = 69,
  561.    PIPE_CAP_USER_CONSTANT_BUFFERS = 70,
  562.    PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 71,
  563.    PIPE_CAP_START_INSTANCE = 72,
  564.    PIPE_CAP_QUERY_TIMESTAMP = 73,
  565.    PIPE_CAP_TEXTURE_MULTISAMPLE = 74,
  566.    PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT = 75,
  567.    PIPE_CAP_CUBE_MAP_ARRAY = 76,
  568.    PIPE_CAP_TEXTURE_BUFFER_OBJECTS = 77,
  569.    PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 78,
  570.    PIPE_CAP_TGSI_TEXCOORD = 79,
  571.    PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER = 80,
  572.    PIPE_CAP_QUERY_PIPELINE_STATISTICS = 81,
  573.    PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK = 82,
  574.    PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE = 83,
  575.    PIPE_CAP_MAX_VIEWPORTS = 84,
  576.    PIPE_CAP_ENDIANNESS = 85,
  577.    PIPE_CAP_MIXED_FRAMEBUFFER_SIZES = 86,
  578.    PIPE_CAP_TGSI_VS_LAYER_VIEWPORT = 87,
  579.    PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES = 88,
  580.    PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 89,
  581.    PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS = 90,
  582.    PIPE_CAP_TEXTURE_GATHER_SM5 = 91,
  583.    PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT = 92,
  584.    PIPE_CAP_FAKE_SW_MSAA = 93,
  585.    PIPE_CAP_TEXTURE_QUERY_LOD = 94,
  586.    PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET = 95,
  587.    PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET = 96,
  588.    PIPE_CAP_SAMPLE_SHADING = 97,
  589.    PIPE_CAP_TEXTURE_GATHER_OFFSETS = 98,
  590.    PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION = 99,
  591.    PIPE_CAP_MAX_VERTEX_STREAMS = 100,
  592.    PIPE_CAP_DRAW_INDIRECT = 101,
  593.    PIPE_CAP_TGSI_FS_FINE_DERIVATIVE = 102,
  594.    PIPE_CAP_VENDOR_ID = 103,
  595.    PIPE_CAP_DEVICE_ID = 104,
  596.    PIPE_CAP_ACCELERATED = 105,
  597.    PIPE_CAP_VIDEO_MEMORY = 106,
  598.    PIPE_CAP_UMA = 107,
  599.    PIPE_CAP_CONDITIONAL_RENDER_INVERTED = 108,
  600.    PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE = 109,
  601.    PIPE_CAP_SAMPLER_VIEW_TARGET = 110,
  602.    PIPE_CAP_CLIP_HALFZ = 111,
  603.    PIPE_CAP_VERTEXID_NOBASE = 112,
  604.    PIPE_CAP_POLYGON_OFFSET_CLAMP = 113,
  605.    PIPE_CAP_MULTISAMPLE_Z_RESOLVE = 114,
  606.    PIPE_CAP_RESOURCE_FROM_USER_MEMORY = 115,
  607.    PIPE_CAP_DEVICE_RESET_STATUS_QUERY = 116,
  608. };
  609.  
  610. #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
  611. #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600 (1 << 1)
  612.  
  613. enum pipe_endian
  614. {
  615.    PIPE_ENDIAN_LITTLE = 0,
  616.    PIPE_ENDIAN_BIG = 1,
  617. #if defined(PIPE_ARCH_LITTLE_ENDIAN)
  618.    PIPE_ENDIAN_NATIVE = PIPE_ENDIAN_LITTLE
  619. #elif defined(PIPE_ARCH_BIG_ENDIAN)
  620.    PIPE_ENDIAN_NATIVE = PIPE_ENDIAN_BIG
  621. #endif
  622. };
  623.  
  624. /**
  625.  * Implementation limits which are queried through
  626.  * pipe_screen::get_paramf()
  627.  */
  628. enum pipe_capf
  629. {
  630.    PIPE_CAPF_MAX_LINE_WIDTH,
  631.    PIPE_CAPF_MAX_LINE_WIDTH_AA,
  632.    PIPE_CAPF_MAX_POINT_WIDTH,
  633.    PIPE_CAPF_MAX_POINT_WIDTH_AA,
  634.    PIPE_CAPF_MAX_TEXTURE_ANISOTROPY,
  635.    PIPE_CAPF_MAX_TEXTURE_LOD_BIAS,
  636.    PIPE_CAPF_GUARD_BAND_LEFT,
  637.    PIPE_CAPF_GUARD_BAND_TOP,
  638.    PIPE_CAPF_GUARD_BAND_RIGHT,
  639.    PIPE_CAPF_GUARD_BAND_BOTTOM
  640. };
  641.  
  642. /** Shader caps not specific to any single stage */
  643. enum pipe_shader_cap
  644. {
  645.    PIPE_SHADER_CAP_MAX_INSTRUCTIONS, /* if 0, it means the stage is unsupported */
  646.    PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS,
  647.    PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS,
  648.    PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS,
  649.    PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH,
  650.    PIPE_SHADER_CAP_MAX_INPUTS,
  651.    PIPE_SHADER_CAP_MAX_OUTPUTS,
  652.    PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE,
  653.    PIPE_SHADER_CAP_MAX_CONST_BUFFERS,
  654.    PIPE_SHADER_CAP_MAX_TEMPS,
  655.    PIPE_SHADER_CAP_MAX_PREDS,
  656.    /* boolean caps */
  657.    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED,
  658.    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR,
  659.    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR,
  660.    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR,
  661.    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR,
  662.    PIPE_SHADER_CAP_SUBROUTINES, /* BGNSUB, ENDSUB, CAL, RET */
  663.    PIPE_SHADER_CAP_INTEGERS,
  664.    PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS,
  665.    PIPE_SHADER_CAP_PREFERRED_IR,
  666.    PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED,
  667.    PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS,
  668.    PIPE_SHADER_CAP_DOUBLES,
  669.    PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED, /* all rounding modes */
  670.    PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED,
  671.    PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED,
  672. };
  673.  
  674. /**
  675.  * Shader intermediate representation.
  676.  */
  677. enum pipe_shader_ir
  678. {
  679.    PIPE_SHADER_IR_TGSI,
  680.    PIPE_SHADER_IR_LLVM,
  681.    PIPE_SHADER_IR_NATIVE
  682. };
  683.  
  684. /**
  685.  * Compute-specific implementation capability.  They can be queried
  686.  * using pipe_screen::get_compute_param.
  687.  */
  688. enum pipe_compute_cap
  689. {
  690.    PIPE_COMPUTE_CAP_IR_TARGET,
  691.    PIPE_COMPUTE_CAP_GRID_DIMENSION,
  692.    PIPE_COMPUTE_CAP_MAX_GRID_SIZE,
  693.    PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE,
  694.    PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
  695.    PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE,
  696.    PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
  697.    PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE,
  698.    PIPE_COMPUTE_CAP_MAX_INPUT_SIZE,
  699.    PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
  700.    PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY,
  701.    PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS,
  702.    PIPE_COMPUTE_CAP_IMAGES_SUPPORTED
  703. };
  704.  
  705. /**
  706.  * Composite query types
  707.  */
  708.  
  709. /**
  710.  * Query result for PIPE_QUERY_SO_STATISTICS.
  711.  */
  712. struct pipe_query_data_so_statistics
  713. {
  714.    uint64_t num_primitives_written;
  715.    uint64_t primitives_storage_needed;
  716. };
  717.  
  718. /**
  719.  * Query result for PIPE_QUERY_TIMESTAMP_DISJOINT.
  720.  */
  721. struct pipe_query_data_timestamp_disjoint
  722. {
  723.    uint64_t frequency;
  724.    boolean  disjoint;
  725. };
  726.  
  727. /**
  728.  * Query result for PIPE_QUERY_PIPELINE_STATISTICS.
  729.  */
  730. struct pipe_query_data_pipeline_statistics
  731. {
  732.    uint64_t ia_vertices;    /**< Num vertices read by the vertex fetcher. */
  733.    uint64_t ia_primitives;  /**< Num primitives read by the vertex fetcher. */
  734.    uint64_t vs_invocations; /**< Num vertex shader invocations. */
  735.    uint64_t gs_invocations; /**< Num geometry shader invocations. */
  736.    uint64_t gs_primitives;  /**< Num primitives output by a geometry shader. */
  737.    uint64_t c_invocations;  /**< Num primitives sent to the rasterizer. */
  738.    uint64_t c_primitives;   /**< Num primitives that were rendered. */
  739.    uint64_t ps_invocations; /**< Num pixel shader invocations. */
  740.    uint64_t hs_invocations; /**< Num hull shader invocations. */
  741.    uint64_t ds_invocations; /**< Num domain shader invocations. */
  742.    uint64_t cs_invocations; /**< Num compute shader invocations. */
  743. };
  744.  
  745. /**
  746.  * Query result (returned by pipe_context::get_query_result).
  747.  */
  748. union pipe_query_result
  749. {
  750.    /* PIPE_QUERY_OCCLUSION_PREDICATE */
  751.    /* PIPE_QUERY_SO_OVERFLOW_PREDICATE */
  752.    /* PIPE_QUERY_GPU_FINISHED */
  753.    boolean b;
  754.  
  755.    /* PIPE_QUERY_OCCLUSION_COUNTER */
  756.    /* PIPE_QUERY_TIMESTAMP */
  757.    /* PIPE_QUERY_TIME_ELAPSED */
  758.    /* PIPE_QUERY_PRIMITIVES_GENERATED */
  759.    /* PIPE_QUERY_PRIMITIVES_EMITTED */
  760.    /* PIPE_DRIVER_QUERY_TYPE_UINT64 */
  761.    uint64_t u64;
  762.  
  763.    /* PIPE_DRIVER_QUERY_TYPE_UINT */
  764.    uint32_t u32;
  765.  
  766.    /* PIPE_DRIVER_QUERY_TYPE_FLOAT */
  767.    /* PIPE_DRIVER_QUERY_TYPE_PERCENTAGE */
  768.    float f;
  769.  
  770.    /* PIPE_QUERY_SO_STATISTICS */
  771.    struct pipe_query_data_so_statistics so_statistics;
  772.  
  773.    /* PIPE_QUERY_TIMESTAMP_DISJOINT */
  774.    struct pipe_query_data_timestamp_disjoint timestamp_disjoint;
  775.  
  776.    /* PIPE_QUERY_PIPELINE_STATISTICS */
  777.    struct pipe_query_data_pipeline_statistics pipeline_statistics;
  778. };
  779.  
  780. union pipe_color_union
  781. {
  782.    float f[4];
  783.    int i[4];
  784.    unsigned int ui[4];
  785. };
  786.  
  787. enum pipe_driver_query_type
  788. {
  789.    PIPE_DRIVER_QUERY_TYPE_UINT64     = 0,
  790.    PIPE_DRIVER_QUERY_TYPE_UINT       = 1,
  791.    PIPE_DRIVER_QUERY_TYPE_FLOAT      = 2,
  792.    PIPE_DRIVER_QUERY_TYPE_PERCENTAGE = 3,
  793.    PIPE_DRIVER_QUERY_TYPE_BYTES      = 4,
  794. };
  795.  
  796. enum pipe_driver_query_group_type
  797. {
  798.    PIPE_DRIVER_QUERY_GROUP_TYPE_CPU = 0,
  799.    PIPE_DRIVER_QUERY_GROUP_TYPE_GPU = 1,
  800. };
  801.  
  802. union pipe_numeric_type_union
  803. {
  804.    uint64_t u64;
  805.    uint32_t u32;
  806.    float f;
  807. };
  808.  
  809. struct pipe_driver_query_info
  810. {
  811.    const char *name;
  812.    unsigned query_type; /* PIPE_QUERY_DRIVER_SPECIFIC + i */
  813.    union pipe_numeric_type_union max_value; /* max value that can be returned */
  814.    enum pipe_driver_query_type type;
  815.    unsigned group_id;
  816. };
  817.  
  818. struct pipe_driver_query_group_info
  819. {
  820.    const char *name;
  821.    enum pipe_driver_query_group_type type;
  822.    unsigned max_active_queries;
  823.    unsigned num_queries;
  824. };
  825.  
  826. #ifdef __cplusplus
  827. }
  828. #endif
  829.  
  830. #endif
  831.