Merge remote branch 'origin/7.8'
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_varray_tmp_linear.h
1 static unsigned trim( unsigned count, unsigned first, unsigned incr )
2 {
3 return count - (count - first) % incr;
4 }
5
6 static void FUNC(struct draw_pt_front_end *frontend,
7 pt_elt_func get_elt,
8 const void *elts,
9 int elt_bias,
10 unsigned count)
11 {
12 struct varray_frontend *varray = (struct varray_frontend *)frontend;
13 unsigned start = (unsigned) ((char *) elts - (char *) NULL);
14
15 unsigned j;
16 unsigned first, incr;
17
18 assert(elt_bias == 0);
19
20 draw_pt_split_prim(varray->input_prim, &first, &incr);
21
22 /* Sanitize primitive length:
23 */
24 count = trim(count, first, incr);
25 if (count < first)
26 return;
27
28 #if 0
29 debug_printf("%s (%d) %d/%d\n", __FUNCTION__,
30 varray->input_prim,
31 start, count);
32 #endif
33
34 switch (varray->input_prim) {
35 case PIPE_PRIM_POINTS:
36 case PIPE_PRIM_LINES:
37 case PIPE_PRIM_TRIANGLES:
38 case PIPE_PRIM_LINE_STRIP:
39 case PIPE_PRIM_TRIANGLE_STRIP:
40 case PIPE_PRIM_QUADS:
41 case PIPE_PRIM_QUAD_STRIP:
42 case PIPE_PRIM_LINES_ADJACENCY:
43 case PIPE_PRIM_LINE_STRIP_ADJACENCY:
44 case PIPE_PRIM_TRIANGLES_ADJACENCY:
45 case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
46 for (j = 0; j < count;) {
47 unsigned remaining = count - j;
48 unsigned nr = trim( MIN2(varray->driver_fetch_max, remaining), first, incr );
49 varray_flush_linear(varray, start + j, nr);
50 j += nr;
51 if (nr != remaining)
52 j -= (first - incr);
53 }
54 break;
55
56 case PIPE_PRIM_LINE_LOOP:
57 /* Always have to decompose as we've stated that this will be
58 * emitted as a line-strip.
59 */
60 for (j = 0; j < count;) {
61 unsigned remaining = count - j;
62 unsigned nr = trim( MIN2(varray->fetch_max-1, remaining), first, incr );
63 varray_line_loop_segment(varray, start, j, nr, nr == remaining);
64 j += nr;
65 if (nr != remaining)
66 j -= (first - incr);
67 }
68 break;
69
70
71 case PIPE_PRIM_POLYGON:
72 case PIPE_PRIM_TRIANGLE_FAN:
73 if (count < varray->driver_fetch_max) {
74 varray_flush_linear(varray, start, count);
75 }
76 else {
77 for ( j = 0; j < count;) {
78 unsigned remaining = count - j;
79 unsigned nr = trim( MIN2(varray->fetch_max-1, remaining), first, incr );
80 varray_fan_segment(varray, start, j, nr);
81 j += nr;
82 if (nr != remaining)
83 j -= (first - incr);
84 }
85 }
86 break;
87
88 default:
89 assert(0);
90 break;
91 }
92 }
93
94 #undef TRIANGLE
95 #undef QUAD
96 #undef POINT
97 #undef LINE
98 #undef FUNC