180
brw_draw_range_elements(struct pipe_context *pipe,
181
struct pipe_buffer *index_buffer,
185
unsigned mode, unsigned start, unsigned count)
180
brw_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
187
182
struct brw_context *brw = brw_context(pipe);
189
184
uint32_t hw_prim;
191
hw_prim = brw_set_prim(brw, mode);
186
hw_prim = brw_set_prim(brw, info->mode);
193
188
if (BRW_DEBUG & DEBUG_PRIMS)
194
189
debug_printf("PRIM: %s start %d count %d index_buffer %p\n",
195
u_prim_name(mode), start, count, (void *)index_buffer);
197
/* Potentially trigger upload of new index buffer.
199
* XXX: do we need to go through state validation to achieve this?
200
* Could just call upload code directly.
202
if (brw->curr.index_buffer != index_buffer ||
203
brw->curr.index_size != index_size) {
204
pipe_buffer_reference( &brw->curr.index_buffer, index_buffer );
205
brw->curr.index_size = index_size;
206
brw->state.dirty.mesa |= PIPE_NEW_INDEX_BUFFER;
209
/* XXX: do we really care?
211
if (brw->curr.min_index != min_index ||
212
brw->curr.max_index != max_index)
190
u_prim_name(info->mode), info->start, info->count,
191
(void *) brw->curr.index_buffer);
193
assert(info->index_bias == 0);
195
/* Potentially trigger upload of new index buffer range.
196
* XXX: do we really care?
198
if (brw->curr.min_index != info->min_index ||
199
brw->curr.max_index != info->max_index)
214
brw->curr.min_index = min_index;
215
brw->curr.max_index = max_index;
201
brw->curr.min_index = info->min_index;
202
brw->curr.max_index = info->max_index;
216
203
brw->state.dirty.mesa |= PIPE_NEW_INDEX_RANGE;
220
207
/* Make a first attempt at drawing:
222
ret = try_draw_range_elements(brw, index_buffer, hw_prim, start, count );
209
ret = try_draw_range_elements(brw, info->indexed,
210
hw_prim, info->start, info->count);
224
212
/* Otherwise, flush and retry:
227
215
brw_context_flush( brw );
228
ret = try_draw_range_elements(brw, index_buffer, hw_prim, start, count );
216
ret = try_draw_range_elements(brw, info->indexed,
217
hw_prim, info->start, info->count);
229
218
assert(ret == 0);
234
brw_draw_elements(struct pipe_context *pipe,
235
struct pipe_buffer *index_buffer,
238
unsigned start, unsigned count)
240
brw_draw_range_elements( pipe, index_buffer,
248
brw_draw_arrays(struct pipe_context *pipe, unsigned mode,
249
unsigned start, unsigned count)
251
brw_draw_elements(pipe, NULL, 0, mode, start, count);
256
223
boolean brw_draw_init( struct brw_context *brw )
258
225
/* Register our drawing function:
260
brw->base.draw_arrays = brw_draw_arrays;
261
brw->base.draw_elements = brw_draw_elements;
262
brw->base.draw_range_elements = brw_draw_range_elements;
227
brw->base.draw_vbo = brw_draw_vbo;
264
229
/* Create helpers for uploading data in user buffers:
266
brw->vb.upload_vertex = u_upload_create( brw->base.screen,
231
brw->vb.upload_vertex = u_upload_create( &brw->base,
269
PIPE_BUFFER_USAGE_VERTEX );
234
PIPE_BIND_VERTEX_BUFFER );
270
235
if (brw->vb.upload_vertex == NULL)
273
brw->vb.upload_index = u_upload_create( brw->base.screen,
238
brw->vb.upload_index = u_upload_create( &brw->base,
276
PIPE_BUFFER_USAGE_INDEX );
241
PIPE_BIND_INDEX_BUFFER );
277
242
if (brw->vb.upload_index == NULL)