sp: Implement draw_elements_instanced().

This commit is contained in:
Michal Krol 2009-12-30 18:27:58 +01:00
parent 5007e39f76
commit bccdb239c7
3 changed files with 55 additions and 2 deletions

View File

@ -239,6 +239,7 @@ softpipe_create( struct pipe_screen *screen )
softpipe->pipe.draw_elements = softpipe_draw_elements;
softpipe->pipe.draw_range_elements = softpipe_draw_range_elements;
softpipe->pipe.draw_arrays_instanced = softpipe_draw_arrays_instanced;
softpipe->pipe.draw_elements_instanced = softpipe_draw_elements_instanced;
softpipe->pipe.clear = softpipe_clear;
softpipe->pipe.flush = softpipe_flush;

View File

@ -192,6 +192,26 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
unsigned count,
unsigned startInstance,
unsigned instanceCount)
{
return softpipe_draw_elements_instanced(pipe,
NULL,
0,
mode,
start,
count,
startInstance,
instanceCount);
}
boolean
softpipe_draw_elements_instanced(struct pipe_context *pipe,
struct pipe_buffer *indexBuffer,
unsigned indexSize,
unsigned mode,
unsigned start,
unsigned count,
unsigned startInstance,
unsigned instanceCount)
{
struct softpipe_context *sp = softpipe_context(pipe);
struct draw_context *draw = sp->draw;
@ -216,8 +236,26 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
draw_set_mapped_vertex_buffer(draw, i, buf);
}
draw_set_mapped_element_buffer_range(draw, 0, start,
start + count - 1, NULL);
/* Map index buffer, if present */
if (indexBuffer) {
void *mapped_indexes;
mapped_indexes = pipe_buffer_map(pipe->screen,
indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer_range(draw,
indexSize,
0,
0xffffffff,
mapped_indexes);
} else {
/* no index/element buffer */
draw_set_mapped_element_buffer_range(draw,
0,
start,
start + count - 1,
NULL);
}
/* draw! */
draw_arrays_instanced(draw, mode, start, count, startInstance, instanceCount);
@ -227,6 +265,10 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
draw_set_mapped_vertex_buffer(draw, i, NULL);
pipe_buffer_unmap(pipe->screen, sp->vertex_buffer[i].buffer);
}
if (indexBuffer) {
draw_set_mapped_element_buffer(draw, 0, NULL);
pipe_buffer_unmap(pipe->screen, indexBuffer);
}
/* Note: leave drawing surfaces mapped */
softpipe_unmap_constant_buffers(sp);

View File

@ -197,6 +197,16 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
unsigned startInstance,
unsigned instanceCount);
boolean
softpipe_draw_elements_instanced(struct pipe_context *pipe,
struct pipe_buffer *indexBuffer,
unsigned indexSize,
unsigned mode,
unsigned start,
unsigned count,
unsigned startInstance,
unsigned instanceCount);
void
softpipe_map_transfers(struct softpipe_context *sp);