18e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/**************************************************************************
28e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
38e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
48e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * All Rights Reserved.
58e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
68e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
78e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * copy of this software and associated documentation files (the
88e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * "Software"), to deal in the Software without restriction, including
98e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * the following conditions:
138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
148e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * The above copyright notice and this permission notice (including the
158e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
168e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * of the Software.
178e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
238e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell **************************************************************************/
278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
28943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#ifndef PIPE_CONTEXT_H
29943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#define PIPE_CONTEXT_H
308e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
3181ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Lee#include "p_compiler.h"
32a5a942256162eb0ca4df2f8202a916b080396141Brian Paul#include "p_format.h"
33a5a942256162eb0ca4df2f8202a916b080396141Brian Paul#include "p_video_enums.h"
34563479552e2f491fb94e7fac5772f3c72cee962aBrian
35e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca#ifdef __cplusplus
36e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonsecaextern "C" {
37e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca#endif
38e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca
3981ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Lee
4081ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_blend_color;
4181ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_blend_state;
4281ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_box;
4381ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_clip_state;
44507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšákstruct pipe_constant_buffer;
4581ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_depth_stencil_alpha_state;
4681ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_draw_info;
474abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzerstruct pipe_fence_handle;
4881ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_framebuffer_state;
4981ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_index_buffer;
5013699463a33c1adf44005125c488e886e074a05bKeith Whitwellstruct pipe_query;
5181ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_poly_stipple;
5281ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_rasterizer_state;
5394822c6d83b7811db2a02bb4416df02ae225ba47Christoph Bumillerstruct pipe_resolve_info;
5481ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_resource;
5581ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_sampler_state;
5681ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_sampler_view;
5781ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_scissor_state;
5881ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_shader_state;
5981ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_stencil_ref;
60861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšákstruct pipe_stream_output_target;
6181ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_surface;
6281ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_vertex_buffer;
6381ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_vertex_element;
64a5a942256162eb0ca4df2f8202a916b080396141Brian Paulstruct pipe_video_buffer;
65a5a942256162eb0ca4df2f8202a916b080396141Brian Paulstruct pipe_video_decoder;
6681ac08f89d9f52d14aada43f4d00302cd9b32c68Vinson Leestruct pipe_viewport_state;
67d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerezstruct pipe_compute_state;
686dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlieunion pipe_color_union;
69102ed41ae6287f9f43708d10f3952c3c5b887c45Marek Olšákunion pipe_query_result;
704e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
71092a9ecbba4d766da9c0becf888818c020ac226dBrian/**
721103e9c3d0c3ba636837250eea3d50956a3b1e02Brian * Gallium rendering context.  Basically:
731103e9c3d0c3ba636837250eea3d50956a3b1e02Brian *  - state setting functions
741103e9c3d0c3ba636837250eea3d50956a3b1e02Brian *  - VBO drawing functions
75b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer *  - surface functions
76092a9ecbba4d766da9c0becf888818c020ac226dBrian */
77943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwellstruct pipe_context {
78aa59a937ccf41609081d3f9a4973df5478979785Brian   struct pipe_screen *screen;
795ffdada717466a78b5b148764ba23c7a95098887Zack Rusin
8037da2d685102ab5a706e0634fc55c60229598faaBrian Paul   void *priv;  /**< context private data (for DRI for example) */
8137da2d685102ab5a706e0634fc55c60229598faaBrian Paul   void *draw;  /**< private, for draw module (temporary?) */
8210c62bf0683437672c83339138a6802d56aeca8fBrian
83943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell   void (*destroy)( struct pipe_context * );
848e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
8537da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /**
86361b179720dc5d7bb4e046d3e91ce3b1a64a4cd2Brian Paul    * VBO drawing
87092a9ecbba4d766da9c0becf888818c020ac226dBrian    */
8837da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@{*/
89c5e9d3114a80d6d35a2f4e65783cdc75fcc2deacChia-I Wu   void (*draw_vbo)( struct pipe_context *pipe,
90c5e9d3114a80d6d35a2f4e65783cdc75fcc2deacChia-I Wu                     const struct pipe_draw_info *info );
9137da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@}*/
921dd55a77c87bd4e057d689163efd070a2dfe3454Brian
93c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul   /**
94c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul    * Predicate subsequent rendering on occlusion query result
95c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul    * \param query  the query predicate, or NULL if no predicate
96d65d5d299357ea77051c86ac81515b37c6ccf97fBrian Paul    * \param mode  one of PIPE_RENDER_COND_x
97c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul    */
98c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul   void (*render_condition)( struct pipe_context *pipe,
99c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul                             struct pipe_query *query,
100c0b4fb06b8b570b1999a0849797d3cb77f6ee5cdBrian Paul                             uint mode );
10173f96c51052bf5233191d852ef463462306bf1d5Brian
10209fbb3837b6aa5dfc6c94f41ab5443820177c569Brian   /**
10309fbb3837b6aa5dfc6c94f41ab5443820177c569Brian    * Query objects
104563479552e2f491fb94e7fac5772f3c72cee962aBrian    */
10537da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@{*/
10613699463a33c1adf44005125c488e886e074a05bKeith Whitwell   struct pipe_query *(*create_query)( struct pipe_context *pipe,
1071c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul                                       unsigned query_type );
10813699463a33c1adf44005125c488e886e074a05bKeith Whitwell
10913699463a33c1adf44005125c488e886e074a05bKeith Whitwell   void (*destroy_query)(struct pipe_context *pipe,
11013699463a33c1adf44005125c488e886e074a05bKeith Whitwell                         struct pipe_query *q);
11113699463a33c1adf44005125c488e886e074a05bKeith Whitwell
11213699463a33c1adf44005125c488e886e074a05bKeith Whitwell   void (*begin_query)(struct pipe_context *pipe, struct pipe_query *q);
11313699463a33c1adf44005125c488e886e074a05bKeith Whitwell   void (*end_query)(struct pipe_context *pipe, struct pipe_query *q);
11413699463a33c1adf44005125c488e886e074a05bKeith Whitwell
11598f3f1c695f232120541670a8b5a355003ce3cc8Brian Paul   /**
11698f3f1c695f232120541670a8b5a355003ce3cc8Brian Paul    * Get results of a query.
11798f3f1c695f232120541670a8b5a355003ce3cc8Brian Paul    * \param wait  if true, this query will block until the result is ready
11898f3f1c695f232120541670a8b5a355003ce3cc8Brian Paul    * \return TRUE if results are ready, FALSE otherwise
11998f3f1c695f232120541670a8b5a355003ce3cc8Brian Paul    */
12034f7681669987bc804f4603463f2fa3f82bc844fZack Rusin   boolean (*get_query_result)(struct pipe_context *pipe,
12113699463a33c1adf44005125c488e886e074a05bKeith Whitwell                               struct pipe_query *q,
12213699463a33c1adf44005125c488e886e074a05bKeith Whitwell                               boolean wait,
123102ed41ae6287f9f43708d10f3952c3c5b887c45Marek Olšák                               union pipe_query_result *result);
12437da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@}*/
125563479552e2f491fb94e7fac5772f3c72cee962aBrian
12637da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /**
12737da2d685102ab5a706e0634fc55c60229598faaBrian Paul    * State functions (create/bind/destroy state objects)
128092a9ecbba4d766da9c0becf888818c020ac226dBrian    */
12937da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@{*/
130c0bf7322088715bb411068c3d631b0c4be8cdff5Zack Rusin   void * (*create_blend_state)(struct pipe_context *,
131c0bf7322088715bb411068c3d631b0c4be8cdff5Zack Rusin                                const struct pipe_blend_state *);
1326cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void   (*bind_blend_state)(struct pipe_context *, void *);
1336cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void   (*delete_blend_state)(struct pipe_context *, void  *);
1349780327c5d95586a88fce94d7b47342355ead118Zack Rusin
1357a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusin   void * (*create_sampler_state)(struct pipe_context *,
1367a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusin                                  const struct pipe_sampler_state *);
13715d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol   void   (*bind_fragment_sampler_states)(struct pipe_context *,
13815d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol                                          unsigned num_samplers,
13915d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol                                          void **samplers);
14015d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol   void   (*bind_vertex_sampler_states)(struct pipe_context *,
14115d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol                                        unsigned num_samplers,
14215d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol                                        void **samplers);
14353bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   void   (*bind_geometry_sampler_states)(struct pipe_context *,
14453bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin                                          unsigned num_samplers,
14553bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin                                          void **samplers);
146d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void   (*bind_compute_sampler_states)(struct pipe_context *,
147d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                                         unsigned start_slot,
148d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                                         unsigned num_samplers,
149d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                                         void **samplers);
1506cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void   (*delete_sampler_state)(struct pipe_context *, void *);
151f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
1526cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void * (*create_rasterizer_state)(struct pipe_context *,
1536cb87cf26f904b891faa42268f373864fa33541dZack Rusin                                     const struct pipe_rasterizer_state *);
1546cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void   (*bind_rasterizer_state)(struct pipe_context *, void *);
1556cb87cf26f904b891faa42268f373864fa33541dZack Rusin   void   (*delete_rasterizer_state)(struct pipe_context *, void *);
156294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin
157bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   void * (*create_depth_stencil_alpha_state)(struct pipe_context *,
158bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell                                        const struct pipe_depth_stencil_alpha_state *);
159bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   void   (*bind_depth_stencil_alpha_state)(struct pipe_context *, void *);
160bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   void   (*delete_depth_stencil_alpha_state)(struct pipe_context *, void *);
161d6ac959833a8e40a27907940969c622692f749b1Zack Rusin
162daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void * (*create_fs_state)(struct pipe_context *,
163daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin                             const struct pipe_shader_state *);
164daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void   (*bind_fs_state)(struct pipe_context *, void *);
165daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void   (*delete_fs_state)(struct pipe_context *, void *);
166daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin
167daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void * (*create_vs_state)(struct pipe_context *,
168daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin                             const struct pipe_shader_state *);
169daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void   (*bind_vs_state)(struct pipe_context *, void *);
170daf5b0f41baa50951e7c2f9ea5cd90b119085a7fZack Rusin   void   (*delete_vs_state)(struct pipe_context *, void *);
17189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
17289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   void * (*create_gs_state)(struct pipe_context *,
17389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                             const struct pipe_shader_state *);
17489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   void   (*bind_gs_state)(struct pipe_context *, void *);
17589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   void   (*delete_gs_state)(struct pipe_context *, void *);
17689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
17751d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger   void * (*create_vertex_elements_state)(struct pipe_context *,
17851d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger                                          unsigned num_elements,
17951d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger                                          const struct pipe_vertex_element *);
18051d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger   void   (*bind_vertex_elements_state)(struct pipe_context *, void *);
18151d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger   void   (*delete_vertex_elements_state)(struct pipe_context *, void *);
18251d139f03898e5e46af6363c6bba131455738cc4Roland Scheidegger
18337da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@}*/
184ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin
18537da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /**
18637da2d685102ab5a706e0634fc55c60229598faaBrian Paul    * Parameter-like state (or properties)
18737da2d685102ab5a706e0634fc55c60229598faaBrian Paul    */
18837da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@{*/
189284efcfc27aaeb447e0898ae3342e9fee20c584aBrian   void (*set_blend_color)( struct pipe_context *,
190284efcfc27aaeb447e0898ae3342e9fee20c584aBrian                            const struct pipe_blend_color * );
191284efcfc27aaeb447e0898ae3342e9fee20c584aBrian
1921a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger   void (*set_stencil_ref)( struct pipe_context *,
1931a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger                            const struct pipe_stencil_ref * );
1941a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger
195aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger   void (*set_sample_mask)( struct pipe_context *,
196aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger                            unsigned sample_mask );
197aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger
198943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell   void (*set_clip_state)( struct pipe_context *,
1991a859ecf4a4728cb321b1f68d51491cd285a3c03Roland Scheidegger                            const struct pipe_clip_state * );
2008e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
201c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian   void (*set_constant_buffer)( struct pipe_context *,
202c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian                                uint shader, uint index,
203507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák                                struct pipe_constant_buffer *buf );
2048f2888758129b0a40d71fa4ce10d606b4bcf7631Brian
205493f7b5f3ae2eb64eaa65e24e79a7a071c359b81Brian   void (*set_framebuffer_state)( struct pipe_context *,
206493f7b5f3ae2eb64eaa65e24e79a7a071c359b81Brian                                  const struct pipe_framebuffer_state * );
207493f7b5f3ae2eb64eaa65e24e79a7a071c359b81Brian
208943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell   void (*set_polygon_stipple)( struct pipe_context *,
209943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell				const struct pipe_poly_stipple * );
2108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
211ea92566ed9cabf5eb5d0993b39c4372d5bfcf3f1Brian   void (*set_scissor_state)( struct pipe_context *,
212ea92566ed9cabf5eb5d0993b39c4372d5bfcf3f1Brian                              const struct pipe_scissor_state * );
2138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
21437da2d685102ab5a706e0634fc55c60229598faaBrian Paul   void (*set_viewport_state)( struct pipe_context *,
21537da2d685102ab5a706e0634fc55c60229598faaBrian Paul                               const struct pipe_viewport_state * );
216c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell
217f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   void (*set_fragment_sampler_views)(struct pipe_context *,
218f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                      unsigned num_views,
219f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                      struct pipe_sampler_view **);
22015d1b406afd733b5f46b16dc933e29c218cdca39Michal Krol
221f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   void (*set_vertex_sampler_views)(struct pipe_context *,
222f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                    unsigned num_views,
223f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                    struct pipe_sampler_view **);
2245d69aeb0028f44d06093faede5c545908b0df89aBrian
22553bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   void (*set_geometry_sampler_views)(struct pipe_context *,
22653bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin                                      unsigned num_views,
22753bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin                                      struct pipe_sampler_view **);
22853bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin
229d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void (*set_compute_sampler_views)(struct pipe_context *,
230d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                                     unsigned start_slot, unsigned num_views,
231d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                                     struct pipe_sampler_view **);
232d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez
2335f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez   /**
2345f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * Bind an array of shader resources that will be used by the
2355f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * graphics pipeline.  Any resources that were previously bound to
2365f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * the specified range will be unbound after this call.
2375f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *
2385f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param first      first resource to bind.
2395f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param count      number of consecutive resources to bind.
2405f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param resources  array of pointers to the resources to bind, it
2415f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   should contain at least \a count elements
2425f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   unless it's NULL, in which case no new
2435f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   resources will be bound.
2445f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    */
2455f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez   void (*set_shader_resources)(struct pipe_context *,
2465f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez                                unsigned start, unsigned count,
2475f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez                                struct pipe_surface **resources);
2485f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez
249a52c0416d1f2105960b4646e2e268aed26814689Brian Paul   void (*set_vertex_buffers)( struct pipe_context *,
250a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                               unsigned num_buffers,
251a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                               const struct pipe_vertex_buffer * );
25263a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
253c5e9d3114a80d6d35a2f4e65783cdc75fcc2deacChia-I Wu   void (*set_index_buffer)( struct pipe_context *pipe,
254c5e9d3114a80d6d35a2f4e65783cdc75fcc2deacChia-I Wu                             const struct pipe_index_buffer * );
255c5e9d3114a80d6d35a2f4e65783cdc75fcc2deacChia-I Wu
256861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   /*@}*/
257861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák
258861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   /**
259861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák    * Stream output functions.
260861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák    */
261861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   /*@{*/
262861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák
263861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   struct pipe_stream_output_target *(*create_stream_output_target)(
264861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                        struct pipe_context *,
265861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                        struct pipe_resource *,
266861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                        unsigned buffer_offset,
267861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                        unsigned buffer_size);
268861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák
269861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   void (*stream_output_target_destroy)(struct pipe_context *,
270861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                                        struct pipe_stream_output_target *);
271861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák
272861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák   void (*set_stream_output_targets)(struct pipe_context *,
273861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                              unsigned num_targets,
274861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                              struct pipe_stream_output_target **targets,
275861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                              unsigned append_bitmask);
276a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin
27737da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@}*/
27863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
27963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
28037da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /**
281aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * Resource functions for blit-like functionality
282bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson    *
283aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * If a driver supports multisampling, resource_resolve must be available.
28411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer    */
28537da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@{*/
28692d3b2a4da914a64bf0de4be4843a8524b1a8af6Brian Paul
28792d3b2a4da914a64bf0de4be4843a8524b1a8af6Brian Paul   /**
288aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * Copy a block of pixels from one resource to another.
289aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * The resource must be of the same format.
290aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * Resources with nr_samples > 1 are not allowed.
29192d3b2a4da914a64bf0de4be4843a8524b1a8af6Brian Paul    */
292aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger   void (*resource_copy_region)(struct pipe_context *pipe,
293aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger                                struct pipe_resource *dst,
2944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                unsigned dst_level,
295aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger                                unsigned dstx, unsigned dsty, unsigned dstz,
296aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger                                struct pipe_resource *src,
2974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                unsigned src_level,
2984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                const struct pipe_box *src_box);
29911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
30092d3b2a4da914a64bf0de4be4843a8524b1a8af6Brian Paul   /**
301aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    * Resolve a multisampled resource into a non-multisampled one.
30294822c6d83b7811db2a02bb4416df02ae225ba47Christoph Bumiller    * Source and destination must be of the same format.
303aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger    */
304aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger   void (*resource_resolve)(struct pipe_context *pipe,
30594822c6d83b7811db2a02bb4416df02ae225ba47Christoph Bumiller                            const struct pipe_resolve_info *info);
306aac2cccccfd701ae8d7ce0813c28c64498d4a076Roland Scheidegger
30737da2d685102ab5a706e0634fc55c60229598faaBrian Paul   /*@}*/
308f3aa4de034b0d791ce2e38e8aeb3b3abdb4e3b50Keith Whitwell
309eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer   /**
310eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer    * Clear the specified set of currently bound buffers to specified values.
3111c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul    * The entire buffers are cleared (no scissor, no colormask, etc).
312eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer    *
3131c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul    * \param buffers  bitfield of PIPE_CLEAR_* values.
3146dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie    * \param color  pointer to a union of fiu array for each of r, g, b, a.
3151c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul    * \param depth  depth clear value in [0,1].
3161c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul    * \param stencil  stencil clear value
317eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer    */
318eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer   void (*clear)(struct pipe_context *pipe,
319eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer                 unsigned buffers,
3206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                 const union pipe_color_union *color,
321eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer                 double depth,
3220cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger                 unsigned stencil);
3230cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger
3240cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger   /**
3250cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    * Clear a color rendertarget surface.
3266dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie    * \param color  pointer to an union of fiu array for each of r, g, b, a.
3270cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    */
328a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger   void (*clear_render_target)(struct pipe_context *pipe,
329a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               struct pipe_surface *dst,
3306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                               const union pipe_color_union *color,
331a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned dstx, unsigned dsty,
332a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned width, unsigned height);
3330cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger
3340cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger   /**
3350cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    * Clear a depth-stencil surface.
3360cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    * \param clear_flags  bitfield of PIPE_CLEAR_DEPTH/STENCIL values.
3370cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    * \param depth  depth clear value in [0,1].
3380cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    * \param stencil  stencil clear value
3390cd70b554cb0bb9280f83fddf4f1451fddd37230Roland Scheidegger    */
340a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger   void (*clear_depth_stencil)(struct pipe_context *pipe,
341a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               struct pipe_surface *dst,
342a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned clear_flags,
343a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               double depth,
344a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned stencil,
345a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned dstx, unsigned dsty,
346a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheidegger                               unsigned width, unsigned height);
34737da2d685102ab5a706e0634fc55c60229598faaBrian Paul
3487e02303497237cde958c28608477d0c355a8038bMarek Olšák   /** Flush draw commands
3491c1ee1176d889ff5ff0a41af9ad385c4532322a3Brian Paul    */
35093d5cfd8b7c641c5656aed38ad2f9559e09502f0Keith Whitwell   void (*flush)( struct pipe_context *pipe,
3514abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer                  struct pipe_fence_handle **fence );
3529b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom
3539b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom   /**
354f6106566081978f663cf08e54bb8908cb58a5316Michal Krol    * Create a view on a texture to be used by a shader stage.
355f6106566081978f663cf08e54bb8908cb58a5316Michal Krol    */
356f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   struct pipe_sampler_view * (*create_sampler_view)(struct pipe_context *ctx,
357287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                                     struct pipe_resource *texture,
358f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                                     const struct pipe_sampler_view *templat);
359f6106566081978f663cf08e54bb8908cb58a5316Michal Krol
360f6106566081978f663cf08e54bb8908cb58a5316Michal Krol   void (*sampler_view_destroy)(struct pipe_context *ctx,
361f6106566081978f663cf08e54bb8908cb58a5316Michal Krol                                struct pipe_sampler_view *view);
362b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell
363b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell
364b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   /**
3654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    * Get a surface which is a "view" into a resource, used by
3664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    * render target / depth stencil stages.
3674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    * \param usage  bitmaks of PIPE_BIND_* flags
3684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    */
3694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *(*create_surface)(struct pipe_context *ctx,
3704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                          struct pipe_resource *resource,
3714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                          const struct pipe_surface *templat);
3724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
3734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   void (*surface_destroy)(struct pipe_context *ctx,
3744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                           struct pipe_surface *);
3754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
3764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   /**
377b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell    * Get a transfer object for transferring data to/from a texture.
378b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell    *
379b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell    * Transfers are (by default) context-private and allow uploads to be
380b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell    * interleaved with
381b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell    */
382287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_transfer *(*get_transfer)(struct pipe_context *,
3834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         struct pipe_resource *resource,
3844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         unsigned level,
3854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         unsigned usage,  /* a combination of PIPE_TRANSFER_x */
3864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                         const struct pipe_box *);
387287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
388287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   void (*transfer_destroy)(struct pipe_context *,
3894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                            struct pipe_transfer *);
3904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
391b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   void *(*transfer_map)( struct pipe_context *,
392b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell                          struct pipe_transfer *transfer );
393b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell
394287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   /* If transfer was created with WRITE|FLUSH_EXPLICIT, only the
395287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    * regions specified with this call are guaranteed to be written to
396287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    * the resource.
397287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    */
398287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   void (*transfer_flush_region)( struct pipe_context *,
399287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell				  struct pipe_transfer *transfer,
400287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell				  const struct pipe_box *);
401287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
402b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   void (*transfer_unmap)( struct pipe_context *,
403b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell                           struct pipe_transfer *transfer );
404b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell
405b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell
406287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   /* One-shot transfer operation with data supplied in a user
407287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    * pointer.  XXX: strides??
408287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell    */
409287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   void (*transfer_inline_write)( struct pipe_context *,
4104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  struct pipe_resource *,
4114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  unsigned level,
4124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  unsigned usage, /* a combination of PIPE_TRANSFER_x */
4134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  const struct pipe_box *,
4144c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  const void *data,
4154c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  unsigned stride,
4164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  unsigned layer_stride);
417287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
418aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák   /**
419aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák    * Flush any pending framebuffer writes and invalidate texture caches.
420aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák    */
421aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák   void (*texture_barrier)(struct pipe_context *);
4224e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4234e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   /**
424ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König    * Creates a video decoder for a specific video codec/profile
425ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König    */
426ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_video_decoder *(*create_video_decoder)( struct pipe_context *context,
427ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König                                                       enum pipe_video_profile profile,
428ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König                                                       enum pipe_video_entrypoint entrypoint,
429ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König                                                       enum pipe_video_chroma_format chroma_format,
4308c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                                       unsigned width, unsigned height, unsigned max_references,
4318c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                                       bool expect_chunked_decode);
432ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König
433ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   /**
4344e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König    * Creates a video buffer as decoding target
4354e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König    */
4364e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   struct pipe_video_buffer *(*create_video_buffer)( struct pipe_context *context,
437e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                                                     const struct pipe_video_buffer *templat );
438d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez
439d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /**
440d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * Compute kernel execution
441d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    */
442d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /*@{*/
443d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /**
444d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * Define the compute program and parameters to be used by
445d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * pipe_context::launch_grid.
446d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    */
447d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void *(*create_compute_state)(struct pipe_context *context,
448d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez				 const struct pipe_compute_state *);
449d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void (*bind_compute_state)(struct pipe_context *, void *);
450d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void (*delete_compute_state)(struct pipe_context *, void *);
451d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez
452d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /**
4535f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * Bind an array of shader resources that will be used by the
4545f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * compute program.  Any resources that were previously bound to
4555f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * the specified range will be unbound after this call.
4565f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *
4575f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param first      first resource to bind.
4585f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param count      number of consecutive resources to bind.
4595f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    * \param resources  array of pointers to the resources to bind, it
4605f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   should contain at least \a count elements
4615f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   unless it's NULL, in which case no new
4625f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    *                   resources will be bound.
4635f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez    */
4645f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez   void (*set_compute_resources)(struct pipe_context *,
4655f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez                                 unsigned start, unsigned count,
4665f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez                                 struct pipe_surface **resources);
4675f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez
4685f55cbc7d93c6568566893f9345e43fff311a32bFrancisco Jerez   /**
469d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * Bind an array of buffers to be mapped into the address space of
470d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * the GLOBAL resource.  Any buffers that were previously bound
471d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * between [first, first + count - 1] are unbound after this call.
472d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *
473d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \param first      first buffer to map.
474d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \param count      number of consecutive buffers to map.
475d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \param resources  array of pointers to the buffers to map, it
476d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   should contain at least \a count elements
477d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   unless it's NULL, in which case no new
478d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   resources will be bound.
479d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \param handles    array of pointers to the memory locations that
480d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   will be filled with the respective base
481d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   addresses each buffer will be mapped to.  It
482d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   should contain at least \a count elements,
483d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   unless \a resources is NULL in which case \a
484d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *                   handles should be NULL as well.
485d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *
486d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * Note that the driver isn't required to make any guarantees about
487d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * the contents of the \a handles array being valid anytime except
488d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * during the subsequent calls to pipe_context::launch_grid.  This
489d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * means that the only sensible location handles[i] may point to is
490d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * somewhere within the INPUT buffer itself.  This is so to
491d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * accommodate implementations that lack virtual memory but
492d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * nevertheless migrate buffers on the fly, leading to resource
493d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * base addresses that change on each kernel invocation or are
494d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * unknown to the pipe driver.
495d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    */
496d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void (*set_global_binding)(struct pipe_context *context,
497d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                              unsigned first, unsigned count,
498d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                              struct pipe_resource **resources,
499d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                              uint32_t **handles);
500d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez
501d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /**
502d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * Launch the compute kernel starting from instruction \a pc of the
503d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * currently bound compute program.
504d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *
505d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \a grid_layout and \a block_layout are arrays of size \a
506d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * PIPE_COMPUTE_CAP_GRID_DIMENSION that determine the layout of the
507d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * grid (in block units) and working block (in thread units) to be
508d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * used, respectively.
509d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    *
510d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * \a input will be used to initialize the INPUT resource, and it
511d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * should point to a buffer of at least
512d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    * pipe_compute_state::req_input_mem bytes.
513d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez    */
514d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   void (*launch_grid)(struct pipe_context *context,
515d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                       const uint *block_layout, const uint *grid_layout,
516d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez                       uint32_t pc, const void *input);
517d9d82dcd006c124e6569789c90390c43c1360c06Francisco Jerez   /*@}*/
5188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell};
5198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
520e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca
521e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca#ifdef __cplusplus
522e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca}
523e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca#endif
524e4e30089231831339815cccebf3a3a0ea6dcd2a9José Fonseca
5252f245bce420c7a6c6928c4927d0f9a5701cde17fBrian#endif /* PIPE_CONTEXT_H */
526