softpipe: re-order drawing functions to get rid of prototype
[mesa.git] / src / gallium / drivers / softpipe / sp_draw_arrays.c
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 /* Author:
29 * Brian Paul
30 * Keith Whitwell
31 */
32
33
34 #include "pipe/p_defines.h"
35 #include "pipe/p_context.h"
36 #include "util/u_inlines.h"
37 #include "util/u_prim.h"
38
39 #include "sp_context.h"
40 #include "sp_query.h"
41 #include "sp_state.h"
42 #include "sp_texture.h"
43
44 #include "draw/draw_context.h"
45
46
47
48
49
50 void
51 softpipe_draw_stream_output(struct pipe_context *pipe, unsigned mode)
52 {
53 struct softpipe_context *sp = softpipe_context(pipe);
54 struct draw_context *draw = sp->draw;
55 const unsigned start = 0;
56 const unsigned count = sp->so_target.so_count[0];
57 void *buf = sp->so_target.buffer[0]->data;
58 int offset = sp->so_target.offset[0];
59
60 if (!softpipe_check_render_cond(sp) ||
61 sp->so_target.num_buffers != 1)
62 return;
63
64 sp->reduced_api_prim = u_reduced_prim(mode);
65
66 if (sp->dirty) {
67 softpipe_update_derived(sp);
68 }
69
70 softpipe_map_transfers(sp);
71
72 /* Map so buffers */
73 if (offset < 0) /* we were appending so start from beginning */
74 offset = 0;
75 buf = (void*)((int32_t*)buf + offset);
76 draw_set_mapped_vertex_buffer(draw, 0, buf);
77
78 draw_set_mapped_element_buffer_range(draw,
79 0, 0,
80 start,
81 start + count - 1,
82 NULL);
83
84 /* draw! */
85 draw_arrays_instanced(draw, mode, start, count, 0, 1);
86
87 /* unmap vertex/index buffers - will cause draw module to flush */
88 draw_set_mapped_vertex_buffer(draw, 0, NULL);
89
90 /*
91 * TODO: Flush only when a user vertex/index buffer is present
92 * (or even better, modify draw module to do this
93 * internally when this condition is seen?)
94 */
95 draw_flush(draw);
96
97 /* Note: leave drawing surfaces mapped */
98 sp->dirty_render_cache = TRUE;
99 }
100
101
102 /**
103 * This function handles drawing indexed and non-indexed prims,
104 * instanced and non-instanced drawing, with or without min/max element
105 * indexes.
106 * All the other drawing functions are expressed in terms of this
107 * function.
108 *
109 * For non-indexed prims, indexBuffer should be NULL.
110 * For non-instanced drawing, instanceCount should be 1.
111 * When the min/max element indexes aren't known, minIndex should be 0
112 * and maxIndex should be ~0.
113 */
114 static void
115 softpipe_draw_range_elements_instanced(struct pipe_context *pipe,
116 struct pipe_resource *indexBuffer,
117 unsigned indexSize,
118 int indexBias,
119 unsigned minIndex,
120 unsigned maxIndex,
121 unsigned mode,
122 unsigned start,
123 unsigned count,
124 unsigned startInstance,
125 unsigned instanceCount)
126 {
127 struct softpipe_context *sp = softpipe_context(pipe);
128 struct draw_context *draw = sp->draw;
129 unsigned i;
130
131 if (!softpipe_check_render_cond(sp))
132 return;
133
134 sp->reduced_api_prim = u_reduced_prim(mode);
135
136 if (sp->dirty) {
137 softpipe_update_derived(sp);
138 }
139
140 softpipe_map_transfers(sp);
141
142 /* Map vertex buffers */
143 for (i = 0; i < sp->num_vertex_buffers; i++) {
144 void *buf = softpipe_resource(sp->vertex_buffer[i].buffer)->data;
145 draw_set_mapped_vertex_buffer(draw, i, buf);
146 }
147
148 /* Map index buffer, if present */
149 if (indexBuffer) {
150 void *mapped_indexes = softpipe_resource(indexBuffer)->data;
151 draw_set_mapped_element_buffer_range(draw,
152 indexSize,
153 indexBias,
154 minIndex,
155 maxIndex,
156 mapped_indexes);
157 } else {
158 /* no index/element buffer */
159 draw_set_mapped_element_buffer_range(draw,
160 0, 0,
161 start,
162 start + count - 1,
163 NULL);
164 }
165
166 /* draw! */
167 draw_arrays_instanced(draw, mode, start, count, startInstance, instanceCount);
168
169 /* unmap vertex/index buffers - will cause draw module to flush */
170 for (i = 0; i < sp->num_vertex_buffers; i++) {
171 draw_set_mapped_vertex_buffer(draw, i, NULL);
172 }
173 if (indexBuffer) {
174 draw_set_mapped_element_buffer(draw, 0, 0, NULL);
175 }
176
177 /*
178 * TODO: Flush only when a user vertex/index buffer is present
179 * (or even better, modify draw module to do this
180 * internally when this condition is seen?)
181 */
182 draw_flush(draw);
183
184 /* Note: leave drawing surfaces mapped */
185 sp->dirty_render_cache = TRUE;
186 }
187
188
189 void
190 softpipe_draw_range_elements(struct pipe_context *pipe,
191 struct pipe_resource *indexBuffer,
192 unsigned indexSize,
193 int indexBias,
194 unsigned min_index,
195 unsigned max_index,
196 unsigned mode, unsigned start, unsigned count)
197 {
198 softpipe_draw_range_elements_instanced(pipe,
199 indexBuffer,
200 indexSize,
201 indexBias,
202 min_index,
203 max_index,
204 mode,
205 start,
206 count,
207 0,
208 1);
209 }
210
211
212 void
213 softpipe_draw_elements(struct pipe_context *pipe,
214 struct pipe_resource *indexBuffer,
215 unsigned indexSize, int indexBias,
216 unsigned mode, unsigned start, unsigned count)
217 {
218 softpipe_draw_range_elements_instanced(pipe,
219 indexBuffer,
220 indexSize,
221 indexBias,
222 0,
223 0xffffffff,
224 mode,
225 start,
226 count,
227 0,
228 1);
229 }
230
231 void
232 softpipe_draw_arrays_instanced(struct pipe_context *pipe,
233 unsigned mode,
234 unsigned start,
235 unsigned count,
236 unsigned startInstance,
237 unsigned instanceCount)
238 {
239 softpipe_draw_range_elements_instanced(pipe,
240 NULL,
241 0,
242 0,
243 0,
244 0xffffffff,
245 mode,
246 start,
247 count,
248 startInstance,
249 instanceCount);
250 }
251
252 void
253 softpipe_draw_elements_instanced(struct pipe_context *pipe,
254 struct pipe_resource *indexBuffer,
255 unsigned indexSize,
256 int indexBias,
257 unsigned mode,
258 unsigned start,
259 unsigned count,
260 unsigned startInstance,
261 unsigned instanceCount)
262 {
263 softpipe_draw_range_elements_instanced(pipe,
264 indexBuffer,
265 indexSize,
266 indexBias,
267 0,
268 0xffffffff,
269 mode,
270 start,
271 count,
272 startInstance,
273 instanceCount);
274 }
275
276 void
277 softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
278 unsigned start, unsigned count)
279 {
280 softpipe_draw_range_elements_instanced(pipe,
281 NULL,
282 0,
283 0,
284 0,
285 0xffffffff,
286 mode,
287 start,
288 count,
289 0,
290 1);
291 }
292