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 /* 29 * Authors: 30 * Keith Whitwell <keith@tungstengraphics.com> 31 */ 32 33 #ifndef DRAW_PT_H 34 #define DRAW_PT_H 35 36 #include "pipe/p_compiler.h" 37 38 struct draw_pt_middle_end; 39 struct draw_context; 40 struct draw_prim_info; 41 struct draw_vertex_info; 42 43 44 #define PT_SHADE 0x1 45 #define PT_CLIPTEST 0x2 46 #define PT_PIPELINE 0x4 47 #define PT_MAX_MIDDLE 0x8 48 49 50 /* The "front end" - prepare sets of fetch, draw elements for the 51 * middle end. 52 * 53 * The fetch elements are indices to the vertices. The draw elements are 54 * indices to the fetched vertices. When both arrays of elements are both 55 * linear, middle->run_linear is called; When only the fetch elements are 56 * linear, middle->run_linear_elts is called; Otherwise, middle->run is 57 * called. 58 * 59 * When the number of the draw elements exceeds max_vertex of the middle end, 60 * the draw elements (as well as the fetch elements) are splitted and the 61 * middle end is called multiple times. 62 * 63 * Currenly there is: 64 * - vsplit - catchall implementation, splits big prims 65 */ 66 struct draw_pt_front_end { 67 void (*prepare)( struct draw_pt_front_end *, 68 unsigned prim, 69 struct draw_pt_middle_end *, 70 unsigned opt ); 71 72 void (*run)( struct draw_pt_front_end *, 73 unsigned start, 74 unsigned count ); 75 76 void (*flush)( struct draw_pt_front_end *, unsigned flags ); 77 void (*destroy)( struct draw_pt_front_end * ); 78 }; 79 80 81 /* The "middle end" - prepares actual hardware vertices for the 82 * hardware backend. 83 * 84 * prim_flags is as defined by pipe_draw_info::flags. 85 * 86 * Currently two versions of this: 87 * - fetch, vertex shade, cliptest, prim-pipeline 88 * - fetch, emit (ie passthrough) 89 */ 90 struct draw_pt_middle_end { 91 void (*prepare)( struct draw_pt_middle_end *, 92 unsigned prim, 93 unsigned opt, 94 unsigned *max_vertices ); 95 96 void (*run)( struct draw_pt_middle_end *, 97 const unsigned *fetch_elts, 98 unsigned fetch_count, 99 const ushort *draw_elts, 100 unsigned draw_count, 101 unsigned prim_flags ); 102 103 void (*run_linear)(struct draw_pt_middle_end *, 104 unsigned start, 105 unsigned count, 106 unsigned prim_flags ); 107 108 /* Transform all vertices in a linear range and then draw them with 109 * the supplied element list. May fail and return FALSE. 110 */ 111 boolean (*run_linear_elts)( struct draw_pt_middle_end *, 112 unsigned fetch_start, 113 unsigned fetch_count, 114 const ushort *draw_elts, 115 unsigned draw_count, 116 unsigned prim_flags ); 117 118 int (*get_max_vertex_count)( struct draw_pt_middle_end * ); 119 120 void (*finish)( struct draw_pt_middle_end * ); 121 void (*destroy)( struct draw_pt_middle_end * ); 122 }; 123 124 125 /* The "back end" - supplied by the driver, defined in draw_vbuf.h. 126 */ 127 struct vbuf_render; 128 struct vertex_header; 129 130 131 /* Frontends: 132 * 133 * Currently only the general-purpose vsplit implementation. 134 */ 135 struct draw_pt_front_end *draw_pt_vsplit(struct draw_context *draw); 136 137 138 /* Middle-ends: 139 * 140 * Currently one general-purpose case which can do all possibilities, 141 * at the slight expense of creating a vertex_header in some cases 142 * unecessarily. 143 * 144 * The special case fetch_emit code avoids pipeline vertices 145 * altogether and builds hardware vertices directly from API 146 * vertex_elements. 147 */ 148 struct draw_pt_middle_end *draw_pt_fetch_emit( struct draw_context *draw ); 149 struct draw_pt_middle_end *draw_pt_middle_fse( struct draw_context *draw ); 150 struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit(struct draw_context *draw); 151 struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit_llvm(struct draw_context *draw); 152 153 154 155 /******************************************************************************* 156 * HW vertex emit: 157 */ 158 struct pt_emit; 159 160 void draw_pt_emit_prepare( struct pt_emit *emit, 161 unsigned prim, 162 unsigned *max_vertices ); 163 164 void draw_pt_emit( struct pt_emit *emit, 165 const struct draw_vertex_info *vert_info, 166 const struct draw_prim_info *prim_info); 167 168 void draw_pt_emit_linear( struct pt_emit *emit, 169 const struct draw_vertex_info *vert_info, 170 const struct draw_prim_info *prim_info); 171 172 void draw_pt_emit_destroy( struct pt_emit *emit ); 173 174 struct pt_emit *draw_pt_emit_create( struct draw_context *draw ); 175 176 /******************************************************************************* 177 * HW stream output emit: 178 */ 179 struct pt_so_emit; 180 181 void draw_pt_so_emit_prepare( struct pt_so_emit *emit ); 182 183 void draw_pt_so_emit( struct pt_so_emit *emit, 184 const struct draw_vertex_info *vert_info, 185 const struct draw_prim_info *prim_info ); 186 187 void draw_pt_so_emit_destroy( struct pt_so_emit *emit ); 188 189 struct pt_so_emit *draw_pt_so_emit_create( struct draw_context *draw ); 190 191 /******************************************************************************* 192 * API vertex fetch: 193 */ 194 195 struct pt_fetch; 196 void draw_pt_fetch_prepare( struct pt_fetch *fetch, 197 unsigned vertex_input_count, 198 unsigned vertex_size, 199 unsigned instance_id_index ); 200 201 void draw_pt_fetch_run( struct pt_fetch *fetch, 202 const unsigned *elts, 203 unsigned count, 204 char *verts ); 205 206 void draw_pt_fetch_run_linear( struct pt_fetch *fetch, 207 unsigned start, 208 unsigned count, 209 char *verts ); 210 211 void draw_pt_fetch_destroy( struct pt_fetch *fetch ); 212 213 struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw ); 214 215 /******************************************************************************* 216 * Post-VS: cliptest, rhw, viewport 217 */ 218 struct pt_post_vs; 219 220 boolean draw_pt_post_vs_run( struct pt_post_vs *pvs, 221 struct draw_vertex_info *info ); 222 223 void draw_pt_post_vs_prepare( struct pt_post_vs *pvs, 224 boolean clip_xy, 225 boolean clip_z, 226 boolean clip_user, 227 boolean guard_band, 228 boolean bypass_viewport, 229 boolean opengl, 230 boolean need_edgeflags ); 231 232 struct pt_post_vs *draw_pt_post_vs_create( struct draw_context *draw ); 233 234 void draw_pt_post_vs_destroy( struct pt_post_vs *pvs ); 235 236 237 /******************************************************************************* 238 * Utils: 239 */ 240 void draw_pt_split_prim(unsigned prim, unsigned *first, unsigned *incr); 241 unsigned draw_pt_trim_count(unsigned count, unsigned first, unsigned incr); 242 243 244 #endif 245