llvmpipe: don't interpolate front face or prim id
authorZack Rusin <zackr@vmware.com>
Fri, 2 Aug 2013 05:53:15 +0000 (01:53 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 3 Aug 2013 00:12:53 +0000 (20:12 -0400)
The loop was iterating over all the fs inputs and setting them
to perspective interpolation, then after the loop we were
creating extra output slots with the correct interpolation. Instead
of injecting bogus extra outputs, just set the interpolation
on front face and prim id correctly when doing the initial scan
of fs inputs.

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/drivers/llvmpipe/lp_state_derived.c

index 5a51b50821e5e7a3e31cd3496f95a5865d750978..8aee92b1b9607d77194466d9d85721a7c9cd2ba1 100644 (file)
@@ -69,8 +69,8 @@ compute_vertex_info(struct llvmpipe_context *llvmpipe)
    vinfo->num_attribs = 0;
 
    vs_index = draw_find_shader_output(llvmpipe->draw,
-                                       TGSI_SEMANTIC_POSITION,
-                                       0);
+                                      TGSI_SEMANTIC_POSITION,
+                                      0);
 
    draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index);
 
@@ -89,12 +89,18 @@ compute_vertex_info(struct llvmpipe_context *llvmpipe)
          llvmpipe->color_slot[idx] = (int)vinfo->num_attribs;
       }
 
-      /*
-       * Emit the requested fs attribute for all but position.
-       */
-      draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index);
+      if (lpfs->info.base.input_semantic_name[i] == TGSI_SEMANTIC_FACE) {
+         llvmpipe->face_slot = vinfo->num_attribs;
+         draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_CONSTANT, vs_index);
+      } else if (lpfs->info.base.input_semantic_name[i] == TGSI_SEMANTIC_PRIMID) {
+         draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_CONSTANT, vs_index);
+      } else {
+         /*
+          * Emit the requested fs attribute for all but position.
+          */
+         draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index);
+      }
    }
-
    /* Figure out if we need bcolor as well.
     */
    for (i = 0; i < 2; i++) {
@@ -140,14 +146,6 @@ compute_vertex_info(struct llvmpipe_context *llvmpipe)
       llvmpipe->layer_slot = 0;
    }
 
-   /* Check for a fake front face for unfilled primitives*/
-   vs_index = draw_find_shader_output(llvmpipe->draw,
-                                      TGSI_SEMANTIC_FACE, 0);
-   if (vs_index >= 0) {
-      llvmpipe->face_slot = vinfo->num_attribs;
-      draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_CONSTANT, vs_index);
-   }
-
    draw_compute_vertex_size(vinfo);
    lp_setup_set_vertex_info(llvmpipe->setup, vinfo);
 }