summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/draw/draw_pt.c
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-04-27 18:04:50 +1000
committerBen Skeggs <skeggsb@gmail.com>2008-04-27 18:04:50 +1000
commit0cca90cea1dbe1a76dbf9ac1985c3676ec460b0a (patch)
tree6e496a5d77d13a9f1679006c3c5334e0b8d889f4 /src/gallium/auxiliary/draw/draw_pt.c
parent7342688286cc3b7c938af2dfeac22df4fa8c8464 (diff)
parenta8e39b6f5a1fedf2f8719e1adb8802ebbfc09688 (diff)
Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c
index f5a3bf390e..c9c5d18313 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -58,7 +58,7 @@ draw_pt_arrays(struct draw_context *draw,
opt |= PT_PIPELINE;
}
- if (draw_need_pipeline(draw,
+ if (draw_need_pipeline(draw,
draw->rasterizer,
prim)) {
opt |= PT_PIPELINE;
@@ -78,16 +78,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;
+ } else {
+ frontend = draw->pt.front.varray;
+ }
frontend->prepare( frontend, prim, middle, opt );
- frontend->run( frontend,
- draw_pt_elt_func( draw ),
- draw_pt_elt_ptr( draw, start ),
- count );
+ frontend->run(frontend,
+ draw_pt_elt_func(draw),
+ draw_pt_elt_ptr(draw, start),
+ count);
frontend->finish( frontend );
@@ -101,6 +106,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 +138,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;
+ }
}