mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
sp: Generalise drawing code to remove dupes.
Also, avoid nested draw calls from simpler versions.
This commit is contained in:
parent
bccdb239c7
commit
230355648b
1 changed files with 86 additions and 83 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue