summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
diff options
context:
space:
mode:
authorZack Rusin <zack@kde.org>2010-05-31 02:20:34 -0400
committerZack Rusin <zackr@vmware.com>2010-06-08 06:28:10 -0400
commitc9db97c8229689060fab0edee7df717f804b99ce (patch)
tree377767cfb01881eb1fc29fb2ca23d80219bd7409 /src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
parenta45b7f47ee0e38b288cc8fc4f6a1c013e8c227bc (diff)
gallium: a lot more complete implementation of stream output
interface wise we have everything needed by d3d10 and gl transform feedback. the draw module misses implementation of some corner cases (e.g. when stream output wants different number of components per output than normal rendering paths)
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
index d56889b5f6..584a1a53d4 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
@@ -40,6 +40,7 @@ struct llvm_middle_end {
struct draw_context *draw;
struct pt_emit *emit;
+ struct pt_so_emit *so_emit;
struct pt_fetch *fetch;
struct pt_post_vs *post_vs;
@@ -104,6 +105,7 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
(boolean)draw->rasterizer->gl_rasterization_rules,
(draw->vs.edgeflag_output ? true : false) );
+ draw_pt_so_emit_prepare( fpme->so_emit, prim );
if (!(opt & PT_PIPELINE)) {
draw_pt_emit_prepare( fpme->emit,
prim,
@@ -175,6 +177,12 @@ static void llvm_middle_end_run( struct draw_pt_middle_end *middle,
fpme->vertex_size,
draw->pt.vertex_buffer );
+ /* stream output needs to be done before clipping */
+ draw_pt_so_emit( fpme->so_emit,
+ (const float (*)[4])pipeline_verts->data,
+ fetch_count,
+ fpme->vertex_size );
+
if (draw_pt_post_vs_run( fpme->post_vs,
pipeline_verts,
fetch_count,
@@ -239,6 +247,12 @@ static void llvm_middle_end_linear_run( struct draw_pt_middle_end *middle,
fpme->vertex_size,
draw->pt.vertex_buffer );
+ /* stream output needs to be done before clipping */
+ draw_pt_so_emit( fpme->so_emit,
+ (const float (*)[4])pipeline_verts->data,
+ count,
+ fpme->vertex_size );
+
if (draw_pt_post_vs_run( fpme->post_vs,
pipeline_verts,
count,
@@ -294,6 +308,12 @@ llvm_middle_end_linear_run_elts( struct draw_pt_middle_end *middle,
fpme->vertex_size,
draw->pt.vertex_buffer );
+ /* stream output needs to be done before clipping */
+ draw_pt_so_emit( fpme->so_emit,
+ (const float (*)[4])pipeline_verts->data,
+ count,
+ fpme->vertex_size );
+
if (draw_pt_post_vs_run( fpme->post_vs,
pipeline_verts,
count,
@@ -367,6 +387,9 @@ static void llvm_middle_end_destroy( struct draw_pt_middle_end *middle )
if (fpme->emit)
draw_pt_emit_destroy( fpme->emit );
+ if (fpme->so_emit)
+ draw_pt_so_emit_destroy( fpme->so_emit );
+
if (fpme->post_vs)
draw_pt_post_vs_destroy( fpme->post_vs );
@@ -409,6 +432,10 @@ struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit_llvm( struct draw_cont
if (!fpme->emit)
goto fail;
+ fpme->so_emit = draw_pt_so_emit_create( draw );
+ if (!fpme->so_emit)
+ goto fail;
+
fpme->llvm = draw_llvm_create(draw);
if (!fpme->llvm)
goto fail;