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 #ifndef PIPE_CONTEXT_H
     29 #define PIPE_CONTEXT_H
     30 
     31 #include "p_compiler.h"
     32 #include "p_format.h"
     33 #include "p_video_enums.h"
     34 #include "p_defines.h"
     35 #include <stdio.h>
     36 
     37 #ifdef __cplusplus
     38 extern "C" {
     39 #endif
     40 
     41 
     42 struct pipe_blend_color;
     43 struct pipe_blend_state;
     44 struct pipe_blit_info;
     45 struct pipe_box;
     46 struct pipe_clip_state;
     47 struct pipe_constant_buffer;
     48 struct pipe_debug_callback;
     49 struct pipe_depth_stencil_alpha_state;
     50 struct pipe_device_reset_callback;
     51 struct pipe_draw_info;
     52 struct pipe_grid_info;
     53 struct pipe_fence_handle;
     54 struct pipe_framebuffer_state;
     55 struct pipe_image_view;
     56 struct pipe_query;
     57 struct pipe_poly_stipple;
     58 struct pipe_rasterizer_state;
     59 struct pipe_resolve_info;
     60 struct pipe_resource;
     61 struct pipe_sampler_state;
     62 struct pipe_sampler_view;
     63 struct pipe_scissor_state;
     64 struct pipe_shader_buffer;
     65 struct pipe_shader_state;
     66 struct pipe_stencil_ref;
     67 struct pipe_stream_output_target;
     68 struct pipe_surface;
     69 struct pipe_transfer;
     70 struct pipe_vertex_buffer;
     71 struct pipe_vertex_element;
     72 struct pipe_video_buffer;
     73 struct pipe_video_codec;
     74 struct pipe_viewport_state;
     75 struct pipe_compute_state;
     76 union pipe_color_union;
     77 union pipe_query_result;
     78 struct u_log_context;
     79 struct u_upload_mgr;
     80 
     81 /**
     82  * Gallium rendering context.  Basically:
     83  *  - state setting functions
     84  *  - VBO drawing functions
     85  *  - surface functions
     86  */
     87 struct pipe_context {
     88    struct pipe_screen *screen;
     89 
     90    void *priv;  /**< context private data (for DRI for example) */
     91    void *draw;  /**< private, for draw module (temporary?) */
     92 
     93    /**
     94     * Stream uploaders created by the driver. All drivers, state trackers, and
     95     * modules should use them.
     96     *
     97     * Use u_upload_alloc or u_upload_data as many times as you want.
     98     * Once you are done, use u_upload_unmap.
     99     */
    100    struct u_upload_mgr *stream_uploader; /* everything but shader constants */
    101    struct u_upload_mgr *const_uploader;  /* shader constants only */
    102 
    103    void (*destroy)( struct pipe_context * );
    104 
    105    /**
    106     * VBO drawing
    107     */
    108    /*@{*/
    109    void (*draw_vbo)( struct pipe_context *pipe,
    110                      const struct pipe_draw_info *info );
    111    /*@}*/
    112 
    113    /**
    114     * Predicate subsequent rendering on occlusion query result
    115     * \param query  the query predicate, or NULL if no predicate
    116     * \param condition whether to skip on FALSE or TRUE query results
    117     * \param mode  one of PIPE_RENDER_COND_x
    118     */
    119    void (*render_condition)( struct pipe_context *pipe,
    120                              struct pipe_query *query,
    121                              boolean condition,
    122                              enum pipe_render_cond_flag mode );
    123 
    124    /**
    125     * Query objects
    126     */
    127    /*@{*/
    128    struct pipe_query *(*create_query)( struct pipe_context *pipe,
    129                                        unsigned query_type,
    130                                        unsigned index );
    131 
    132    /**
    133     * Create a query object that queries all given query types simultaneously.
    134     *
    135     * This can only be used for those query types for which
    136     * get_driver_query_info indicates that it must be used. Only one batch
    137     * query object may be active at a time.
    138     *
    139     * There may be additional constraints on which query types can be used
    140     * together, in particular those that are implied by
    141     * get_driver_query_group_info.
    142     *
    143     * \param num_queries the number of query types
    144     * \param query_types array of \p num_queries query types
    145     * \return a query object, or NULL on error.
    146     */
    147    struct pipe_query *(*create_batch_query)( struct pipe_context *pipe,
    148                                              unsigned num_queries,
    149                                              unsigned *query_types );
    150 
    151    void (*destroy_query)(struct pipe_context *pipe,
    152                          struct pipe_query *q);
    153 
    154    boolean (*begin_query)(struct pipe_context *pipe, struct pipe_query *q);
    155    bool (*end_query)(struct pipe_context *pipe, struct pipe_query *q);
    156 
    157    /**
    158     * Get results of a query.
    159     * \param wait  if true, this query will block until the result is ready
    160     * \return TRUE if results are ready, FALSE otherwise
    161     */
    162    boolean (*get_query_result)(struct pipe_context *pipe,
    163                                struct pipe_query *q,
    164                                boolean wait,
    165                                union pipe_query_result *result);
    166 
    167    /**
    168     * Get results of a query, storing into resource. Note that this may not
    169     * be used with batch queries.
    170     *
    171     * \param wait  if true, this query will block until the result is ready
    172     * \param result_type  the type of the value being stored:
    173     * \param index  for queries that return multiple pieces of data, which
    174     *               item of that data to store (e.g. for
    175     *               PIPE_QUERY_PIPELINE_STATISTICS).
    176     *               When the index is -1, instead of the value of the query
    177     *               the driver should instead write a 1 or 0 to the appropriate
    178     *               location with 1 meaning that the query result is available.
    179     */
    180    void (*get_query_result_resource)(struct pipe_context *pipe,
    181                                      struct pipe_query *q,
    182                                      boolean wait,
    183                                      enum pipe_query_value_type result_type,
    184                                      int index,
    185                                      struct pipe_resource *resource,
    186                                      unsigned offset);
    187 
    188    /**
    189     * Set whether all current non-driver queries except TIME_ELAPSED are
    190     * active or paused.
    191     */
    192    void (*set_active_query_state)(struct pipe_context *pipe, boolean enable);
    193 
    194    /*@}*/
    195 
    196    /**
    197     * State functions (create/bind/destroy state objects)
    198     */
    199    /*@{*/
    200    void * (*create_blend_state)(struct pipe_context *,
    201                                 const struct pipe_blend_state *);
    202    void   (*bind_blend_state)(struct pipe_context *, void *);
    203    void   (*delete_blend_state)(struct pipe_context *, void  *);
    204 
    205    void * (*create_sampler_state)(struct pipe_context *,
    206                                   const struct pipe_sampler_state *);
    207    void   (*bind_sampler_states)(struct pipe_context *,
    208                                  enum pipe_shader_type shader,
    209                                  unsigned start_slot, unsigned num_samplers,
    210                                  void **samplers);
    211    void   (*delete_sampler_state)(struct pipe_context *, void *);
    212 
    213    void * (*create_rasterizer_state)(struct pipe_context *,
    214                                      const struct pipe_rasterizer_state *);
    215    void   (*bind_rasterizer_state)(struct pipe_context *, void *);
    216    void   (*delete_rasterizer_state)(struct pipe_context *, void *);
    217 
    218    void * (*create_depth_stencil_alpha_state)(struct pipe_context *,
    219                                         const struct pipe_depth_stencil_alpha_state *);
    220    void   (*bind_depth_stencil_alpha_state)(struct pipe_context *, void *);
    221    void   (*delete_depth_stencil_alpha_state)(struct pipe_context *, void *);
    222 
    223    void * (*create_fs_state)(struct pipe_context *,
    224                              const struct pipe_shader_state *);
    225    void   (*bind_fs_state)(struct pipe_context *, void *);
    226    void   (*delete_fs_state)(struct pipe_context *, void *);
    227 
    228    void * (*create_vs_state)(struct pipe_context *,
    229                              const struct pipe_shader_state *);
    230    void   (*bind_vs_state)(struct pipe_context *, void *);
    231    void   (*delete_vs_state)(struct pipe_context *, void *);
    232 
    233    void * (*create_gs_state)(struct pipe_context *,
    234                              const struct pipe_shader_state *);
    235    void   (*bind_gs_state)(struct pipe_context *, void *);
    236    void   (*delete_gs_state)(struct pipe_context *, void *);
    237 
    238    void * (*create_tcs_state)(struct pipe_context *,
    239                               const struct pipe_shader_state *);
    240    void   (*bind_tcs_state)(struct pipe_context *, void *);
    241    void   (*delete_tcs_state)(struct pipe_context *, void *);
    242 
    243    void * (*create_tes_state)(struct pipe_context *,
    244                               const struct pipe_shader_state *);
    245    void   (*bind_tes_state)(struct pipe_context *, void *);
    246    void   (*delete_tes_state)(struct pipe_context *, void *);
    247 
    248    void * (*create_vertex_elements_state)(struct pipe_context *,
    249                                           unsigned num_elements,
    250                                           const struct pipe_vertex_element *);
    251    void   (*bind_vertex_elements_state)(struct pipe_context *, void *);
    252    void   (*delete_vertex_elements_state)(struct pipe_context *, void *);
    253 
    254    /*@}*/
    255 
    256    /**
    257     * Parameter-like state (or properties)
    258     */
    259    /*@{*/
    260    void (*set_blend_color)( struct pipe_context *,
    261                             const struct pipe_blend_color * );
    262 
    263    void (*set_stencil_ref)( struct pipe_context *,
    264                             const struct pipe_stencil_ref * );
    265 
    266    void (*set_sample_mask)( struct pipe_context *,
    267                             unsigned sample_mask );
    268 
    269    void (*set_min_samples)( struct pipe_context *,
    270                             unsigned min_samples );
    271 
    272    void (*set_clip_state)( struct pipe_context *,
    273                             const struct pipe_clip_state * );
    274 
    275    void (*set_constant_buffer)( struct pipe_context *,
    276                                 enum pipe_shader_type shader, uint index,
    277                                 const struct pipe_constant_buffer *buf );
    278 
    279    void (*set_framebuffer_state)( struct pipe_context *,
    280                                   const struct pipe_framebuffer_state * );
    281 
    282    void (*set_polygon_stipple)( struct pipe_context *,
    283 				const struct pipe_poly_stipple * );
    284 
    285    void (*set_scissor_states)( struct pipe_context *,
    286                                unsigned start_slot,
    287                                unsigned num_scissors,
    288                                const struct pipe_scissor_state * );
    289 
    290    void (*set_window_rectangles)( struct pipe_context *,
    291                                   boolean include,
    292                                   unsigned num_rectangles,
    293                                   const struct pipe_scissor_state * );
    294 
    295    void (*set_viewport_states)( struct pipe_context *,
    296                                 unsigned start_slot,
    297                                 unsigned num_viewports,
    298                                 const struct pipe_viewport_state *);
    299 
    300    void (*set_sampler_views)(struct pipe_context *,
    301                              enum pipe_shader_type shader,
    302                              unsigned start_slot, unsigned num_views,
    303                              struct pipe_sampler_view **);
    304 
    305    void (*set_tess_state)(struct pipe_context *,
    306                           const float default_outer_level[4],
    307                           const float default_inner_level[2]);
    308 
    309    /**
    310     * Sets the debug callback. If the pointer is null, then no callback is
    311     * set, otherwise a copy of the data should be made.
    312     */
    313    void (*set_debug_callback)(struct pipe_context *,
    314                               const struct pipe_debug_callback *);
    315 
    316    /**
    317     * Bind an array of shader buffers that will be used by a shader.
    318     * Any buffers that were previously bound to the specified range
    319     * will be unbound.
    320     *
    321     * \param shader     selects shader stage
    322     * \param start_slot first buffer slot to bind.
    323     * \param count      number of consecutive buffers to bind.
    324     * \param buffers    array of pointers to the buffers to bind, it
    325     *                   should contain at least \a count elements
    326     *                   unless it's NULL, in which case no buffers will
    327     *                   be bound.
    328     */
    329    void (*set_shader_buffers)(struct pipe_context *,
    330                               enum pipe_shader_type shader,
    331                               unsigned start_slot, unsigned count,
    332                               const struct pipe_shader_buffer *buffers);
    333 
    334    /**
    335     * Bind an array of hw atomic buffers for use by all shaders.
    336     * And buffers that were previously bound to the specified range
    337     * will be unbound.
    338     *
    339     * \param start_slot first buffer slot to bind.
    340     * \param count      number of consecutive buffers to bind.
    341     * \param buffers    array of pointers to the buffers to bind, it
    342     *                   should contain at least \a count elements
    343     *                   unless it's NULL, in which case no buffers will
    344     *                   be bound.
    345     */
    346    void (*set_hw_atomic_buffers)(struct pipe_context *,
    347                                  unsigned start_slot, unsigned count,
    348                                  const struct pipe_shader_buffer *buffers);
    349 
    350    /**
    351     * Bind an array of images that will be used by a shader.
    352     * Any images that were previously bound to the specified range
    353     * will be unbound.
    354     *
    355     * \param shader     selects shader stage
    356     * \param start_slot first image slot to bind.
    357     * \param count      number of consecutive images to bind.
    358     * \param buffers    array of the images to bind, it
    359     *                   should contain at least \a count elements
    360     *                   unless it's NULL, in which case no images will
    361     *                   be bound.
    362     */
    363    void (*set_shader_images)(struct pipe_context *,
    364                              enum pipe_shader_type shader,
    365                              unsigned start_slot, unsigned count,
    366                              const struct pipe_image_view *images);
    367 
    368    void (*set_vertex_buffers)( struct pipe_context *,
    369                                unsigned start_slot,
    370                                unsigned num_buffers,
    371                                const struct pipe_vertex_buffer * );
    372 
    373    /*@}*/
    374 
    375    /**
    376     * Stream output functions.
    377     */
    378    /*@{*/
    379 
    380    struct pipe_stream_output_target *(*create_stream_output_target)(
    381                         struct pipe_context *,
    382                         struct pipe_resource *,
    383                         unsigned buffer_offset,
    384                         unsigned buffer_size);
    385 
    386    void (*stream_output_target_destroy)(struct pipe_context *,
    387                                         struct pipe_stream_output_target *);
    388 
    389    void (*set_stream_output_targets)(struct pipe_context *,
    390                               unsigned num_targets,
    391                               struct pipe_stream_output_target **targets,
    392                               const unsigned *offsets);
    393 
    394    /*@}*/
    395 
    396 
    397    /**
    398     * Resource functions for blit-like functionality
    399     *
    400     * If a driver supports multisampling, blit must implement color resolve.
    401     */
    402    /*@{*/
    403 
    404    /**
    405     * Copy a block of pixels from one resource to another.
    406     * The resource must be of the same format.
    407     * Resources with nr_samples > 1 are not allowed.
    408     */
    409    void (*resource_copy_region)(struct pipe_context *pipe,
    410                                 struct pipe_resource *dst,
    411                                 unsigned dst_level,
    412                                 unsigned dstx, unsigned dsty, unsigned dstz,
    413                                 struct pipe_resource *src,
    414                                 unsigned src_level,
    415                                 const struct pipe_box *src_box);
    416 
    417    /* Optimal hardware path for blitting pixels.
    418     * Scaling, format conversion, up- and downsampling (resolve) are allowed.
    419     */
    420    void (*blit)(struct pipe_context *pipe,
    421                 const struct pipe_blit_info *info);
    422 
    423    /*@}*/
    424 
    425    /**
    426     * Clear the specified set of currently bound buffers to specified values.
    427     * The entire buffers are cleared (no scissor, no colormask, etc).
    428     *
    429     * \param buffers  bitfield of PIPE_CLEAR_* values.
    430     * \param color  pointer to a union of fiu array for each of r, g, b, a.
    431     * \param depth  depth clear value in [0,1].
    432     * \param stencil  stencil clear value
    433     */
    434    void (*clear)(struct pipe_context *pipe,
    435                  unsigned buffers,
    436                  const union pipe_color_union *color,
    437                  double depth,
    438                  unsigned stencil);
    439 
    440    /**
    441     * Clear a color rendertarget surface.
    442     * \param color  pointer to an union of fiu array for each of r, g, b, a.
    443     */
    444    void (*clear_render_target)(struct pipe_context *pipe,
    445                                struct pipe_surface *dst,
    446                                const union pipe_color_union *color,
    447                                unsigned dstx, unsigned dsty,
    448                                unsigned width, unsigned height,
    449                                bool render_condition_enabled);
    450 
    451    /**
    452     * Clear a depth-stencil surface.
    453     * \param clear_flags  bitfield of PIPE_CLEAR_DEPTH/STENCIL values.
    454     * \param depth  depth clear value in [0,1].
    455     * \param stencil  stencil clear value
    456     */
    457    void (*clear_depth_stencil)(struct pipe_context *pipe,
    458                                struct pipe_surface *dst,
    459                                unsigned clear_flags,
    460                                double depth,
    461                                unsigned stencil,
    462                                unsigned dstx, unsigned dsty,
    463                                unsigned width, unsigned height,
    464                                bool render_condition_enabled);
    465 
    466    /**
    467     * Clear the texture with the specified texel. Not guaranteed to be a
    468     * renderable format. Data provided in the resource's format.
    469     */
    470    void (*clear_texture)(struct pipe_context *pipe,
    471                          struct pipe_resource *res,
    472                          unsigned level,
    473                          const struct pipe_box *box,
    474                          const void *data);
    475 
    476    /**
    477     * Clear a buffer. Runs a memset over the specified region with the element
    478     * value passed in through clear_value of size clear_value_size.
    479     */
    480    void (*clear_buffer)(struct pipe_context *pipe,
    481                         struct pipe_resource *res,
    482                         unsigned offset,
    483                         unsigned size,
    484                         const void *clear_value,
    485                         int clear_value_size);
    486 
    487    /**
    488     * Flush draw commands.
    489     *
    490     * This guarantees that the new fence (if any) will finish in finite time,
    491     * unless PIPE_FLUSH_DEFERRED is used.
    492     *
    493     * Subsequent operations on other contexts of the same screen are guaranteed
    494     * to execute after the flushed commands, unless PIPE_FLUSH_ASYNC is used.
    495     *
    496     * NOTE: use screen->fence_reference() (or equivalent) to transfer
    497     * new fence ref to **fence, to ensure that previous fence is unref'd
    498     *
    499     * \param fence  if not NULL, an old fence to unref and transfer a
    500     *    new fence reference to
    501     * \param flags  bitfield of enum pipe_flush_flags values.
    502     */
    503    void (*flush)(struct pipe_context *pipe,
    504                  struct pipe_fence_handle **fence,
    505                  unsigned flags);
    506 
    507    /**
    508     * Create a fence from a native sync fd.
    509     *
    510     * This is used for importing a foreign/external fence fd.
    511     *
    512     * \param fence  if not NULL, an old fence to unref and transfer a
    513     *    new fence reference to
    514     * \param fd     native fence fd
    515     */
    516    void (*create_fence_fd)(struct pipe_context *pipe,
    517                            struct pipe_fence_handle **fence,
    518                            int fd);
    519 
    520    /**
    521     * Insert commands to have GPU wait for fence to be signaled.
    522     */
    523    void (*fence_server_sync)(struct pipe_context *pipe,
    524                              struct pipe_fence_handle *fence);
    525 
    526    /**
    527     * Create a view on a texture to be used by a shader stage.
    528     */
    529    struct pipe_sampler_view * (*create_sampler_view)(struct pipe_context *ctx,
    530                                                      struct pipe_resource *texture,
    531                                                      const struct pipe_sampler_view *templat);
    532 
    533    /**
    534     * Destroy a view on a texture.
    535     *
    536     * \param ctx the current context
    537     * \param view the view to be destroyed
    538     *
    539     * \note The current context may not be the context in which the view was
    540     *       created (view->context). However, the caller must guarantee that
    541     *       the context which created the view is still alive.
    542     */
    543    void (*sampler_view_destroy)(struct pipe_context *ctx,
    544                                 struct pipe_sampler_view *view);
    545 
    546 
    547    /**
    548     * Get a surface which is a "view" into a resource, used by
    549     * render target / depth stencil stages.
    550     */
    551    struct pipe_surface *(*create_surface)(struct pipe_context *ctx,
    552                                           struct pipe_resource *resource,
    553                                           const struct pipe_surface *templat);
    554 
    555    void (*surface_destroy)(struct pipe_context *ctx,
    556                            struct pipe_surface *);
    557 
    558 
    559    /**
    560     * Map a resource.
    561     *
    562     * Transfers are (by default) context-private and allow uploads to be
    563     * interleaved with rendering.
    564     *
    565     * out_transfer will contain the transfer object that must be passed
    566     * to all the other transfer functions. It also contains useful
    567     * information (like texture strides).
    568     */
    569    void *(*transfer_map)(struct pipe_context *,
    570                          struct pipe_resource *resource,
    571                          unsigned level,
    572                          unsigned usage,  /* a combination of PIPE_TRANSFER_x */
    573                          const struct pipe_box *,
    574                          struct pipe_transfer **out_transfer);
    575 
    576    /* If transfer was created with WRITE|FLUSH_EXPLICIT, only the
    577     * regions specified with this call are guaranteed to be written to
    578     * the resource.
    579     */
    580    void (*transfer_flush_region)( struct pipe_context *,
    581 				  struct pipe_transfer *transfer,
    582 				  const struct pipe_box *);
    583 
    584    void (*transfer_unmap)(struct pipe_context *,
    585                           struct pipe_transfer *transfer);
    586 
    587    /* One-shot transfer operation with data supplied in a user
    588     * pointer.
    589     */
    590    void (*buffer_subdata)(struct pipe_context *,
    591                           struct pipe_resource *,
    592                           unsigned usage, /* a combination of PIPE_TRANSFER_x */
    593                           unsigned offset,
    594                           unsigned size,
    595                           const void *data);
    596 
    597    void (*texture_subdata)(struct pipe_context *,
    598                            struct pipe_resource *,
    599                            unsigned level,
    600                            unsigned usage, /* a combination of PIPE_TRANSFER_x */
    601                            const struct pipe_box *,
    602                            const void *data,
    603                            unsigned stride,
    604                            unsigned layer_stride);
    605 
    606    /**
    607     * Flush any pending framebuffer writes and invalidate texture caches.
    608     */
    609    void (*texture_barrier)(struct pipe_context *, unsigned flags);
    610 
    611    /**
    612     * Flush caches according to flags.
    613     */
    614    void (*memory_barrier)(struct pipe_context *, unsigned flags);
    615 
    616    /**
    617     * Change the commitment status of a part of the given resource, which must
    618     * have been created with the PIPE_RESOURCE_FLAG_SPARSE bit.
    619     *
    620     * \param level The texture level whose commitment should be changed.
    621     * \param box The region of the resource whose commitment should be changed.
    622     * \param commit Whether memory should be committed or un-committed.
    623     *
    624     * \return false if out of memory, true on success.
    625     */
    626    bool (*resource_commit)(struct pipe_context *, struct pipe_resource *,
    627                            unsigned level, struct pipe_box *box, bool commit);
    628 
    629    /**
    630     * Creates a video codec for a specific video format/profile
    631     */
    632    struct pipe_video_codec *(*create_video_codec)( struct pipe_context *context,
    633                                                    const struct pipe_video_codec *templat );
    634 
    635    /**
    636     * Creates a video buffer as decoding target
    637     */
    638    struct pipe_video_buffer *(*create_video_buffer)( struct pipe_context *context,
    639                                                      const struct pipe_video_buffer *templat );
    640 
    641    /**
    642     * Compute kernel execution
    643     */
    644    /*@{*/
    645    /**
    646     * Define the compute program and parameters to be used by
    647     * pipe_context::launch_grid.
    648     */
    649    void *(*create_compute_state)(struct pipe_context *context,
    650 				 const struct pipe_compute_state *);
    651    void (*bind_compute_state)(struct pipe_context *, void *);
    652    void (*delete_compute_state)(struct pipe_context *, void *);
    653 
    654    /**
    655     * Bind an array of shader resources that will be used by the
    656     * compute program.  Any resources that were previously bound to
    657     * the specified range will be unbound after this call.
    658     *
    659     * \param start      first resource to bind.
    660     * \param count      number of consecutive resources to bind.
    661     * \param resources  array of pointers to the resources to bind, it
    662     *                   should contain at least \a count elements
    663     *                   unless it's NULL, in which case no new
    664     *                   resources will be bound.
    665     */
    666    void (*set_compute_resources)(struct pipe_context *,
    667                                  unsigned start, unsigned count,
    668                                  struct pipe_surface **resources);
    669 
    670    /**
    671     * Bind an array of buffers to be mapped into the address space of
    672     * the GLOBAL resource.  Any buffers that were previously bound
    673     * between [first, first + count - 1] are unbound after this call.
    674     *
    675     * \param first      first buffer to map.
    676     * \param count      number of consecutive buffers to map.
    677     * \param resources  array of pointers to the buffers to map, it
    678     *                   should contain at least \a count elements
    679     *                   unless it's NULL, in which case no new
    680     *                   resources will be bound.
    681     * \param handles    array of pointers to the memory locations that
    682     *                   will be updated with the address each buffer
    683     *                   will be mapped to.  The base memory address of
    684     *                   each of the buffers will be added to the value
    685     *                   pointed to by its corresponding handle to form
    686     *                   the final address argument.  It should contain
    687     *                   at least \a count elements, unless \a
    688     *                   resources is NULL in which case \a handles
    689     *                   should be NULL as well.
    690     *
    691     * Note that the driver isn't required to make any guarantees about
    692     * the contents of the \a handles array being valid anytime except
    693     * during the subsequent calls to pipe_context::launch_grid.  This
    694     * means that the only sensible location handles[i] may point to is
    695     * somewhere within the INPUT buffer itself.  This is so to
    696     * accommodate implementations that lack virtual memory but
    697     * nevertheless migrate buffers on the fly, leading to resource
    698     * base addresses that change on each kernel invocation or are
    699     * unknown to the pipe driver.
    700     */
    701    void (*set_global_binding)(struct pipe_context *context,
    702                               unsigned first, unsigned count,
    703                               struct pipe_resource **resources,
    704                               uint32_t **handles);
    705 
    706    /**
    707     * Launch the compute kernel starting from instruction \a pc of the
    708     * currently bound compute program.
    709     */
    710    void (*launch_grid)(struct pipe_context *context,
    711                        const struct pipe_grid_info *info);
    712    /*@}*/
    713 
    714    /**
    715     * Get sample position for an individual sample point.
    716     *
    717     * \param sample_count - total number of samples
    718     * \param sample_index - sample to get the position values for
    719     * \param out_value - return value of 2 floats for x and y position for
    720     *                    requested sample.
    721     */
    722    void (*get_sample_position)(struct pipe_context *context,
    723                                unsigned sample_count,
    724                                unsigned sample_index,
    725                                float *out_value);
    726 
    727    /**
    728     * Query a timestamp in nanoseconds.  This is completely equivalent to
    729     * pipe_screen::get_timestamp() but takes a context handle for drivers
    730     * that require a context.
    731     */
    732    uint64_t (*get_timestamp)(struct pipe_context *);
    733 
    734    /**
    735     * Flush the resource cache, so that the resource can be used
    736     * by an external client. Possible usage:
    737     * - flushing a resource before presenting it on the screen
    738     * - flushing a resource if some other process or device wants to use it
    739     * This shouldn't be used to flush caches if the resource is only managed
    740     * by a single pipe_screen and is not shared with another process.
    741     * (i.e. you shouldn't use it to flush caches explicitly if you want to e.g.
    742     * use the resource for texturing)
    743     */
    744    void (*flush_resource)(struct pipe_context *ctx,
    745                           struct pipe_resource *resource);
    746 
    747    /**
    748     * Invalidate the contents of the resource. This is used to
    749     *
    750     * (1) implement EGL's semantic of undefined depth/stencil
    751     * contenst after a swapbuffers.  This allows a tiled renderer (for
    752     * example) to not store the depth buffer.
    753     *
    754     * (2) implement GL's InvalidateBufferData. For backwards compatibility,
    755     * you must only rely on the usability for this purpose when
    756     * PIPE_CAP_INVALIDATE_BUFFER is enabled.
    757     */
    758    void (*invalidate_resource)(struct pipe_context *ctx,
    759                                struct pipe_resource *resource);
    760 
    761    /**
    762     * Return information about unexpected device resets.
    763     */
    764    enum pipe_reset_status (*get_device_reset_status)(struct pipe_context *ctx);
    765 
    766    /**
    767     * Sets the reset status callback. If the pointer is null, then no callback
    768     * is set, otherwise a copy of the data should be made.
    769     */
    770    void (*set_device_reset_callback)(struct pipe_context *ctx,
    771                                      const struct pipe_device_reset_callback *cb);
    772 
    773    /**
    774     * Dump driver-specific debug information into a stream. This is
    775     * used by debugging tools.
    776     *
    777     * \param ctx        pipe context
    778     * \param stream     where the output should be written to
    779     * \param flags      a mask of PIPE_DUMP_* flags
    780     */
    781    void (*dump_debug_state)(struct pipe_context *ctx, FILE *stream,
    782                             unsigned flags);
    783 
    784    /**
    785     * Set the log context to which the driver should write internal debug logs
    786     * (internal states, command streams).
    787     *
    788     * The caller must ensure that the log context is destroyed and reset to
    789     * NULL before the pipe context is destroyed, and that log context functions
    790     * are only called from the driver thread.
    791     *
    792     * \param ctx pipe context
    793     * \param log logging context
    794     */
    795    void (*set_log_context)(struct pipe_context *ctx, struct u_log_context *log);
    796 
    797    /**
    798     * Emit string marker in cmdstream
    799     */
    800    void (*emit_string_marker)(struct pipe_context *ctx,
    801                               const char *string,
    802                               int len);
    803 
    804    /**
    805     * Generate mipmap.
    806     * \return TRUE if mipmap generation succeeds, FALSE otherwise
    807     */
    808    boolean (*generate_mipmap)(struct pipe_context *ctx,
    809                               struct pipe_resource *resource,
    810                               enum pipe_format format,
    811                               unsigned base_level,
    812                               unsigned last_level,
    813                               unsigned first_layer,
    814                               unsigned last_layer);
    815 
    816    /**
    817     * Create a 64-bit texture handle.
    818     *
    819     * \param ctx        pipe context
    820     * \param view       pipe sampler view object
    821     * \param state      pipe sampler state template
    822     * \return           a 64-bit texture handle if success, 0 otherwise
    823     */
    824    uint64_t (*create_texture_handle)(struct pipe_context *ctx,
    825                                      struct pipe_sampler_view *view,
    826                                      const struct pipe_sampler_state *state);
    827 
    828    /**
    829     * Delete a texture handle.
    830     *
    831     * \param ctx        pipe context
    832     * \param handle     64-bit texture handle
    833     */
    834    void (*delete_texture_handle)(struct pipe_context *ctx, uint64_t handle);
    835 
    836    /**
    837     * Make a texture handle resident.
    838     *
    839     * \param ctx        pipe context
    840     * \param handle     64-bit texture handle
    841     * \param resident   TRUE for resident, FALSE otherwise
    842     */
    843    void (*make_texture_handle_resident)(struct pipe_context *ctx,
    844                                         uint64_t handle, bool resident);
    845 
    846    /**
    847     * Create a 64-bit image handle.
    848     *
    849     * \param ctx        pipe context
    850     * \param image      pipe image view template
    851     * \return           a 64-bit image handle if success, 0 otherwise
    852     */
    853    uint64_t (*create_image_handle)(struct pipe_context *ctx,
    854                                    const struct pipe_image_view *image);
    855 
    856    /**
    857     * Delete an image handle.
    858     *
    859     * \param ctx        pipe context
    860     * \param handle     64-bit image handle
    861     */
    862    void (*delete_image_handle)(struct pipe_context *ctx, uint64_t handle);
    863 
    864    /**
    865     * Make an image handle resident.
    866     *
    867     * \param ctx        pipe context
    868     * \param handle     64-bit image handle
    869     * \param access     GL_READ_ONLY, GL_WRITE_ONLY or GL_READ_WRITE
    870     * \param resident   TRUE for resident, FALSE otherwise
    871     */
    872    void (*make_image_handle_resident)(struct pipe_context *ctx, uint64_t handle,
    873                                       unsigned access, bool resident);
    874 
    875    /**
    876     * Call the given function from the driver thread.
    877     *
    878     * This is set by threaded contexts for use by debugging wrappers.
    879     *
    880     * \param asap if true, run the callback immediately if there are no pending
    881     *             commands to be processed by the driver thread
    882     */
    883    void (*callback)(struct pipe_context *ctx, void (*fn)(void *), void *data,
    884                     bool asap);
    885 };
    886 
    887 
    888 #ifdef __cplusplus
    889 }
    890 #endif
    891 
    892 #endif /* PIPE_CONTEXT_H */
    893