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