frontend for rendering without elts
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_varray_tmp.h
1
2 static void FUNC(struct draw_pt_front_end *frontend,
3 pt_elt_func get_elt,
4 const void *elts,
5 unsigned count)
6 {
7 struct varray_frontend *varray = (struct varray_frontend *)frontend;
8 struct draw_context *draw = varray->draw;
9 unsigned start = (unsigned)elts;
10
11 boolean flatfirst = (draw->rasterizer->flatshade &&
12 draw->rasterizer->flatshade_first);
13 unsigned i, flags;
14
15 #if 0
16 debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count);
17 #endif
18 #if 0
19 debug_printf("INPUT PRIM = %d (start = %d, count = %d)\n", varray->input_prim,
20 start, count);
21 #endif
22
23 for (i = 0; i < count; ++i) {
24 varray->fetch_elts[i] = start + i;
25 }
26 varray->fetch_count = count;
27
28 switch (varray->input_prim) {
29 case PIPE_PRIM_POINTS:
30 for (i = 0; i < count; i ++) {
31 POINT(varray, i + 0);
32 }
33 break;
34
35 case PIPE_PRIM_LINES:
36 for (i = 0; i+1 < count; i += 2) {
37 LINE(varray, DRAW_PIPE_RESET_STIPPLE,
38 i + 0, i + 1);
39 }
40 break;
41
42 case PIPE_PRIM_LINE_LOOP:
43 if (count >= 2) {
44 flags = DRAW_PIPE_RESET_STIPPLE;
45
46 for (i = 1; i < count; i++, flags = 0) {
47 LINE(varray, flags, i - 1, i);
48 }
49 LINE(varray, flags, i - 1, 0);
50 }
51 break;
52
53 case PIPE_PRIM_LINE_STRIP:
54 flags = DRAW_PIPE_RESET_STIPPLE;
55 for (i = 1; i < count; i++, flags = 0) {
56 LINE(varray, flags, i - 1, i);
57 }
58 break;
59
60 case PIPE_PRIM_TRIANGLES:
61 for (i = 0; i+2 < count; i += 3) {
62 TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
63 i + 0, i + 1, i + 2);
64 }
65 break;
66
67 case PIPE_PRIM_TRIANGLE_STRIP:
68 if (flatfirst) {
69 for (i = 0; i+2 < count; i++) {
70 TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
71 i + 0, i + 1 + (i&1), i + 2 - (i&1));
72 }
73 }
74 else {
75 for (i = 0; i+2 < count; i++) {
76 TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
77 i + 0 + (i&1), i + 1 - (i&1), i + 2);
78 }
79 }
80 break;
81
82 case PIPE_PRIM_TRIANGLE_FAN:
83 if (count >= 3) {
84 if (flatfirst) {
85 flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
86 for (i = 0; i+2 < count; i++) {
87 TRIANGLE(varray, flags, i + 1, i + 2, 0);
88 }
89 }
90 else {
91 flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
92 for (i = 0; i+2 < count; i++) {
93 TRIANGLE(varray, flags, 0, i + 1, i + 2);
94 }
95 }
96 }
97 break;
98
99 case PIPE_PRIM_QUADS:
100 for (i = 0; i+3 < count; i += 4) {
101 QUAD(varray, i + 0, i + 1, i + 2, i + 3);
102 }
103 break;
104
105 case PIPE_PRIM_QUAD_STRIP:
106 for (i = 0; i+3 < count; i += 2) {
107 QUAD(varray, i + 2, i + 0, i + 1, i + 3);
108 }
109 break;
110
111 case PIPE_PRIM_POLYGON:
112 {
113 /* These bitflags look a little odd because we submit the
114 * vertices as (1,2,0) to satisfy flatshade requirements.
115 */
116 const unsigned edge_first = DRAW_PIPE_EDGE_FLAG_2;
117 const unsigned edge_middle = DRAW_PIPE_EDGE_FLAG_0;
118 const unsigned edge_last = DRAW_PIPE_EDGE_FLAG_1;
119
120 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
121
122 for (i = 0; i+2 < count; i++, flags = edge_middle) {
123
124 if (i + 3 == count)
125 flags |= edge_last;
126
127 TRIANGLE(varray, flags, i + 1, i + 2, 0);
128 }
129 }
130 break;
131
132 default:
133 assert(0);
134 break;
135 }
136
137 varray_flush(varray);
138 }
139
140 #undef TRIANGLE
141 #undef QUAD
142 #undef POINT
143 #undef LINE
144 #undef FUNC