summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw/draw_pt.c
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2008-04-03 12:21:30 +0100
committerKeith Whitwell <[email protected]>2008-04-03 12:21:30 +0100
commitd2cb4ba0bb2388c784f145c59f3798f914dc7f39 (patch)
tree61ab6f6d5e4311c2d98cebe3de1c821a4ef65bda /src/gallium/auxiliary/draw/draw_pt.c
parentadd46fbc8cc04d3bce303815541a7bc5d0b33953 (diff)
draw: add passthrough path to the pipeline
This handles the case where bypass_vs is set, but vertices need to go through the pipeline for some reason - eg unfilled polygon mode. Demonstrates how to drive the pipeline from inside one of these things.
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c
index c3baf5b7da7..f59fb86f781 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -73,7 +73,6 @@ draw_pt_arrays(struct draw_context *draw,
*/
-#if 0
if (!cliptest && !pipeline && !shading) {
/* This is the 'passthrough' path:
*/
@@ -81,6 +80,14 @@ draw_pt_arrays(struct draw_context *draw,
*/
middle = draw->pt.middle.fetch_emit;
}
+ else if (!cliptest && !shading) {
+ /* This is the 'passthrough' path targetting the pipeline backend.
+ */
+ /* Fetch user verts, emit pipeline verts, run pipeline:
+ */
+ middle = draw->pt.middle.fetch_pipeline;
+ }
+#if 0
else if (!cliptest && !pipeline) {
/* Fetch user verts, run vertex shader, emit hw verts:
*/
@@ -117,10 +124,9 @@ draw_pt_arrays(struct draw_context *draw,
middle = draw->pt.middle.fetch_shade_cliptest_pipeline;
}
#else
- if (cliptest || pipeline || shading)
+ else {
return FALSE;
-
- middle = draw->pt.middle.fetch_emit;
+ }
#endif
@@ -190,6 +196,10 @@ boolean draw_pt_init( struct draw_context *draw )
if (!draw->pt.middle.fetch_emit)
return FALSE;
+ draw->pt.middle.fetch_pipeline = draw_pt_fetch_pipeline( draw );
+ if (!draw->pt.middle.fetch_pipeline)
+ return FALSE;
+
draw->pt.front.vcache = draw_pt_vcache( draw );
if (!draw->pt.front.vcache)
return FALSE;
@@ -205,6 +215,11 @@ void draw_pt_destroy( struct draw_context *draw )
draw->pt.middle.fetch_emit = NULL;
}
+ if (draw->pt.middle.fetch_pipeline) {
+ draw->pt.middle.fetch_pipeline->destroy( draw->pt.middle.fetch_pipeline );
+ draw->pt.middle.fetch_pipeline = NULL;
+ }
+
if (draw->pt.front.vcache) {
draw->pt.front.vcache->destroy( draw->pt.front.vcache );
draw->pt.front.vcache = NULL;