Mesa (master): draw: fix front face injection

Zack Rusin zack at kemper.freedesktop.org
Mon Aug 5 18:27:54 UTC 2013


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

Author: Zack Rusin <zackr at vmware.com>
Date:   Fri Aug  2 01:50:05 2013 -0400

draw: fix front face injection

Inject front face only if the fragment shader uses it and
propagate through all channels because otherwise we'll
need to figure out the exact swizzle that the fs expects and
it's just simpler to make sure all the components within
the front face register are correctly set.

Signed-off-by: Zack Rusin <zackr at vmware.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/auxiliary/draw/draw_pipe_unfilled.c |   24 ++++++++++++++--------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_unfilled.c b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
index d8a603f..c6ee95c 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
@@ -37,6 +37,7 @@
 #include "pipe/p_defines.h"
 #include "draw_private.h"
 #include "draw_pipe.h"
+#include "draw_fs.h"
 
 
 struct unfilled_stage {
@@ -67,18 +68,20 @@ inject_front_face_info(struct draw_stage *stage,
       (stage->draw->rasterizer->front_ccw && ccw) ||
       (!stage->draw->rasterizer->front_ccw && !ccw));
    unsigned slot = unfilled->face_slot;
-   struct vertex_header *v0 = header->v[0];
-   struct vertex_header *v1 = header->v[1];
-   struct vertex_header *v2 = header->v[2];
+   unsigned i;
 
    /* In case the backend doesn't care about it */
    if (slot < 0) {
       return;
    }
 
-   v0->data[slot][0] = is_front_face;
-   v1->data[slot][0] = is_front_face;
-   v2->data[slot][0] = is_front_face;
+   for (i = 0; i < 3; ++i) {
+      struct vertex_header *v = header->v[i];
+      v->data[slot][0] = is_front_face;
+      v->data[slot][1] = is_front_face;
+      v->data[slot][2] = is_front_face;
+      v->data[slot][3] = is_front_face;
+   }
 }
 
    
@@ -231,9 +234,12 @@ draw_unfilled_prepare_outputs( struct draw_context *draw,
 {
    struct unfilled_stage *unfilled = unfilled_stage(stage);
    const struct pipe_rasterizer_state *rast = draw ? draw->rasterizer : 0;
-   if (rast &&
-       (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
-        rast->fill_back != PIPE_POLYGON_MODE_FILL)) {
+   boolean is_unfilled = (rast &&
+                          (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
+                           rast->fill_back != PIPE_POLYGON_MODE_FILL));
+   const struct draw_fragment_shader *fs = draw->fs.fragment_shader;
+
+   if (is_unfilled && fs && fs->info.uses_frontface)  {
       unfilled->face_slot = draw_alloc_extra_vertex_attrib(
          stage->draw, TGSI_SEMANTIC_FACE, 0);
    } else {




More information about the mesa-commit mailing list