Merge branch 'gallium-vertex-linear' into gallium-0.1
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_varray.c
1 /**************************************************************************
2 *
3 * Copyright 2008 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 #include "pipe/p_util.h"
29 #include "draw/draw_context.h"
30 #include "draw/draw_private.h"
31 #include "draw/draw_pt.h"
32
33 #define FETCH_MAX 256
34 #define DRAW_MAX (16*FETCH_MAX)
35
36 struct varray_frontend {
37 struct draw_pt_front_end base;
38 struct draw_context *draw;
39
40 ushort draw_elts[DRAW_MAX];
41 unsigned fetch_elts[FETCH_MAX];
42
43 unsigned draw_count;
44 unsigned fetch_count;
45
46 unsigned fetch_start;
47
48 struct draw_pt_middle_end *middle;
49
50 unsigned input_prim;
51 unsigned output_prim;
52 };
53
54 static void varray_flush(struct varray_frontend *varray)
55 {
56 if (varray->draw_count) {
57 #if 0
58 debug_printf("FLUSH fc = %d, dc = %d\n",
59 varray->fetch_count,
60 varray->draw_count);
61 debug_printf("\telt0 = %d, eltx = %d, draw0 = %d, drawx = %d\n",
62 varray->fetch_elts[0],
63 varray->fetch_elts[varray->fetch_count-1],
64 varray->draw_elts[0],
65 varray->draw_elts[varray->draw_count-1]);
66 #endif
67 varray->middle->run(varray->middle,
68 varray->fetch_elts,
69 varray->fetch_count,
70 varray->draw_elts,
71 varray->draw_count);
72 }
73
74 varray->fetch_count = 0;
75 varray->draw_count = 0;
76 }
77
78 static void varray_flush_linear(struct varray_frontend *varray,
79 unsigned start, unsigned count)
80 {
81 if (count) {
82 #if 0
83 debug_printf("FLUSH LINEAR start = %d, count = %d\n",
84 start,
85 count);
86 #endif
87 assert(varray->middle->run_linear);
88 varray->middle->run_linear(varray->middle, start, count);
89 }
90 }
91
92 static INLINE void fetch_init(struct varray_frontend *varray,
93 unsigned count)
94 {
95 unsigned idx;
96 #if 0
97 debug_printf("FETCH INIT c = %d, fs = %d\n",
98 count,
99 varray->fetch_start);
100 #endif
101 for (idx = 0; idx < count; ++idx) {
102 varray->fetch_elts[idx] = varray->fetch_start + idx;
103 }
104 varray->fetch_start += idx;
105 varray->fetch_count = idx;
106 }
107
108
109
110
111 static INLINE void add_draw_el(struct varray_frontend *varray,
112 int idx)
113 {
114 varray->draw_elts[varray->draw_count++] = idx;
115 }
116
117
118 static INLINE void varray_triangle( struct varray_frontend *varray,
119 unsigned i0,
120 unsigned i1,
121 unsigned i2 )
122 {
123 add_draw_el(varray, i0);
124 add_draw_el(varray, i1);
125 add_draw_el(varray, i2);
126 }
127
128 static INLINE void varray_line( struct varray_frontend *varray,
129 unsigned i0,
130 unsigned i1 )
131 {
132 add_draw_el(varray, i0);
133 add_draw_el(varray, i1);
134 }
135
136
137 static INLINE void varray_point( struct varray_frontend *varray,
138 unsigned i0 )
139 {
140 add_draw_el(varray, i0);
141 }
142
143
144 #if 0
145 #define TRIANGLE(flags,i0,i1,i2) varray_triangle(varray,i0,i1,i2)
146 #define LINE(flags,i0,i1) varray_line(varray,i0,i1)
147 #define POINT(i0) varray_point(varray,i0)
148 #define FUNC varray_decompose
149 #include "draw_pt_decompose.h"
150 #else
151 #define TRIANGLE(vc,i0,i1,i2) varray_triangle(vc,i0,i1,i2)
152 #define LINE(vc,i0,i1) varray_line(vc,i0,i1)
153 #define POINT(vc,i0) varray_point(vc,i0)
154 #define FUNC varray_run
155 #include "draw_pt_varray_tmp_linear.h"
156 #endif
157
158 static unsigned decompose_prim[PIPE_PRIM_POLYGON + 1] = {
159 PIPE_PRIM_POINTS,
160 PIPE_PRIM_LINES,
161 PIPE_PRIM_LINES, /* decomposed LINELOOP */
162 PIPE_PRIM_LINE_STRIP,
163 PIPE_PRIM_TRIANGLES,
164 PIPE_PRIM_TRIANGLE_STRIP,
165 PIPE_PRIM_TRIANGLES, /* decomposed TRI_FAN */
166 PIPE_PRIM_QUADS,
167 PIPE_PRIM_QUAD_STRIP,
168 PIPE_PRIM_TRIANGLES /* decomposed POLYGON */
169 };
170
171
172
173 static void varray_prepare(struct draw_pt_front_end *frontend,
174 unsigned prim,
175 struct draw_pt_middle_end *middle,
176 unsigned opt)
177 {
178 struct varray_frontend *varray = (struct varray_frontend *)frontend;
179
180 varray->base.run = varray_run;
181
182 varray->input_prim = prim;
183 varray->output_prim = decompose_prim[prim];
184
185 varray->middle = middle;
186 middle->prepare(middle, varray->output_prim, opt);
187 }
188
189
190
191
192 static void varray_finish(struct draw_pt_front_end *frontend)
193 {
194 struct varray_frontend *varray = (struct varray_frontend *)frontend;
195 varray->middle->finish(varray->middle);
196 varray->middle = NULL;
197 }
198
199 static void varray_destroy(struct draw_pt_front_end *frontend)
200 {
201 FREE(frontend);
202 }
203
204
205 struct draw_pt_front_end *draw_pt_varray(struct draw_context *draw)
206 {
207 struct varray_frontend *varray = CALLOC_STRUCT(varray_frontend);
208 if (varray == NULL)
209 return NULL;
210
211 varray->base.prepare = varray_prepare;
212 varray->base.run = NULL;
213 varray->base.finish = varray_finish;
214 varray->base.destroy = varray_destroy;
215 varray->draw = draw;
216
217 return &varray->base;
218 }