summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2008-06-06 15:04:45 +0100
committerKeith Whitwell <keith@tungstengraphics.com>2008-06-06 15:08:05 +0100
commit0931b421d67b8ce471f17d43c183017f1eb92e31 (patch)
treea47f213557f08fcc17b405a3b783ee859f1c7a81 /src
parent1a2c445baf9f493b1590d715314a1c240e4c9ef7 (diff)
draw: make sure middle-end primitive is uptodate in vcache
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt_vcache.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_vcache.c b/src/gallium/auxiliary/draw/draw_pt_vcache.c
index 2eafe270bc0..cda2987c9ed 100644
--- a/src/gallium/auxiliary/draw/draw_pt_vcache.c
+++ b/src/gallium/auxiliary/draw/draw_pt_vcache.c
@@ -58,10 +58,21 @@ struct vcache_frontend {
unsigned input_prim;
unsigned output_prim;
+
+ unsigned middle_prim;
+ unsigned opt;
};
static void vcache_flush( struct vcache_frontend *vcache )
{
+ if (vcache->middle_prim != vcache->output_prim) {
+ vcache->middle_prim = vcache->output_prim;
+ vcache->middle->prepare( vcache->middle,
+ vcache->middle_prim,
+ vcache->opt,
+ &vcache->fetch_max );
+ }
+
if (vcache->draw_count) {
vcache->middle->run( vcache->middle,
vcache->fetch_elts,
@@ -308,6 +319,14 @@ static void vcache_check_run( struct draw_pt_front_end *frontend,
goto fail;
}
+ if (vcache->middle_prim != vcache->input_prim) {
+ vcache->middle_prim = vcache->input_prim;
+ vcache->middle->prepare( vcache->middle,
+ vcache->middle_prim,
+ vcache->opt,
+ &vcache->fetch_max );
+ }
+
if (min_index == 0 &&
index_size == 2)
@@ -412,7 +431,13 @@ static void vcache_prepare( struct draw_pt_front_end *frontend,
vcache->output_prim = draw_pt_reduced_prim(prim);
vcache->middle = middle;
- middle->prepare( middle, vcache->output_prim, opt, &vcache->fetch_max );
+ vcache->opt = opt;
+
+ /* Have to run prepare here, but try and guess a good prim for
+ * doing so:
+ */
+ vcache->middle_prim = (opt & PT_PIPELINE) ? vcache->output_prim : vcache->input_prim;
+ middle->prepare( middle, vcache->middle_prim, opt, &vcache->fetch_max );
}