summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/draw/draw_pt.c
diff options
context:
space:
mode:
authorZack Rusin <zack@tungstengraphics.com>2008-04-24 16:22:47 -0400
committerKeith Whitwell <keith@tungstengraphics.com>2008-04-25 14:20:25 +0100
commit992d0b997f8f7e965e56852b81e01c290f8c13de (patch)
tree80910dbe213d341b7607ccaa359590a05b9d3d46 /src/gallium/auxiliary/draw/draw_pt.c
parenta7ce6d399221fbb59d96d56c853de9781bbf2547 (diff)
frontend for rendering without elts
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c
index f5a3bf390e..d6585bbfd0 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -53,12 +53,14 @@ draw_pt_arrays(struct draw_context *draw,
struct draw_pt_front_end *frontend = NULL;
struct draw_pt_middle_end *middle = NULL;
unsigned opt = 0;
+ pt_elt_func get_elt = 0;
+ void *elts = 0;
if (!draw->render) {
opt |= PT_PIPELINE;
}
- if (draw_need_pipeline(draw,
+ if (draw_need_pipeline(draw,
draw->rasterizer,
prim)) {
opt |= PT_PIPELINE;
@@ -78,16 +80,21 @@ draw_pt_arrays(struct draw_context *draw,
middle = draw->pt.middle.fetch_emit;
- /* May create a short-circuited version of this for small primitives:
+ /* Pick the right frontend
*/
- frontend = draw->pt.front.vcache;
+ if (draw->pt.user.elts ||
+ count >= 256) {
+ frontend = draw->pt.front.vcache;
+ get_elt = draw_pt_elt_func(draw);
+ elts = draw_pt_elt_ptr(draw, start);
+ } else {
+ frontend = draw->pt.front.varray;
+ elts = start;
+ }
frontend->prepare( frontend, prim, middle, opt );
- frontend->run( frontend,
- draw_pt_elt_func( draw ),
- draw_pt_elt_ptr( draw, start ),
- count );
+ frontend->run(frontend, get_elt, elts, count);
frontend->finish( frontend );
@@ -101,6 +108,10 @@ boolean draw_pt_init( struct draw_context *draw )
if (!draw->pt.front.vcache)
return FALSE;
+ draw->pt.front.varray = draw_pt_varray(draw);
+ if (!draw->pt.front.varray)
+ return FALSE;
+
draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw );
if (!draw->pt.middle.fetch_emit)
return FALSE;
@@ -129,6 +140,11 @@ void draw_pt_destroy( struct draw_context *draw )
draw->pt.front.vcache->destroy( draw->pt.front.vcache );
draw->pt.front.vcache = NULL;
}
+
+ if (draw->pt.front.varray) {
+ draw->pt.front.varray->destroy( draw->pt.front.varray );
+ draw->pt.front.varray = NULL;
+ }
}