1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
28 #ifndef PIPE_CONTEXT_H
29 #define PIPE_CONTEXT_H
40 struct pipe_fence_handle
;
41 struct pipe_state_cache
;
46 * Gallium rendering context. Basically:
47 * - state setting functions
48 * - VBO drawing functions
52 struct pipe_winsys
*winsys
;
53 struct pipe_screen
*screen
;
55 void *priv
; /**< context private data (for DRI for example) */
56 void *draw
; /**< private, for draw module (temporary?) */
58 void (*destroy
)( struct pipe_context
* );
61 * VBO drawing (return false on fallbacks (temporary??))
64 boolean (*draw_arrays
)( struct pipe_context
*pipe
,
65 unsigned mode
, unsigned start
, unsigned count
);
67 boolean (*draw_elements
)( struct pipe_context
*pipe
,
68 struct pipe_buffer
*indexBuffer
,
70 unsigned mode
, unsigned start
, unsigned count
);
72 boolean (*draw_arrays_instanced
)(struct pipe_context
*pipe
,
76 unsigned startInstance
,
77 unsigned instanceCount
);
79 boolean (*draw_elements_instanced
)(struct pipe_context
*pipe
,
80 struct pipe_buffer
*indexBuffer
,
85 unsigned startInstance
,
86 unsigned instanceCount
);
88 /* XXX: this is (probably) a temporary entrypoint, as the range
89 * information should be available from the vertex_buffer state.
90 * Using this to quickly evaluate a specialized path in the draw
93 boolean (*draw_range_elements
)( struct pipe_context
*pipe
,
94 struct pipe_buffer
*indexBuffer
,
108 struct pipe_query
*(*create_query
)( struct pipe_context
*pipe
,
109 unsigned query_type
);
111 void (*destroy_query
)(struct pipe_context
*pipe
,
112 struct pipe_query
*q
);
114 void (*begin_query
)(struct pipe_context
*pipe
, struct pipe_query
*q
);
115 void (*end_query
)(struct pipe_context
*pipe
, struct pipe_query
*q
);
117 boolean (*get_query_result
)(struct pipe_context
*pipe
,
118 struct pipe_query
*q
,
124 * State functions (create/bind/destroy state objects)
127 void * (*create_blend_state
)(struct pipe_context
*,
128 const struct pipe_blend_state
*);
129 void (*bind_blend_state
)(struct pipe_context
*, void *);
130 void (*delete_blend_state
)(struct pipe_context
*, void *);
132 void * (*create_sampler_state
)(struct pipe_context
*,
133 const struct pipe_sampler_state
*);
134 void (*bind_fragment_sampler_states
)(struct pipe_context
*,
135 unsigned num_samplers
,
137 void (*bind_vertex_sampler_states
)(struct pipe_context
*,
138 unsigned num_samplers
,
140 void (*delete_sampler_state
)(struct pipe_context
*, void *);
142 void * (*create_rasterizer_state
)(struct pipe_context
*,
143 const struct pipe_rasterizer_state
*);
144 void (*bind_rasterizer_state
)(struct pipe_context
*, void *);
145 void (*delete_rasterizer_state
)(struct pipe_context
*, void *);
147 void * (*create_depth_stencil_alpha_state
)(struct pipe_context
*,
148 const struct pipe_depth_stencil_alpha_state
*);
149 void (*bind_depth_stencil_alpha_state
)(struct pipe_context
*, void *);
150 void (*delete_depth_stencil_alpha_state
)(struct pipe_context
*, void *);
152 void * (*create_fs_state
)(struct pipe_context
*,
153 const struct pipe_shader_state
*);
154 void (*bind_fs_state
)(struct pipe_context
*, void *);
155 void (*delete_fs_state
)(struct pipe_context
*, void *);
157 void * (*create_vs_state
)(struct pipe_context
*,
158 const struct pipe_shader_state
*);
159 void (*bind_vs_state
)(struct pipe_context
*, void *);
160 void (*delete_vs_state
)(struct pipe_context
*, void *);
164 * Parameter-like state (or properties)
167 void (*set_blend_color
)( struct pipe_context
*,
168 const struct pipe_blend_color
* );
170 void (*set_clip_state
)( struct pipe_context
*,
171 const struct pipe_clip_state
* );
173 void (*set_constant_buffer
)( struct pipe_context
*,
174 uint shader
, uint index
,
175 const struct pipe_constant_buffer
*buf
);
177 void (*set_framebuffer_state
)( struct pipe_context
*,
178 const struct pipe_framebuffer_state
* );
180 void (*set_polygon_stipple
)( struct pipe_context
*,
181 const struct pipe_poly_stipple
* );
183 void (*set_scissor_state
)( struct pipe_context
*,
184 const struct pipe_scissor_state
* );
186 void (*set_viewport_state
)( struct pipe_context
*,
187 const struct pipe_viewport_state
* );
189 void (*set_fragment_sampler_textures
)(struct pipe_context
*,
190 unsigned num_textures
,
191 struct pipe_texture
**);
193 void (*set_vertex_sampler_textures
)(struct pipe_context
*,
194 unsigned num_textures
,
195 struct pipe_texture
**);
197 void (*set_vertex_buffers
)( struct pipe_context
*,
198 unsigned num_buffers
,
199 const struct pipe_vertex_buffer
* );
201 void (*set_vertex_elements
)( struct pipe_context
*,
202 unsigned num_elements
,
203 const struct pipe_vertex_element
* );
210 * The pipe driver is allowed to set these functions to NULL, and in that
211 * case, they will not be available.
216 * Copy a block of pixels from one surface to another.
217 * The surfaces must be of the same format.
219 void (*surface_copy
)(struct pipe_context
*pipe
,
220 struct pipe_surface
*dest
,
221 unsigned destx
, unsigned desty
,
222 struct pipe_surface
*src
,
223 unsigned srcx
, unsigned srcy
,
224 unsigned width
, unsigned height
);
227 * Fill a region of a surface with a constant value.
229 void (*surface_fill
)(struct pipe_context
*pipe
,
230 struct pipe_surface
*dst
,
231 unsigned dstx
, unsigned dsty
,
232 unsigned width
, unsigned height
,
237 * Clear the specified set of currently bound buffers to specified values.
238 * The entire buffers are cleared (no scissor, no colormask, etc).
240 * \param buffers bitfield of PIPE_CLEAR_* values.
241 * \param rgba pointer to an array of one float for each of r, g, b, a.
242 * \param depth depth clear value in [0,1].
243 * \param stencil stencil clear value
245 void (*clear
)(struct pipe_context
*pipe
,
252 * \param flags bitmask of PIPE_FLUSH_x tokens)
254 void (*flush
)( struct pipe_context
*pipe
,
256 struct pipe_fence_handle
**fence
);
259 * Check whether a texture is referenced by an unflushed hw command.
260 * The state-tracker uses this function to optimize away unnecessary
261 * flushes. It is safe (but wasteful) to always return.
262 * PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE.
263 * \param pipe The pipe context whose unflushed hw commands will be
265 * \param level mipmap level.
266 * \param texture texture to check.
267 * \param face cubemap face. Use 0 for non-cubemap texture.
269 unsigned int (*is_texture_referenced
) (struct pipe_context
*pipe
,
270 struct pipe_texture
*texture
,
271 unsigned face
, unsigned level
);
274 * Check whether a buffer is referenced by an unflushed hw command.
275 * The state-tracker uses this function to optimize away unnecessary
276 * flushes. It is safe (but wasteful) to always return
277 * PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE.
278 * \param pipe The pipe context whose unflushed hw commands will be
280 * \param buf Buffer to check.
282 unsigned int (*is_buffer_referenced
) (struct pipe_context
*pipe
,
283 struct pipe_buffer
*buf
);
291 #endif /* PIPE_CONTEXT_H */