Mesa (master): draw: additional fix for the no-position case with llvm

Roland Scheidegger sroland at kemper.freedesktop.org
Sat Mar 2 02:05:29 UTC 2013


Module: Mesa
Branch: master
Commit: c7c7186045ec617c53f7899280cbe12e59503e4d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c7c7186045ec617c53f7899280cbe12e59503e4d

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Sat Mar  2 02:29:22 2013 +0100

draw: additional fix for the no-position case with llvm

Similar fix to what is done for the non-llvm case, we could otherwise still
hit the stages (near certainly with gs) which crash. It is probably a much
better idea to skip trying to draw at that point anyway.

Reviewed-by: Brian Paul <brianp at vmware.com>

---

 .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |   40 ++++++++++----------
 1 files changed, 20 insertions(+), 20 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 b0c18ed..687dfa4 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
@@ -300,31 +300,31 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
       FREE(vert_info->verts);
       vert_info = &gs_vert_info;
       prim_info = &gs_prim_info;
-
-      clipped = draw_pt_post_vs_run( fpme->post_vs, vert_info );
-
    }
 
    /* stream output needs to be done before clipping */
-   draw_pt_so_emit( fpme->so_emit,
-		    vert_info,
-                    prim_info );
-
-   if (clipped) {
-      opt |= PT_PIPELINE;
-   }
+   draw_pt_so_emit( fpme->so_emit, vert_info, prim_info );
 
-   /* Do we need to run the pipeline? Now will come here if clipped
+   /*
+    * if there's no position, need to stop now, or the latter stages
+    * will try to access non-existent position output.
     */
-   if (opt & PT_PIPELINE) {
-      pipeline( fpme,
-                vert_info,
-                prim_info );
-   }
-   else {
-      emit( fpme->emit,
-            vert_info,
-            prim_info );
+   if (draw_current_shader_position_output(draw) != -1) {
+      if ((opt & PT_SHADE) && gshader) {
+         clipped = draw_pt_post_vs_run( fpme->post_vs, vert_info );
+      }
+      if (clipped) {
+         opt |= PT_PIPELINE;
+      }
+
+      /* Do we need to run the pipeline? Now will come here if clipped
+       */
+      if (opt & PT_PIPELINE) {
+         pipeline( fpme, vert_info, prim_info );
+      }
+      else {
+         emit( fpme->emit, vert_info, prim_info );
+      }
    }
    FREE(vert_info->verts);
 }




More information about the mesa-commit mailing list