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