p_context.h revision 861a029ddb31e91bb4d8e18ab708d0d172f63aad
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; 66union pipe_color_union; 67 68/** 69 * Gallium rendering context. Basically: 70 * - state setting functions 71 * - VBO drawing functions 72 * - surface functions 73 */ 74struct pipe_context { 75 struct pipe_winsys *winsys; 76 struct pipe_screen *screen; 77 78 void *priv; /**< context private data (for DRI for example) */ 79 void *draw; /**< private, for draw module (temporary?) */ 80 81 void (*destroy)( struct pipe_context * ); 82 83 /** 84 * VBO drawing 85 */ 86 /*@{*/ 87 void (*draw_vbo)( struct pipe_context *pipe, 88 const struct pipe_draw_info *info ); 89 /*@}*/ 90 91 /** 92 * Predicate subsequent rendering on occlusion query result 93 * \param query the query predicate, or NULL if no predicate 94 * \param mode one of PIPE_RENDER_COND_x 95 */ 96 void (*render_condition)( struct pipe_context *pipe, 97 struct pipe_query *query, 98 uint mode ); 99 100 /** 101 * Query objects 102 */ 103 /*@{*/ 104 struct pipe_query *(*create_query)( struct pipe_context *pipe, 105 unsigned query_type ); 106 107 void (*destroy_query)(struct pipe_context *pipe, 108 struct pipe_query *q); 109 110 void (*begin_query)(struct pipe_context *pipe, struct pipe_query *q); 111 void (*end_query)(struct pipe_context *pipe, struct pipe_query *q); 112 113 /** 114 * Get results of a query. 115 * \param wait if true, this query will block until the result is ready 116 * \return TRUE if results are ready, FALSE otherwise 117 */ 118 boolean (*get_query_result)(struct pipe_context *pipe, 119 struct pipe_query *q, 120 boolean wait, 121 void *result); 122 /*@}*/ 123 124 /** 125 * State functions (create/bind/destroy state objects) 126 */ 127 /*@{*/ 128 void * (*create_blend_state)(struct pipe_context *, 129 const struct pipe_blend_state *); 130 void (*bind_blend_state)(struct pipe_context *, void *); 131 void (*delete_blend_state)(struct pipe_context *, void *); 132 133 void * (*create_sampler_state)(struct pipe_context *, 134 const struct pipe_sampler_state *); 135 void (*bind_fragment_sampler_states)(struct pipe_context *, 136 unsigned num_samplers, 137 void **samplers); 138 void (*bind_vertex_sampler_states)(struct pipe_context *, 139 unsigned num_samplers, 140 void **samplers); 141 void (*bind_geometry_sampler_states)(struct pipe_context *, 142 unsigned num_samplers, 143 void **samplers); 144 void (*delete_sampler_state)(struct pipe_context *, void *); 145 146 void * (*create_rasterizer_state)(struct pipe_context *, 147 const struct pipe_rasterizer_state *); 148 void (*bind_rasterizer_state)(struct pipe_context *, void *); 149 void (*delete_rasterizer_state)(struct pipe_context *, void *); 150 151 void * (*create_depth_stencil_alpha_state)(struct pipe_context *, 152 const struct pipe_depth_stencil_alpha_state *); 153 void (*bind_depth_stencil_alpha_state)(struct pipe_context *, void *); 154 void (*delete_depth_stencil_alpha_state)(struct pipe_context *, void *); 155 156 void * (*create_fs_state)(struct pipe_context *, 157 const struct pipe_shader_state *); 158 void (*bind_fs_state)(struct pipe_context *, void *); 159 void (*delete_fs_state)(struct pipe_context *, void *); 160 161 void * (*create_vs_state)(struct pipe_context *, 162 const struct pipe_shader_state *); 163 void (*bind_vs_state)(struct pipe_context *, void *); 164 void (*delete_vs_state)(struct pipe_context *, void *); 165 166 void * (*create_gs_state)(struct pipe_context *, 167 const struct pipe_shader_state *); 168 void (*bind_gs_state)(struct pipe_context *, void *); 169 void (*delete_gs_state)(struct pipe_context *, void *); 170 171 void * (*create_vertex_elements_state)(struct pipe_context *, 172 unsigned num_elements, 173 const struct pipe_vertex_element *); 174 void (*bind_vertex_elements_state)(struct pipe_context *, void *); 175 void (*delete_vertex_elements_state)(struct pipe_context *, void *); 176 177 /*@}*/ 178 179 /** 180 * Parameter-like state (or properties) 181 */ 182 /*@{*/ 183 void (*set_blend_color)( struct pipe_context *, 184 const struct pipe_blend_color * ); 185 186 void (*set_stencil_ref)( struct pipe_context *, 187 const struct pipe_stencil_ref * ); 188 189 void (*set_sample_mask)( struct pipe_context *, 190 unsigned sample_mask ); 191 192 void (*set_clip_state)( struct pipe_context *, 193 const struct pipe_clip_state * ); 194 195 void (*set_constant_buffer)( struct pipe_context *, 196 uint shader, uint index, 197 struct pipe_resource *buf ); 198 199 void (*set_framebuffer_state)( struct pipe_context *, 200 const struct pipe_framebuffer_state * ); 201 202 void (*set_polygon_stipple)( struct pipe_context *, 203 const struct pipe_poly_stipple * ); 204 205 void (*set_scissor_state)( struct pipe_context *, 206 const struct pipe_scissor_state * ); 207 208 void (*set_viewport_state)( struct pipe_context *, 209 const struct pipe_viewport_state * ); 210 211 void (*set_fragment_sampler_views)(struct pipe_context *, 212 unsigned num_views, 213 struct pipe_sampler_view **); 214 215 void (*set_vertex_sampler_views)(struct pipe_context *, 216 unsigned num_views, 217 struct pipe_sampler_view **); 218 219 void (*set_geometry_sampler_views)(struct pipe_context *, 220 unsigned num_views, 221 struct pipe_sampler_view **); 222 223 void (*set_vertex_buffers)( struct pipe_context *, 224 unsigned num_buffers, 225 const struct pipe_vertex_buffer * ); 226 227 void (*set_index_buffer)( struct pipe_context *pipe, 228 const struct pipe_index_buffer * ); 229 230 /*@}*/ 231 232 /** 233 * Stream output functions. 234 */ 235 /*@{*/ 236 237 struct pipe_stream_output_target *(*create_stream_output_target)( 238 struct pipe_context *, 239 struct pipe_resource *, 240 unsigned buffer_offset, 241 unsigned buffer_size); 242 243 void (*stream_output_target_destroy)(struct pipe_context *, 244 struct pipe_stream_output_target *); 245 246 void (*set_stream_output_targets)(struct pipe_context *, 247 unsigned num_targets, 248 struct pipe_stream_output_target **targets, 249 unsigned append_bitmask); 250 251 /*@}*/ 252 253 254 /** 255 * Resource functions for blit-like functionality 256 * 257 * If a driver supports multisampling, resource_resolve must be available. 258 */ 259 /*@{*/ 260 261 /** 262 * Copy a block of pixels from one resource to another. 263 * The resource must be of the same format. 264 * Resources with nr_samples > 1 are not allowed. 265 */ 266 void (*resource_copy_region)(struct pipe_context *pipe, 267 struct pipe_resource *dst, 268 unsigned dst_level, 269 unsigned dstx, unsigned dsty, unsigned dstz, 270 struct pipe_resource *src, 271 unsigned src_level, 272 const struct pipe_box *src_box); 273 274 /** 275 * Resolve a multisampled resource into a non-multisampled one. 276 * Source and destination must be of the same format. 277 */ 278 void (*resource_resolve)(struct pipe_context *pipe, 279 const struct pipe_resolve_info *info); 280 281 /*@}*/ 282 283 /** 284 * Clear the specified set of currently bound buffers to specified values. 285 * The entire buffers are cleared (no scissor, no colormask, etc). 286 * 287 * \param buffers bitfield of PIPE_CLEAR_* values. 288 * \param color pointer to a union of fiu array for each of r, g, b, a. 289 * \param depth depth clear value in [0,1]. 290 * \param stencil stencil clear value 291 */ 292 void (*clear)(struct pipe_context *pipe, 293 unsigned buffers, 294 const union pipe_color_union *color, 295 double depth, 296 unsigned stencil); 297 298 /** 299 * Clear a color rendertarget surface. 300 * \param color pointer to an union of fiu array for each of r, g, b, a. 301 */ 302 void (*clear_render_target)(struct pipe_context *pipe, 303 struct pipe_surface *dst, 304 const union pipe_color_union *color, 305 unsigned dstx, unsigned dsty, 306 unsigned width, unsigned height); 307 308 /** 309 * Clear a depth-stencil surface. 310 * \param clear_flags bitfield of PIPE_CLEAR_DEPTH/STENCIL values. 311 * \param depth depth clear value in [0,1]. 312 * \param stencil stencil clear value 313 */ 314 void (*clear_depth_stencil)(struct pipe_context *pipe, 315 struct pipe_surface *dst, 316 unsigned clear_flags, 317 double depth, 318 unsigned stencil, 319 unsigned dstx, unsigned dsty, 320 unsigned width, unsigned height); 321 322 /** Flush draw commands 323 */ 324 void (*flush)( struct pipe_context *pipe, 325 struct pipe_fence_handle **fence ); 326 327 /** 328 * Create a view on a texture to be used by a shader stage. 329 */ 330 struct pipe_sampler_view * (*create_sampler_view)(struct pipe_context *ctx, 331 struct pipe_resource *texture, 332 const struct pipe_sampler_view *templat); 333 334 void (*sampler_view_destroy)(struct pipe_context *ctx, 335 struct pipe_sampler_view *view); 336 337 338 /** 339 * Get a surface which is a "view" into a resource, used by 340 * render target / depth stencil stages. 341 * \param usage bitmaks of PIPE_BIND_* flags 342 */ 343 struct pipe_surface *(*create_surface)(struct pipe_context *ctx, 344 struct pipe_resource *resource, 345 const struct pipe_surface *templat); 346 347 void (*surface_destroy)(struct pipe_context *ctx, 348 struct pipe_surface *); 349 350 /** 351 * Get a transfer object for transferring data to/from a texture. 352 * 353 * Transfers are (by default) context-private and allow uploads to be 354 * interleaved with 355 */ 356 struct pipe_transfer *(*get_transfer)(struct pipe_context *, 357 struct pipe_resource *resource, 358 unsigned level, 359 unsigned usage, /* a combination of PIPE_TRANSFER_x */ 360 const struct pipe_box *); 361 362 void (*transfer_destroy)(struct pipe_context *, 363 struct pipe_transfer *); 364 365 void *(*transfer_map)( struct pipe_context *, 366 struct pipe_transfer *transfer ); 367 368 /* If transfer was created with WRITE|FLUSH_EXPLICIT, only the 369 * regions specified with this call are guaranteed to be written to 370 * the resource. 371 */ 372 void (*transfer_flush_region)( struct pipe_context *, 373 struct pipe_transfer *transfer, 374 const struct pipe_box *); 375 376 void (*transfer_unmap)( struct pipe_context *, 377 struct pipe_transfer *transfer ); 378 379 380 /* One-shot transfer operation with data supplied in a user 381 * pointer. XXX: strides?? 382 */ 383 void (*transfer_inline_write)( struct pipe_context *, 384 struct pipe_resource *, 385 unsigned level, 386 unsigned usage, /* a combination of PIPE_TRANSFER_x */ 387 const struct pipe_box *, 388 const void *data, 389 unsigned stride, 390 unsigned layer_stride); 391 392 393 /* Notify a driver that a content of a user buffer has been changed. 394 * The changed range is [offset, offset+size-1]. 395 * The new width0 of the buffer is offset+size. */ 396 void (*redefine_user_buffer)(struct pipe_context *, 397 struct pipe_resource *, 398 unsigned offset, 399 unsigned size); 400 401 /** 402 * Flush any pending framebuffer writes and invalidate texture caches. 403 */ 404 void (*texture_barrier)(struct pipe_context *); 405 406 /** 407 * Creates a video decoder for a specific video codec/profile 408 */ 409 struct pipe_video_decoder *(*create_video_decoder)( struct pipe_context *context, 410 enum pipe_video_profile profile, 411 enum pipe_video_entrypoint entrypoint, 412 enum pipe_video_chroma_format chroma_format, 413 unsigned width, unsigned height, unsigned max_references ); 414 415 /** 416 * Creates a video buffer as decoding target 417 */ 418 struct pipe_video_buffer *(*create_video_buffer)( struct pipe_context *context, 419 enum pipe_format buffer_format, 420 enum pipe_video_chroma_format chroma_format, 421 unsigned width, unsigned height ); 422}; 423 424 425#ifdef __cplusplus 426} 427#endif 428 429#endif /* PIPE_CONTEXT_H */ 430