gallium: add interface for DrawAuto and implement it in softpipe

This commit is contained in:
Zack Rusin
2010-05-31 20:41:18 -04:00
committed by Zack Rusin
parent c9db97c822
commit ba5975dd32
6 changed files with 75 additions and 1 deletions
@@ -276,6 +276,7 @@ softpipe_create_context( struct pipe_screen *screen,
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.draw_auto = softpipe_draw_auto;
softpipe->pipe.clear = softpipe_clear;
softpipe->pipe.flush = softpipe_flush;
@@ -80,6 +80,12 @@ struct softpipe_context {
struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_VERTEX_SAMPLERS];
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
struct {
struct softpipe_resource *buffer[PIPE_MAX_SO_BUFFERS];
int offset[PIPE_MAX_SO_BUFFERS];
int so_count[PIPE_MAX_SO_BUFFERS];
int num_buffers;
} so_target;
unsigned num_samplers;
unsigned num_sampler_views;
@@ -84,6 +84,57 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
1);
}
void
softpipe_draw_auto(struct pipe_context *pipe, unsigned mode)
{
struct softpipe_context *sp = softpipe_context(pipe);
struct draw_context *draw = sp->draw;
const unsigned start = 0;
const unsigned count = sp->so_target.so_count[0];
void *buf = sp->so_target.buffer[0]->data;
int offset = sp->so_target.offset[0];
if (!softpipe_check_render_cond(sp) ||
sp->so_target.num_buffers != 1)
return;
sp->reduced_api_prim = u_reduced_prim(mode);
if (sp->dirty) {
softpipe_update_derived(sp);
}
softpipe_map_transfers(sp);
/* Map so buffers */
if (offset < 0) /* we were appending so start from beginning */
offset = 0;
buf = (void*)((int32_t*)buf + offset);
draw_set_mapped_vertex_buffer(draw, 0, buf);
draw_set_mapped_element_buffer_range(draw,
0, 0,
start,
start + count - 1,
NULL);
/* draw! */
draw_arrays_instanced(draw, mode, start, count, 0, 1);
/* unmap vertex/index buffers - will cause draw module to flush */
draw_set_mapped_vertex_buffer(draw, 0, NULL);
/*
* TODO: Flush only when a user vertex/index buffer is present
* (or even better, modify draw module to do this
* internally when this condition is seen?)
*/
draw_flush(draw);
/* Note: leave drawing surfaces mapped */
sp->dirty_render_cache = TRUE;
}
void
softpipe_draw_range_elements(struct pipe_context *pipe,
+2
View File
@@ -250,6 +250,8 @@ softpipe_draw_elements_instanced(struct pipe_context *pipe,
unsigned startInstance,
unsigned instanceCount);
void softpipe_draw_auto(struct pipe_context *pipe, unsigned mode);
void
softpipe_map_transfers(struct softpipe_context *sp);
+10 -1
View File
@@ -93,7 +93,14 @@ softpipe_set_stream_output_buffers(struct pipe_context *pipe,
softpipe->dirty |= SP_NEW_SO_BUFFERS;
for (i = 0; i < num_buffers; ++i) {
void *mapped = softpipe_resource(buffers[i])->data;
void *mapped;
struct softpipe_resource *res = softpipe_resource(buffers[i]);
softpipe->so_target.buffer[i] = res;
softpipe->so_target.offset[i] = offsets[i];
softpipe->so_target.so_count[i] = 0;
mapped = res->data;
if (offsets[i] >= 0)
map_buffers[i] = ((char*)mapped) + offsets[i];
else {
@@ -102,5 +109,7 @@ softpipe_set_stream_output_buffers(struct pipe_context *pipe,
map_buffers[i] = mapped;
}
}
softpipe->so_target.num_buffers = num_buffers;
draw_set_mapped_so_buffers(softpipe->draw, map_buffers, num_buffers);
}
+5
View File
@@ -101,6 +101,11 @@ struct pipe_context {
unsigned mode,
unsigned start,
unsigned count);
/**
* Draw the stream output buffer at index 0
*/
void (*draw_auto)( struct pipe_context *pipe, unsigned mode );
/*@}*/
/**