p_context.h revision 5f55cbc7d93c6568566893f9345e43fff311a32b
1/**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS 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
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39
40struct pipe_blend_color;
41struct pipe_blend_state;
42struct pipe_box;
43struct pipe_clip_state;
44struct pipe_depth_stencil_alpha_state;
45struct pipe_draw_info;
46struct pipe_fence_handle;
47struct pipe_framebuffer_state;
48struct pipe_index_buffer;
49struct pipe_query;
50struct pipe_poly_stipple;
51struct pipe_rasterizer_state;
52struct pipe_resolve_info;
53struct pipe_resource;
54struct pipe_sampler_state;
55struct pipe_sampler_view;
56struct pipe_scissor_state;
57struct pipe_shader_state;
58struct pipe_stencil_ref;
59struct pipe_stream_output_target;
60struct pipe_surface;
61struct pipe_vertex_buffer;
62struct pipe_vertex_element;
63struct pipe_video_buffer;
64struct pipe_video_decoder;
65struct pipe_viewport_state;
66struct pipe_compute_state;
67union pipe_color_union;
68union pipe_query_result;
69
70/**
71 * Gallium rendering context.  Basically:
72 *  - state setting functions
73 *  - VBO drawing functions
74 *  - surface functions
75 */
76struct pipe_context {
77   struct pipe_screen *screen;
78
79   void *priv;  /**< context private data (for DRI for example) */
80   void *draw;  /**< private, for draw module (temporary?) */
81
82   void (*destroy)( struct pipe_context * );
83
84   /**
85    * VBO drawing
86    */
87   /*@{*/
88   void (*draw_vbo)( struct pipe_context *pipe,
89                     const struct pipe_draw_info *info );
90   /*@}*/
91
92   /**
93    * Predicate subsequent rendering on occlusion query result
94    * \param query  the query predicate, or NULL if no predicate
95    * \param mode  one of PIPE_RENDER_COND_x
96    */
97   void (*render_condition)( struct pipe_context *pipe,
98                             struct pipe_query *query,
99                             uint mode );
100
101   /**
102    * Query objects
103    */
104   /*@{*/
105   struct pipe_query *(*create_query)( struct pipe_context *pipe,
106                                       unsigned query_type );
107
108   void (*destroy_query)(struct pipe_context *pipe,
109                         struct pipe_query *q);
110
111   void (*begin_query)(struct pipe_context *pipe, struct pipe_query *q);
112   void (*end_query)(struct pipe_context *pipe, struct pipe_query *q);
113
114   /**
115    * Get results of a query.
116    * \param wait  if true, this query will block until the result is ready
117    * \return TRUE if results are ready, FALSE otherwise
118    */
119   boolean (*get_query_result)(struct pipe_context *pipe,
120                               struct pipe_query *q,
121                               boolean wait,
122                               union pipe_query_result *result);
123   /*@}*/
124
125   /**
126    * State functions (create/bind/destroy state objects)
127    */
128   /*@{*/
129   void * (*create_blend_state)(struct pipe_context *,
130                                const struct pipe_blend_state *);
131   void   (*bind_blend_state)(struct pipe_context *, void *);
132   void   (*delete_blend_state)(struct pipe_context *, void  *);
133
134   void * (*create_sampler_state)(struct pipe_context *,
135                                  const struct pipe_sampler_state *);
136   void   (*bind_fragment_sampler_states)(struct pipe_context *,
137                                          unsigned num_samplers,
138                                          void **samplers);
139   void   (*bind_vertex_sampler_states)(struct pipe_context *,
140                                        unsigned num_samplers,
141                                        void **samplers);
142   void   (*bind_geometry_sampler_states)(struct pipe_context *,
143                                          unsigned num_samplers,
144                                          void **samplers);
145   void   (*bind_compute_sampler_states)(struct pipe_context *,
146                                         unsigned start_slot,
147                                         unsigned num_samplers,
148                                         void **samplers);
149   void   (*delete_sampler_state)(struct pipe_context *, void *);
150
151   void * (*create_rasterizer_state)(struct pipe_context *,
152                                     const struct pipe_rasterizer_state *);
153   void   (*bind_rasterizer_state)(struct pipe_context *, void *);
154   void   (*delete_rasterizer_state)(struct pipe_context *, void *);
155
156   void * (*create_depth_stencil_alpha_state)(struct pipe_context *,
157                                        const struct pipe_depth_stencil_alpha_state *);
158   void   (*bind_depth_stencil_alpha_state)(struct pipe_context *, void *);
159   void   (*delete_depth_stencil_alpha_state)(struct pipe_context *, void *);
160
161   void * (*create_fs_state)(struct pipe_context *,
162                             const struct pipe_shader_state *);
163   void   (*bind_fs_state)(struct pipe_context *, void *);
164   void   (*delete_fs_state)(struct pipe_context *, void *);
165
166   void * (*create_vs_state)(struct pipe_context *,
167                             const struct pipe_shader_state *);
168   void   (*bind_vs_state)(struct pipe_context *, void *);
169   void   (*delete_vs_state)(struct pipe_context *, void *);
170
171   void * (*create_gs_state)(struct pipe_context *,
172                             const struct pipe_shader_state *);
173   void   (*bind_gs_state)(struct pipe_context *, void *);
174   void   (*delete_gs_state)(struct pipe_context *, void *);
175
176   void * (*create_vertex_elements_state)(struct pipe_context *,
177                                          unsigned num_elements,
178                                          const struct pipe_vertex_element *);
179   void   (*bind_vertex_elements_state)(struct pipe_context *, void *);
180   void   (*delete_vertex_elements_state)(struct pipe_context *, void *);
181
182   /*@}*/
183
184   /**
185    * Parameter-like state (or properties)
186    */
187   /*@{*/
188   void (*set_blend_color)( struct pipe_context *,
189                            const struct pipe_blend_color * );
190
191   void (*set_stencil_ref)( struct pipe_context *,
192                            const struct pipe_stencil_ref * );
193
194   void (*set_sample_mask)( struct pipe_context *,
195                            unsigned sample_mask );
196
197   void (*set_clip_state)( struct pipe_context *,
198                            const struct pipe_clip_state * );
199
200   void (*set_constant_buffer)( struct pipe_context *,
201                                uint shader, uint index,
202                                struct pipe_resource *buf );
203
204   void (*set_framebuffer_state)( struct pipe_context *,
205                                  const struct pipe_framebuffer_state * );
206
207   void (*set_polygon_stipple)( struct pipe_context *,
208				const struct pipe_poly_stipple * );
209
210   void (*set_scissor_state)( struct pipe_context *,
211                              const struct pipe_scissor_state * );
212
213   void (*set_viewport_state)( struct pipe_context *,
214                               const struct pipe_viewport_state * );
215
216   void (*set_fragment_sampler_views)(struct pipe_context *,
217                                      unsigned num_views,
218                                      struct pipe_sampler_view **);
219
220   void (*set_vertex_sampler_views)(struct pipe_context *,
221                                    unsigned num_views,
222                                    struct pipe_sampler_view **);
223
224   void (*set_geometry_sampler_views)(struct pipe_context *,
225                                      unsigned num_views,
226                                      struct pipe_sampler_view **);
227
228   void (*set_compute_sampler_views)(struct pipe_context *,
229                                     unsigned start_slot, unsigned num_views,
230                                     struct pipe_sampler_view **);
231
232   /**
233    * Bind an array of shader resources that will be used by the
234    * graphics pipeline.  Any resources that were previously bound to
235    * the specified range will be unbound after this call.
236    *
237    * \param first      first resource to bind.
238    * \param count      number of consecutive resources to bind.
239    * \param resources  array of pointers to the resources to bind, it
240    *                   should contain at least \a count elements
241    *                   unless it's NULL, in which case no new
242    *                   resources will be bound.
243    */
244   void (*set_shader_resources)(struct pipe_context *,
245                                unsigned start, unsigned count,
246                                struct pipe_surface **resources);
247
248   void (*set_vertex_buffers)( struct pipe_context *,
249                               unsigned num_buffers,
250                               const struct pipe_vertex_buffer * );
251
252   void (*set_index_buffer)( struct pipe_context *pipe,
253                             const struct pipe_index_buffer * );
254
255   /*@}*/
256
257   /**
258    * Stream output functions.
259    */
260   /*@{*/
261
262   struct pipe_stream_output_target *(*create_stream_output_target)(
263                        struct pipe_context *,
264                        struct pipe_resource *,
265                        unsigned buffer_offset,
266                        unsigned buffer_size);
267
268   void (*stream_output_target_destroy)(struct pipe_context *,
269                                        struct pipe_stream_output_target *);
270
271   void (*set_stream_output_targets)(struct pipe_context *,
272                              unsigned num_targets,
273                              struct pipe_stream_output_target **targets,
274                              unsigned append_bitmask);
275
276   /*@}*/
277
278
279   /**
280    * Resource functions for blit-like functionality
281    *
282    * If a driver supports multisampling, resource_resolve must be available.
283    */
284   /*@{*/
285
286   /**
287    * Copy a block of pixels from one resource to another.
288    * The resource must be of the same format.
289    * Resources with nr_samples > 1 are not allowed.
290    */
291   void (*resource_copy_region)(struct pipe_context *pipe,
292                                struct pipe_resource *dst,
293                                unsigned dst_level,
294                                unsigned dstx, unsigned dsty, unsigned dstz,
295                                struct pipe_resource *src,
296                                unsigned src_level,
297                                const struct pipe_box *src_box);
298
299   /**
300    * Resolve a multisampled resource into a non-multisampled one.
301    * Source and destination must be of the same format.
302    */
303   void (*resource_resolve)(struct pipe_context *pipe,
304                            const struct pipe_resolve_info *info);
305
306   /*@}*/
307
308   /**
309    * Clear the specified set of currently bound buffers to specified values.
310    * The entire buffers are cleared (no scissor, no colormask, etc).
311    *
312    * \param buffers  bitfield of PIPE_CLEAR_* values.
313    * \param color  pointer to a union of fiu array for each of r, g, b, a.
314    * \param depth  depth clear value in [0,1].
315    * \param stencil  stencil clear value
316    */
317   void (*clear)(struct pipe_context *pipe,
318                 unsigned buffers,
319                 const union pipe_color_union *color,
320                 double depth,
321                 unsigned stencil);
322
323   /**
324    * Clear a color rendertarget surface.
325    * \param color  pointer to an union of fiu array for each of r, g, b, a.
326    */
327   void (*clear_render_target)(struct pipe_context *pipe,
328                               struct pipe_surface *dst,
329                               const union pipe_color_union *color,
330                               unsigned dstx, unsigned dsty,
331                               unsigned width, unsigned height);
332
333   /**
334    * Clear a depth-stencil surface.
335    * \param clear_flags  bitfield of PIPE_CLEAR_DEPTH/STENCIL values.
336    * \param depth  depth clear value in [0,1].
337    * \param stencil  stencil clear value
338    */
339   void (*clear_depth_stencil)(struct pipe_context *pipe,
340                               struct pipe_surface *dst,
341                               unsigned clear_flags,
342                               double depth,
343                               unsigned stencil,
344                               unsigned dstx, unsigned dsty,
345                               unsigned width, unsigned height);
346
347   /** Flush draw commands
348    */
349   void (*flush)( struct pipe_context *pipe,
350                  struct pipe_fence_handle **fence );
351
352   /**
353    * Create a view on a texture to be used by a shader stage.
354    */
355   struct pipe_sampler_view * (*create_sampler_view)(struct pipe_context *ctx,
356                                                     struct pipe_resource *texture,
357                                                     const struct pipe_sampler_view *templat);
358
359   void (*sampler_view_destroy)(struct pipe_context *ctx,
360                                struct pipe_sampler_view *view);
361
362
363   /**
364    * Get a surface which is a "view" into a resource, used by
365    * render target / depth stencil stages.
366    * \param usage  bitmaks of PIPE_BIND_* flags
367    */
368   struct pipe_surface *(*create_surface)(struct pipe_context *ctx,
369                                          struct pipe_resource *resource,
370                                          const struct pipe_surface *templat);
371
372   void (*surface_destroy)(struct pipe_context *ctx,
373                           struct pipe_surface *);
374
375   /**
376    * Get a transfer object for transferring data to/from a texture.
377    *
378    * Transfers are (by default) context-private and allow uploads to be
379    * interleaved with
380    */
381   struct pipe_transfer *(*get_transfer)(struct pipe_context *,
382                                         struct pipe_resource *resource,
383                                         unsigned level,
384                                         unsigned usage,  /* a combination of PIPE_TRANSFER_x */
385                                         const struct pipe_box *);
386
387   void (*transfer_destroy)(struct pipe_context *,
388                            struct pipe_transfer *);
389
390   void *(*transfer_map)( struct pipe_context *,
391                          struct pipe_transfer *transfer );
392
393   /* If transfer was created with WRITE|FLUSH_EXPLICIT, only the
394    * regions specified with this call are guaranteed to be written to
395    * the resource.
396    */
397   void (*transfer_flush_region)( struct pipe_context *,
398				  struct pipe_transfer *transfer,
399				  const struct pipe_box *);
400
401   void (*transfer_unmap)( struct pipe_context *,
402                           struct pipe_transfer *transfer );
403
404
405   /* One-shot transfer operation with data supplied in a user
406    * pointer.  XXX: strides??
407    */
408   void (*transfer_inline_write)( struct pipe_context *,
409                                  struct pipe_resource *,
410                                  unsigned level,
411                                  unsigned usage, /* a combination of PIPE_TRANSFER_x */
412                                  const struct pipe_box *,
413                                  const void *data,
414                                  unsigned stride,
415                                  unsigned layer_stride);
416
417
418   /* Notify a driver that a content of a user buffer has been changed.
419    * The changed range is [offset, offset+size-1].
420    * The new width0 of the buffer is offset+size. */
421   void (*redefine_user_buffer)(struct pipe_context *,
422                                struct pipe_resource *,
423                                unsigned offset,
424                                unsigned size);
425
426   /**
427    * Flush any pending framebuffer writes and invalidate texture caches.
428    */
429   void (*texture_barrier)(struct pipe_context *);
430
431   /**
432    * Creates a video decoder for a specific video codec/profile
433    */
434   struct pipe_video_decoder *(*create_video_decoder)( struct pipe_context *context,
435                                                       enum pipe_video_profile profile,
436                                                       enum pipe_video_entrypoint entrypoint,
437                                                       enum pipe_video_chroma_format chroma_format,
438                                                       unsigned width, unsigned height, unsigned max_references,
439                                                       bool expect_chunked_decode);
440
441   /**
442    * Creates a video buffer as decoding target
443    */
444   struct pipe_video_buffer *(*create_video_buffer)( struct pipe_context *context,
445                                                     const struct pipe_video_buffer *templat );
446
447   /**
448    * Compute kernel execution
449    */
450   /*@{*/
451   /**
452    * Define the compute program and parameters to be used by
453    * pipe_context::launch_grid.
454    */
455   void *(*create_compute_state)(struct pipe_context *context,
456				 const struct pipe_compute_state *);
457   void (*bind_compute_state)(struct pipe_context *, void *);
458   void (*delete_compute_state)(struct pipe_context *, void *);
459
460   /**
461    * Bind an array of shader resources that will be used by the
462    * compute program.  Any resources that were previously bound to
463    * the specified range will be unbound after this call.
464    *
465    * \param first      first resource to bind.
466    * \param count      number of consecutive resources to bind.
467    * \param resources  array of pointers to the resources to bind, it
468    *                   should contain at least \a count elements
469    *                   unless it's NULL, in which case no new
470    *                   resources will be bound.
471    */
472   void (*set_compute_resources)(struct pipe_context *,
473                                 unsigned start, unsigned count,
474                                 struct pipe_surface **resources);
475
476   /**
477    * Bind an array of buffers to be mapped into the address space of
478    * the GLOBAL resource.  Any buffers that were previously bound
479    * between [first, first + count - 1] are unbound after this call.
480    *
481    * \param first      first buffer to map.
482    * \param count      number of consecutive buffers to map.
483    * \param resources  array of pointers to the buffers to map, it
484    *                   should contain at least \a count elements
485    *                   unless it's NULL, in which case no new
486    *                   resources will be bound.
487    * \param handles    array of pointers to the memory locations that
488    *                   will be filled with the respective base
489    *                   addresses each buffer will be mapped to.  It
490    *                   should contain at least \a count elements,
491    *                   unless \a resources is NULL in which case \a
492    *                   handles should be NULL as well.
493    *
494    * Note that the driver isn't required to make any guarantees about
495    * the contents of the \a handles array being valid anytime except
496    * during the subsequent calls to pipe_context::launch_grid.  This
497    * means that the only sensible location handles[i] may point to is
498    * somewhere within the INPUT buffer itself.  This is so to
499    * accommodate implementations that lack virtual memory but
500    * nevertheless migrate buffers on the fly, leading to resource
501    * base addresses that change on each kernel invocation or are
502    * unknown to the pipe driver.
503    */
504   void (*set_global_binding)(struct pipe_context *context,
505                              unsigned first, unsigned count,
506                              struct pipe_resource **resources,
507                              uint32_t **handles);
508
509   /**
510    * Launch the compute kernel starting from instruction \a pc of the
511    * currently bound compute program.
512    *
513    * \a grid_layout and \a block_layout are arrays of size \a
514    * PIPE_COMPUTE_CAP_GRID_DIMENSION that determine the layout of the
515    * grid (in block units) and working block (in thread units) to be
516    * used, respectively.
517    *
518    * \a input will be used to initialize the INPUT resource, and it
519    * should point to a buffer of at least
520    * pipe_compute_state::req_input_mem bytes.
521    */
522   void (*launch_grid)(struct pipe_context *context,
523                       const uint *block_layout, const uint *grid_layout,
524                       uint32_t pc, const void *input);
525   /*@}*/
526};
527
528
529#ifdef __cplusplus
530}
531#endif
532
533#endif /* PIPE_CONTEXT_H */
534