Home | History | Annotate | Download | only in pipe
      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 
     29 /**
     30  * @file
     31  *
     32  * Abstract graphics pipe state objects.
     33  *
     34  * Basic notes:
     35  *   1. Want compact representations, so we use bitfields.
     36  *   2. Put bitfields before other (GLfloat) fields.
     37  */
     38 
     39 
     40 #ifndef PIPE_STATE_H
     41 #define PIPE_STATE_H
     42 
     43 #include "p_compiler.h"
     44 #include "p_defines.h"
     45 #include "p_format.h"
     46 
     47 
     48 #ifdef __cplusplus
     49 extern "C" {
     50 #endif
     51 
     52 
     53 /**
     54  * Implementation limits
     55  */
     56 #define PIPE_MAX_ATTRIBS          32
     57 #define PIPE_MAX_CLIP_PLANES       8
     58 #define PIPE_MAX_COLOR_BUFS        8
     59 #define PIPE_MAX_CONSTANT_BUFFERS 32
     60 #define PIPE_MAX_SAMPLERS         16
     61 #define PIPE_MAX_SHADER_INPUTS    32
     62 #define PIPE_MAX_SHADER_OUTPUTS   48 /* 32 GENERICs + POS, PSIZE, FOG, etc. */
     63 #define PIPE_MAX_SHADER_SAMPLER_VIEWS 32
     64 #define PIPE_MAX_SHADER_BUFFERS   32
     65 #define PIPE_MAX_SHADER_IMAGES    32
     66 #define PIPE_MAX_TEXTURE_LEVELS   16
     67 #define PIPE_MAX_SO_BUFFERS        4
     68 #define PIPE_MAX_SO_OUTPUTS       64
     69 #define PIPE_MAX_VIEWPORTS        16
     70 #define PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT 8
     71 #define PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 2
     72 
     73 
     74 struct pipe_reference
     75 {
     76    int32_t count; /* atomic */
     77 };
     78 
     79 
     80 
     81 /**
     82  * Primitive (point/line/tri) rasterization info
     83  */
     84 struct pipe_rasterizer_state
     85 {
     86    unsigned flatshade:1;
     87    unsigned light_twoside:1;
     88    unsigned clamp_vertex_color:1;
     89    unsigned clamp_fragment_color:1;
     90    unsigned front_ccw:1;
     91    unsigned cull_face:2;      /**< PIPE_FACE_x */
     92    unsigned fill_front:2;     /**< PIPE_POLYGON_MODE_x */
     93    unsigned fill_back:2;      /**< PIPE_POLYGON_MODE_x */
     94    unsigned offset_point:1;
     95    unsigned offset_line:1;
     96    unsigned offset_tri:1;
     97    unsigned scissor:1;
     98    unsigned poly_smooth:1;
     99    unsigned poly_stipple_enable:1;
    100    unsigned point_smooth:1;
    101    unsigned sprite_coord_mode:1;     /**< PIPE_SPRITE_COORD_ */
    102    unsigned point_quad_rasterization:1; /** points rasterized as quads or points */
    103    unsigned point_tri_clip:1; /** large points clipped as tris or points */
    104    unsigned point_size_per_vertex:1; /**< size computed in vertex shader */
    105    unsigned multisample:1;         /* XXX maybe more ms state in future */
    106    unsigned force_persample_interp:1;
    107    unsigned line_smooth:1;
    108    unsigned line_stipple_enable:1;
    109    unsigned line_last_pixel:1;
    110 
    111    /**
    112     * Use the first vertex of a primitive as the provoking vertex for
    113     * flat shading.
    114     */
    115    unsigned flatshade_first:1;
    116 
    117    unsigned half_pixel_center:1;
    118    unsigned bottom_edge_rule:1;
    119 
    120    /**
    121     * When true, rasterization is disabled and no pixels are written.
    122     * This only makes sense with the Stream Out functionality.
    123     */
    124    unsigned rasterizer_discard:1;
    125 
    126    /**
    127     * When false, depth clipping is disabled and the depth value will be
    128     * clamped later at the per-pixel level before depth testing.
    129     * This depends on PIPE_CAP_DEPTH_CLIP_DISABLE.
    130     */
    131    unsigned depth_clip:1;
    132 
    133    /**
    134     * When true clip space in the z axis goes from [0..1] (D3D).  When false
    135     * [-1, 1] (GL).
    136     *
    137     * NOTE: D3D will always use depth clamping.
    138     */
    139    unsigned clip_halfz:1;
    140 
    141    /**
    142     * Enable bits for clipping half-spaces.
    143     * This applies to both user clip planes and shader clip distances.
    144     * Note that if the bound shader exports any clip distances, these
    145     * replace all user clip planes, and clip half-spaces enabled here
    146     * but not written by the shader count as disabled.
    147     */
    148    unsigned clip_plane_enable:PIPE_MAX_CLIP_PLANES;
    149 
    150    unsigned line_stipple_factor:8;  /**< [1..256] actually */
    151    unsigned line_stipple_pattern:16;
    152 
    153    uint32_t sprite_coord_enable; /* referring to 32 TEXCOORD/GENERIC inputs */
    154 
    155    float line_width;
    156    float point_size;           /**< used when no per-vertex size */
    157    float offset_units;
    158    float offset_scale;
    159    float offset_clamp;
    160 };
    161 
    162 
    163 struct pipe_poly_stipple
    164 {
    165    unsigned stipple[32];
    166 };
    167 
    168 
    169 struct pipe_viewport_state
    170 {
    171    float scale[3];
    172    float translate[3];
    173 };
    174 
    175 
    176 struct pipe_scissor_state
    177 {
    178    unsigned minx:16;
    179    unsigned miny:16;
    180    unsigned maxx:16;
    181    unsigned maxy:16;
    182 };
    183 
    184 
    185 struct pipe_clip_state
    186 {
    187    float ucp[PIPE_MAX_CLIP_PLANES][4];
    188 };
    189 
    190 
    191 /**
    192  * Stream output for vertex transform feedback.
    193  */
    194 struct pipe_stream_output_info
    195 {
    196    unsigned num_outputs;
    197    /** stride for an entire vertex for each buffer in dwords */
    198    unsigned stride[PIPE_MAX_SO_BUFFERS];
    199 
    200    /**
    201     * Array of stream outputs, in the order they are to be written in.
    202     * Selected components are tightly packed into the output buffer.
    203     */
    204    struct {
    205       unsigned register_index:8;  /**< 0 to PIPE_MAX_SHADER_OUTPUTS */
    206       unsigned start_component:2; /** 0 to 3 */
    207       unsigned num_components:3;  /** 1 to 4 */
    208       unsigned output_buffer:3;   /**< 0 to PIPE_MAX_SO_BUFFERS */
    209       unsigned dst_offset:16;     /**< offset into the buffer in dwords */
    210       unsigned stream:2;
    211    } output[PIPE_MAX_SO_OUTPUTS];
    212 };
    213 
    214 
    215 struct pipe_shader_state
    216 {
    217    const struct tgsi_token *tokens;
    218    struct pipe_stream_output_info stream_output;
    219 };
    220 
    221 
    222 struct pipe_depth_state
    223 {
    224    unsigned enabled:1;         /**< depth test enabled? */
    225    unsigned writemask:1;       /**< allow depth buffer writes? */
    226    unsigned func:3;            /**< depth test func (PIPE_FUNC_x) */
    227 };
    228 
    229 
    230 struct pipe_stencil_state
    231 {
    232    unsigned enabled:1;  /**< stencil[0]: stencil enabled, stencil[1]: two-side enabled */
    233    unsigned func:3;     /**< PIPE_FUNC_x */
    234    unsigned fail_op:3;  /**< PIPE_STENCIL_OP_x */
    235    unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
    236    unsigned zfail_op:3; /**< PIPE_STENCIL_OP_x */
    237    unsigned valuemask:8;
    238    unsigned writemask:8;
    239 };
    240 
    241 
    242 struct pipe_alpha_state
    243 {
    244    unsigned enabled:1;
    245    unsigned func:3;     /**< PIPE_FUNC_x */
    246    float ref_value;     /**< reference value */
    247 };
    248 
    249 
    250 struct pipe_depth_stencil_alpha_state
    251 {
    252    struct pipe_depth_state depth;
    253    struct pipe_stencil_state stencil[2]; /**< [0] = front, [1] = back */
    254    struct pipe_alpha_state alpha;
    255 };
    256 
    257 
    258 struct pipe_rt_blend_state
    259 {
    260    unsigned blend_enable:1;
    261 
    262    unsigned rgb_func:3;          /**< PIPE_BLEND_x */
    263    unsigned rgb_src_factor:5;    /**< PIPE_BLENDFACTOR_x */
    264    unsigned rgb_dst_factor:5;    /**< PIPE_BLENDFACTOR_x */
    265 
    266    unsigned alpha_func:3;        /**< PIPE_BLEND_x */
    267    unsigned alpha_src_factor:5;  /**< PIPE_BLENDFACTOR_x */
    268    unsigned alpha_dst_factor:5;  /**< PIPE_BLENDFACTOR_x */
    269 
    270    unsigned colormask:4;         /**< bitmask of PIPE_MASK_R/G/B/A */
    271 };
    272 
    273 struct pipe_blend_state
    274 {
    275    unsigned independent_blend_enable:1;
    276    unsigned logicop_enable:1;
    277    unsigned logicop_func:4;      /**< PIPE_LOGICOP_x */
    278    unsigned dither:1;
    279    unsigned alpha_to_coverage:1;
    280    unsigned alpha_to_one:1;
    281    struct pipe_rt_blend_state rt[PIPE_MAX_COLOR_BUFS];
    282 };
    283 
    284 
    285 struct pipe_blend_color
    286 {
    287    float color[4];
    288 };
    289 
    290 struct pipe_stencil_ref
    291 {
    292    ubyte ref_value[2];
    293 };
    294 
    295 struct pipe_framebuffer_state
    296 {
    297    unsigned width, height;
    298 
    299    /** multiple color buffers for multiple render targets */
    300    unsigned nr_cbufs;
    301    struct pipe_surface *cbufs[PIPE_MAX_COLOR_BUFS];
    302 
    303    struct pipe_surface *zsbuf;      /**< Z/stencil buffer */
    304 };
    305 
    306 
    307 /**
    308  * Texture sampler state.
    309  */
    310 struct pipe_sampler_state
    311 {
    312    unsigned wrap_s:3;            /**< PIPE_TEX_WRAP_x */
    313    unsigned wrap_t:3;            /**< PIPE_TEX_WRAP_x */
    314    unsigned wrap_r:3;            /**< PIPE_TEX_WRAP_x */
    315    unsigned min_img_filter:2;    /**< PIPE_TEX_FILTER_x */
    316    unsigned min_mip_filter:2;    /**< PIPE_TEX_MIPFILTER_x */
    317    unsigned mag_img_filter:2;    /**< PIPE_TEX_FILTER_x */
    318    unsigned compare_mode:1;      /**< PIPE_TEX_COMPARE_x */
    319    unsigned compare_func:3;      /**< PIPE_FUNC_x */
    320    unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
    321    unsigned max_anisotropy:6;
    322    unsigned seamless_cube_map:1;
    323    float lod_bias;               /**< LOD/lambda bias */
    324    float min_lod, max_lod;       /**< LOD clamp range, after bias */
    325    union pipe_color_union border_color;
    326 };
    327 
    328 
    329 /**
    330  * A view into a texture that can be bound to a color render target /
    331  * depth stencil attachment point.
    332  */
    333 struct pipe_surface
    334 {
    335    struct pipe_reference reference;
    336    struct pipe_resource *texture; /**< resource into which this is a view  */
    337    struct pipe_context *context; /**< context this surface belongs to */
    338    enum pipe_format format;
    339 
    340    /* XXX width/height should be removed */
    341    unsigned width;               /**< logical width in pixels */
    342    unsigned height;              /**< logical height in pixels */
    343 
    344    unsigned writable:1;          /**< writable shader resource */
    345 
    346    union {
    347       struct {
    348          unsigned level;
    349          unsigned first_layer:16;
    350          unsigned last_layer:16;
    351       } tex;
    352       struct {
    353          unsigned first_element;
    354          unsigned last_element;
    355       } buf;
    356    } u;
    357 };
    358 
    359 
    360 /**
    361  * A view into a texture that can be bound to a shader stage.
    362  */
    363 struct pipe_sampler_view
    364 {
    365    struct pipe_reference reference;
    366    enum pipe_format format;      /**< typed PIPE_FORMAT_x */
    367    struct pipe_resource *texture; /**< texture into which this is a view  */
    368    struct pipe_context *context; /**< context this view belongs to */
    369    union {
    370       struct {
    371          unsigned first_layer:16;     /**< first layer to use for array textures */
    372          unsigned last_layer:16;      /**< last layer to use for array textures */
    373          unsigned first_level:8;      /**< first mipmap level to use */
    374          unsigned last_level:8;       /**< last mipmap level to use */
    375       } tex;
    376       struct {
    377          unsigned first_element;
    378          unsigned last_element;
    379       } buf;
    380    } u;
    381    unsigned swizzle_r:3;         /**< PIPE_SWIZZLE_x for red component */
    382    unsigned swizzle_g:3;         /**< PIPE_SWIZZLE_x for green component */
    383    unsigned swizzle_b:3;         /**< PIPE_SWIZZLE_x for blue component */
    384    unsigned swizzle_a:3;         /**< PIPE_SWIZZLE_x for alpha component */
    385 };
    386 
    387 
    388 /**
    389  * Subregion of 1D/2D/3D image resource.
    390  */
    391 struct pipe_box
    392 {
    393    int x;
    394    int y;
    395    int z;
    396    int width;
    397    int height;
    398    int depth;
    399 };
    400 
    401 
    402 /**
    403  * A memory object/resource such as a vertex buffer or texture.
    404  */
    405 struct pipe_resource
    406 {
    407    struct pipe_reference reference;
    408    struct pipe_screen *screen; /**< screen that this texture belongs to */
    409    enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
    410    enum pipe_format format;         /**< PIPE_FORMAT_x */
    411 
    412    unsigned width0;
    413    unsigned height0;
    414    unsigned depth0;
    415    unsigned array_size;
    416 
    417    unsigned last_level:8;    /**< Index of last mipmap level present/defined */
    418    unsigned nr_samples:8;    /**< for multisampled surfaces, nr of samples */
    419    unsigned usage:8;         /**< PIPE_USAGE_x (not a bitmask) */
    420 
    421    unsigned bind;            /**< bitmask of PIPE_BIND_x */
    422    unsigned flags;           /**< bitmask of PIPE_RESOURCE_FLAG_x */
    423 };
    424 
    425 
    426 /**
    427  * Transfer object.  For data transfer to/from a resource.
    428  */
    429 struct pipe_transfer
    430 {
    431    struct pipe_resource *resource; /**< resource to transfer to/from  */
    432    unsigned level;                 /**< texture mipmap level */
    433    enum pipe_transfer_usage usage;
    434    struct pipe_box box;            /**< region of the resource to access */
    435    unsigned stride;                /**< row stride in bytes */
    436    unsigned layer_stride;          /**< image/layer stride in bytes */
    437 };
    438 
    439 
    440 
    441 /**
    442  * A vertex buffer.  Typically, all the vertex data/attributes for
    443  * drawing something will be in one buffer.  But it's also possible, for
    444  * example, to put colors in one buffer and texcoords in another.
    445  */
    446 struct pipe_vertex_buffer
    447 {
    448    unsigned stride;    /**< stride to same attrib in next vertex, in bytes */
    449    unsigned buffer_offset;  /**< offset to start of data in buffer, in bytes */
    450    struct pipe_resource *buffer;  /**< the actual buffer */
    451    const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
    452 };
    453 
    454 
    455 /**
    456  * A constant buffer.  A subrange of an existing buffer can be set
    457  * as a constant buffer.
    458  */
    459 struct pipe_constant_buffer {
    460    struct pipe_resource *buffer; /**< the actual buffer */
    461    unsigned buffer_offset; /**< offset to start of data in buffer, in bytes */
    462    unsigned buffer_size;   /**< how much data can be read in shader */
    463    const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
    464 };
    465 
    466 
    467 /**
    468  * A stream output target. The structure specifies the range vertices can
    469  * be written to.
    470  *
    471  * In addition to that, the structure should internally maintain the offset
    472  * into the buffer, which should be incremented everytime something is written
    473  * (appended) to it. The internal offset is buffer_offset + how many bytes
    474  * have been written. The internal offset can be stored on the device
    475  * and the CPU actually doesn't have to query it.
    476  *
    477  * Note that the buffer_size variable is actually specifying the available
    478  * space in the buffer, not the size of the attached buffer.
    479  * In other words in majority of cases buffer_size would simply be
    480  * 'buffer->width0 - buffer_offset', so buffer_size refers to the size
    481  * of the buffer left, after accounting for buffer offset, for stream output
    482  * to write to.
    483  *
    484  * Use PIPE_QUERY_SO_STATISTICS to know how many primitives have
    485  * actually been written.
    486  */
    487 struct pipe_stream_output_target
    488 {
    489    struct pipe_reference reference;
    490    struct pipe_resource *buffer; /**< the output buffer */
    491    struct pipe_context *context; /**< context this SO target belongs to */
    492 
    493    unsigned buffer_offset;  /**< offset where data should be written, in bytes */
    494    unsigned buffer_size;    /**< how much data is allowed to be written */
    495 };
    496 
    497 
    498 /**
    499  * Information to describe a vertex attribute (position, color, etc)
    500  */
    501 struct pipe_vertex_element
    502 {
    503    /** Offset of this attribute, in bytes, from the start of the vertex */
    504    unsigned src_offset;
    505 
    506    /** Instance data rate divisor. 0 means this is per-vertex data,
    507     *  n means per-instance data used for n consecutive instances (n > 0).
    508     */
    509    unsigned instance_divisor;
    510 
    511    /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
    512     * this attribute live in?
    513     */
    514    unsigned vertex_buffer_index;
    515 
    516    enum pipe_format src_format;
    517 };
    518 
    519 
    520 /**
    521  * An index buffer.  When an index buffer is bound, all indices to vertices
    522  * will be looked up in the buffer.
    523  */
    524 struct pipe_index_buffer
    525 {
    526    unsigned index_size;  /**< size of an index, in bytes */
    527    unsigned offset;  /**< offset to start of data in buffer, in bytes */
    528    struct pipe_resource *buffer; /**< the actual buffer */
    529    const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
    530 };
    531 
    532 struct pipe_draw_indirect_info
    533 {
    534    unsigned offset; /**< must be 4 byte aligned */
    535    unsigned stride; /**< must be 4 byte aligned */
    536    unsigned draw_count; /**< number of indirect draws */
    537    unsigned indirect_draw_count_offset; /**< must be 4 byte aligned */
    538 
    539    /* Indirect draw parameters resource is laid out as follows:
    540     *
    541     * if using indexed drawing:
    542     *  struct {
    543     *     uint32_t count;
    544     *     uint32_t instance_count;
    545     *     uint32_t start;
    546     *     int32_t index_bias;
    547     *     uint32_t start_instance;
    548     *  };
    549     * otherwise:
    550     *  struct {
    551     *     uint32_t count;
    552     *     uint32_t instance_count;
    553     *     uint32_t start;
    554     *     uint32_t start_instance;
    555     *  };
    556     */
    557    struct pipe_resource *buffer;
    558 
    559    /* Indirect draw count resource: If not NULL, contains a 32-bit value which
    560     * is to be used as the real draw_count.
    561     */
    562    struct pipe_resource *indirect_draw_count;
    563 };
    564 
    565 /**
    566  * Information to describe a draw_vbo call.
    567  */
    568 struct pipe_draw_info
    569 {
    570    boolean indexed;  /**< use index buffer */
    571    ubyte vertices_per_patch; /**< the number of vertices per patch */
    572 
    573    unsigned mode;  /**< the mode of the primitive */
    574    unsigned start;  /**< the index of the first vertex */
    575    unsigned count;  /**< number of vertices */
    576 
    577    unsigned start_instance; /**< first instance id */
    578    unsigned instance_count; /**< number of instances */
    579 
    580    unsigned drawid; /**< id of this draw in a multidraw */
    581    /**
    582     * For indexed drawing, these fields apply after index lookup.
    583     */
    584    int index_bias; /**< a bias to be added to each index */
    585    unsigned min_index; /**< the min index */
    586    unsigned max_index; /**< the max index */
    587 
    588    /**
    589     * Primitive restart enable/index (only applies to indexed drawing)
    590     */
    591    boolean primitive_restart;
    592    unsigned restart_index;
    593 
    594    struct pipe_draw_indirect_info indirect;
    595    /**
    596     * Stream output target. If not NULL, it's used to provide the 'count'
    597     * parameter based on the number vertices captured by the stream output
    598     * stage. (or generally, based on the number of bytes captured)
    599     *
    600     * Only 'mode', 'start_instance', and 'instance_count' are taken into
    601     * account, all the other variables from pipe_draw_info are ignored.
    602     *
    603     * 'start' is implicitly 0 and 'count' is set as discussed above.
    604     * The draw command is non-indexed.
    605     *
    606     * Note that this only provides the count. The vertex buffers must
    607     * be set via set_vertex_buffers manually.
    608     */
    609    struct pipe_stream_output_target *count_from_stream_output;
    610 };
    611 
    612 
    613 /**
    614  * Information to describe a blit call.
    615  */
    616 struct pipe_blit_info
    617 {
    618    struct {
    619       struct pipe_resource *resource;
    620       unsigned level;
    621       struct pipe_box box; /**< negative width, height only legal for src */
    622       /* For pipe_surface-like format casting: */
    623       enum pipe_format format; /**< must be supported for sampling (src)
    624                                or rendering (dst), ZS is always supported */
    625    } dst, src;
    626 
    627    unsigned mask; /**< bitmask of PIPE_MASK_R/G/B/A/Z/S */
    628    unsigned filter; /**< PIPE_TEX_FILTER_* */
    629 
    630    boolean scissor_enable;
    631    struct pipe_scissor_state scissor;
    632 
    633    boolean render_condition_enable; /**< whether the blit should honor the
    634                                        current render condition */
    635    boolean alpha_blend; /* dst.rgb = src.rgb * src.a + dst.rgb * (1 - src.a) */
    636 };
    637 
    638 
    639 /**
    640  * Structure used as a header for serialized LLVM programs.
    641  */
    642 struct pipe_llvm_program_header
    643 {
    644    uint32_t num_bytes; /**< Number of bytes in the LLVM bytecode program. */
    645 };
    646 
    647 struct pipe_compute_state
    648 {
    649    const void *prog; /**< Compute program to be executed. */
    650    unsigned req_local_mem; /**< Required size of the LOCAL resource. */
    651    unsigned req_private_mem; /**< Required size of the PRIVATE resource. */
    652    unsigned req_input_mem; /**< Required size of the INPUT resource. */
    653 };
    654 
    655 #ifdef __cplusplus
    656 }
    657 #endif
    658 
    659 #endif
    660