sp: Generalise drawing code to remove dupes.

Also, avoid nested draw calls from simpler versions.
This commit is contained in:
Michal Krol 2009-12-30 18:41:05 +01:00
parent bccdb239c7
commit 230355648b

View file

@ -88,19 +88,41 @@ softpipe_unmap_constant_buffers(struct softpipe_context *sp)
}
boolean
softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
unsigned start, unsigned count)
{
return softpipe_draw_elements(pipe, NULL, 0, mode, start, count);
}
/**
* Draw vertex arrays, with optional indexing.
* Basically, map the vertex buffers (and drawing surfaces), then hand off
* the drawing to the 'draw' module.
*/
static boolean
softpipe_draw_range_elements_instanced(struct pipe_context *pipe,
struct pipe_buffer *indexBuffer,
unsigned indexSize,
unsigned minIndex,
unsigned maxIndex,
unsigned mode,
unsigned start,
unsigned count,
unsigned startInstance,
unsigned instanceCount);
boolean
softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
unsigned start, unsigned count)
{
return softpipe_draw_range_elements_instanced(pipe,
NULL,
0,
0,
0xffffffff,
mode,
start,
count,
0,
1);
}
boolean
softpipe_draw_range_elements(struct pipe_context *pipe,
struct pipe_buffer *indexBuffer,
@ -109,67 +131,16 @@ softpipe_draw_range_elements(struct pipe_context *pipe,
unsigned max_index,
unsigned mode, unsigned start, unsigned count)
{
struct softpipe_context *sp = softpipe_context(pipe);
struct draw_context *draw = sp->draw;
unsigned i;
sp->reduced_api_prim = u_reduced_prim(mode);
if (sp->dirty)
softpipe_update_derived( sp );
softpipe_map_transfers(sp);
softpipe_map_constant_buffers(sp);
/*
* Map vertex buffers
*/
for (i = 0; i < sp->num_vertex_buffers; i++) {
void *buf
= pipe_buffer_map(pipe->screen,
sp->vertex_buffer[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_vertex_buffer(draw, i, buf);
}
/* Map index buffer, if present */
if (indexBuffer) {
void *mapped_indexes
= pipe_buffer_map(pipe->screen, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer_range(draw, indexSize,
min_index,
max_index,
mapped_indexes);
}
else {
/* no index/element buffer */
draw_set_mapped_element_buffer_range(draw, 0, start,
start + count - 1, NULL);
}
/* draw! */
draw_arrays(draw, mode, start, count);
/*
* unmap vertex/index buffers - will cause draw module to flush
*/
for (i = 0; i < sp->num_vertex_buffers; i++) {
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);
sp->dirty_render_cache = TRUE;
return TRUE;
return softpipe_draw_range_elements_instanced(pipe,
indexBuffer,
indexSize,
min_index,
max_index,
mode,
start,
count,
0,
1);
}
@ -179,10 +150,16 @@ softpipe_draw_elements(struct pipe_context *pipe,
unsigned indexSize,
unsigned mode, unsigned start, unsigned count)
{
return softpipe_draw_range_elements( pipe, indexBuffer,
indexSize,
0, 0xffffffff,
mode, start, count );
return softpipe_draw_range_elements_instanced(pipe,
indexBuffer,
indexSize,
0,
0xffffffff,
mode,
start,
count,
0,
1);
}
boolean
@ -193,14 +170,16 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
unsigned startInstance,
unsigned instanceCount)
{
return softpipe_draw_elements_instanced(pipe,
NULL,
0,
mode,
start,
count,
startInstance,
instanceCount);
return softpipe_draw_range_elements_instanced(pipe,
NULL,
0,
0,
0xffffffff,
mode,
start,
count,
startInstance,
instanceCount);
}
boolean
@ -212,6 +191,30 @@ softpipe_draw_elements_instanced(struct pipe_context *pipe,
unsigned count,
unsigned startInstance,
unsigned instanceCount)
{
return softpipe_draw_range_elements_instanced(pipe,
indexBuffer,
indexSize,
0,
0xffffffff,
mode,
start,
count,
startInstance,
instanceCount);
}
static boolean
softpipe_draw_range_elements_instanced(struct pipe_context *pipe,
struct pipe_buffer *indexBuffer,
unsigned indexSize,
unsigned minIndex,
unsigned maxIndex,
unsigned mode,
unsigned start,
unsigned count,
unsigned startInstance,
unsigned instanceCount)
{
struct softpipe_context *sp = softpipe_context(pipe);
struct draw_context *draw = sp->draw;
@ -245,8 +248,8 @@ softpipe_draw_elements_instanced(struct pipe_context *pipe,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer_range(draw,
indexSize,
0,
0xffffffff,
minIndex,
maxIndex,
mapped_indexes);
} else {
/* no index/element buffer */