1 2 /************************************************************************** 3 * 4 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29 /** 30 * \brief Public interface into the drawing module. 31 */ 32 33 /* Authors: Keith Whitwell <keith@tungstengraphics.com> 34 */ 35 36 37 #ifndef DRAW_CONTEXT_H 38 #define DRAW_CONTEXT_H 39 40 41 #include "pipe/p_state.h" 42 #include "tgsi/tgsi_exec.h" 43 44 struct pipe_context; 45 struct draw_context; 46 struct draw_stage; 47 struct draw_vertex_shader; 48 struct draw_geometry_shader; 49 struct draw_fragment_shader; 50 struct tgsi_sampler; 51 52 /* 53 * structure to contain driver internal information 54 * for stream out support. mapping stores the pointer 55 * to the buffer contents, and internal offset stores 56 * stores an internal counter to how much of the stream 57 * out buffer is used (in bytes). 58 */ 59 struct draw_so_target { 60 struct pipe_stream_output_target target; 61 void *mapping; 62 int internal_offset; 63 }; 64 65 struct draw_context *draw_create( struct pipe_context *pipe ); 66 67 struct draw_context *draw_create_no_llvm(struct pipe_context *pipe); 68 69 void draw_destroy( struct draw_context *draw ); 70 71 void draw_flush(struct draw_context *draw); 72 73 void draw_set_viewport_state( struct draw_context *draw, 74 const struct pipe_viewport_state *viewport ); 75 76 void draw_set_clip_state( struct draw_context *pipe, 77 const struct pipe_clip_state *clip ); 78 79 /** 80 * Sets the rasterization state used by the draw module. 81 * The rast_handle is used to pass the driver specific representation 82 * of the rasterization state. It's going to be used when the 83 * draw module sets the state back on the driver itself using the 84 * pipe::bind_rasterizer_state method. 85 * 86 * NOTE: if you're calling this function from within the pipe's 87 * bind_rasterizer_state you should always call it before binding 88 * the actual state - that's because the draw module can try to 89 * bind its own rasterizer state which would reset your newly 90 * set state. i.e. always do 91 * draw_set_rasterizer_state(driver->draw, state->pipe_state, state); 92 * driver->state.raster = state; 93 */ 94 void draw_set_rasterizer_state( struct draw_context *draw, 95 const struct pipe_rasterizer_state *raster, 96 void *rast_handle ); 97 98 void draw_set_rasterize_stage( struct draw_context *draw, 99 struct draw_stage *stage ); 100 101 void draw_wide_point_threshold(struct draw_context *draw, float threshold); 102 103 void draw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite); 104 105 void draw_wide_line_threshold(struct draw_context *draw, float threshold); 106 107 void draw_enable_line_stipple(struct draw_context *draw, boolean enable); 108 109 void draw_enable_point_sprites(struct draw_context *draw, boolean enable); 110 111 void draw_set_mrd(struct draw_context *draw, double mrd); 112 113 boolean 114 draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe); 115 116 boolean 117 draw_install_aapoint_stage(struct draw_context *draw, struct pipe_context *pipe); 118 119 boolean 120 draw_install_pstipple_stage(struct draw_context *draw, struct pipe_context *pipe); 121 122 123 struct tgsi_shader_info * 124 draw_get_shader_info(const struct draw_context *draw); 125 126 int 127 draw_find_shader_output(const struct draw_context *draw, 128 uint semantic_name, uint semantic_index); 129 130 uint 131 draw_num_shader_outputs(const struct draw_context *draw); 132 133 134 void 135 draw_texture_samplers(struct draw_context *draw, 136 uint shader_type, 137 uint num_samplers, 138 struct tgsi_sampler **samplers); 139 140 void 141 draw_set_sampler_views(struct draw_context *draw, 142 unsigned shader_stage, 143 struct pipe_sampler_view **views, 144 unsigned num); 145 void 146 draw_set_samplers(struct draw_context *draw, 147 unsigned shader_stage, 148 struct pipe_sampler_state **samplers, 149 unsigned num); 150 151 void 152 draw_set_mapped_texture(struct draw_context *draw, 153 unsigned shader_stage, 154 unsigned sampler_idx, 155 uint32_t width, uint32_t height, uint32_t depth, 156 uint32_t first_level, uint32_t last_level, 157 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS], 158 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS], 159 const void *data[PIPE_MAX_TEXTURE_LEVELS]); 160 161 162 /* 163 * Vertex shader functions 164 */ 165 166 struct draw_vertex_shader * 167 draw_create_vertex_shader(struct draw_context *draw, 168 const struct pipe_shader_state *shader); 169 void draw_bind_vertex_shader(struct draw_context *draw, 170 struct draw_vertex_shader *dvs); 171 void draw_delete_vertex_shader(struct draw_context *draw, 172 struct draw_vertex_shader *dvs); 173 174 175 /* 176 * Fragment shader functions 177 */ 178 struct draw_fragment_shader * 179 draw_create_fragment_shader(struct draw_context *draw, 180 const struct pipe_shader_state *shader); 181 void draw_bind_fragment_shader(struct draw_context *draw, 182 struct draw_fragment_shader *dvs); 183 void draw_delete_fragment_shader(struct draw_context *draw, 184 struct draw_fragment_shader *dvs); 185 186 /* 187 * Geometry shader functions 188 */ 189 struct draw_geometry_shader * 190 draw_create_geometry_shader(struct draw_context *draw, 191 const struct pipe_shader_state *shader); 192 void draw_bind_geometry_shader(struct draw_context *draw, 193 struct draw_geometry_shader *dvs); 194 void draw_delete_geometry_shader(struct draw_context *draw, 195 struct draw_geometry_shader *dvs); 196 197 198 /* 199 * Vertex data functions 200 */ 201 202 void draw_set_vertex_buffers(struct draw_context *draw, 203 unsigned count, 204 const struct pipe_vertex_buffer *buffers); 205 206 void draw_set_vertex_elements(struct draw_context *draw, 207 unsigned count, 208 const struct pipe_vertex_element *elements); 209 210 void draw_set_indexes(struct draw_context *draw, 211 const void *elements, unsigned elem_size); 212 213 void draw_set_mapped_vertex_buffer(struct draw_context *draw, 214 unsigned attr, const void *buffer); 215 216 void 217 draw_set_mapped_constant_buffer(struct draw_context *draw, 218 unsigned shader_type, 219 unsigned slot, 220 const void *buffer, 221 unsigned size); 222 223 void 224 draw_set_mapped_so_buffers(struct draw_context *draw, 225 void *buffers[PIPE_MAX_SO_BUFFERS], 226 unsigned num_buffers); 227 228 void 229 draw_set_mapped_so_targets(struct draw_context *draw, 230 int num_targets, 231 struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS]); 232 233 void 234 draw_set_so_state(struct draw_context *draw, 235 struct pipe_stream_output_info *state); 236 237 238 /*********************************************************************** 239 * draw_pt.c 240 */ 241 242 void draw_vbo(struct draw_context *draw, 243 const struct pipe_draw_info *info); 244 245 void draw_arrays(struct draw_context *draw, unsigned prim, 246 unsigned start, unsigned count); 247 248 void 249 draw_arrays_instanced(struct draw_context *draw, 250 unsigned mode, 251 unsigned start, 252 unsigned count, 253 unsigned startInstance, 254 unsigned instanceCount); 255 256 257 /******************************************************************************* 258 * Driver backend interface 259 */ 260 struct vbuf_render; 261 void draw_set_render( struct draw_context *draw, 262 struct vbuf_render *render ); 263 264 void draw_set_driver_clipping( struct draw_context *draw, 265 boolean bypass_clip_xy, 266 boolean bypass_clip_z, 267 boolean guard_band_xy); 268 269 void draw_set_force_passthrough( struct draw_context *draw, 270 boolean enable ); 271 272 /******************************************************************************* 273 * Draw pipeline 274 */ 275 boolean draw_need_pipeline(const struct draw_context *draw, 276 const struct pipe_rasterizer_state *rasterizer, 277 unsigned prim ); 278 279 int 280 draw_get_shader_param(unsigned shader, enum pipe_shader_cap param); 281 282 int 283 draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param); 284 285 #endif /* DRAW_CONTEXT_H */ 286