draw: fix front face injection
authorZack Rusin <zackr@vmware.com>
Fri, 2 Aug 2013 05:50:05 +0000 (01:50 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 3 Aug 2013 04:36:39 +0000 (00:36 -0400)
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@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_pipe_unfilled.c

index d8a603f61cb5d91a7cfdf90240ea246e0c5dcd1f..c6ee95c56b16a2b57c2b9bdc2cf0942b4696fbd5 100644 (file)
@@ -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 {