i965 Gen4/5: clip: correctly handle flat varyings
authorChris Forbes <chrisf@ijw.co.nz>
Sun, 7 Jul 2013 07:47:19 +0000 (19:47 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Thu, 1 Aug 2013 08:58:56 +0000 (20:58 +1200)
Previously we only gave special treatment to the builtin color varyings.
This patch adds support for arbitrary flat-shaded varyings, which is
required for GLSL 1.30.

Based on Olivier Galibert's patch from last year:
http://lists.freedesktop.org/archives/mesa-dev/2012-July/024340.html

V5: Move key.do_flat_shading to brw_clip_compile.has_flat_shading
V6: Real bools.

[V1-2]: Signed-off-by: Olivier Galibert <galibert at pobox.com>
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_clip.h
src/mesa/drivers/dri/i965/brw_clip_line.c
src/mesa/drivers/dri/i965/brw_clip_tri.c
src/mesa/drivers/dri/i965/brw_clip_unfilled.c
src/mesa/drivers/dri/i965/brw_clip_util.c

index 7621675969df8e88792746d6898b9433391f8eb9..1c2a4bc6eb88ad1c5de3b5128753ee1ac3f72bfe 100644 (file)
@@ -70,6 +70,9 @@ static void compile_clip_prog( struct brw_context *brw,
    c.key = *key;
    c.vue_map = brw->vue_map_geom_out;
 
+   c.has_flat_shading =
+      brw_any_flat_varyings(&key->interpolation_mode);
+
    /* nr_regs is the number of registers filled by reading data from the VUE.
     * This program accesses the entire VUE, so nr_regs needs to be the size of
     * the VUE (measured in pairs, since two slots are stored in each
@@ -149,8 +152,8 @@ brw_upload_clip_prog(struct brw_context *brw)
    key.primitive = brw->reduced_primitive;
    /* BRW_NEW_VUE_MAP_GEOM_OUT */
    key.attrs = brw->vue_map_geom_out.slots_valid;
+
    /* _NEW_LIGHT */
-   key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT);
    key.pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION);
    /* _NEW_TRANSFORM (also part of VUE map)*/
    key.nr_userclip = _mesa_bitcount_64(ctx->Transform.ClipPlanesEnabled);
index e0d75b0e555d3579811c9e67b4fd8533892836e0..ecbf7416439ed4b1ee80f384257a5a51990f4e9b 100644 (file)
@@ -46,7 +46,6 @@ struct brw_clip_prog_key {
    struct interpolation_mode_map interpolation_mode;
    GLuint primitive:4;
    GLuint nr_userclip:4;
-   GLuint do_flat_shading:1;
    GLuint pv_first:1;
    GLuint do_unfilled:1;
    GLuint fill_cw:2;           /* includes cull information */
@@ -121,6 +120,8 @@ struct brw_clip_compile {
    bool need_direction;
 
    struct brw_vue_map vue_map;
+
+   bool has_flat_shading;
 };
 
 /**
@@ -173,8 +174,8 @@ void brw_clip_kill_thread(struct brw_clip_compile *c);
 struct brw_reg brw_clip_plane_stride( struct brw_clip_compile *c );
 struct brw_reg brw_clip_plane0_address( struct brw_clip_compile *c );
 
-void brw_clip_copy_colors( struct brw_clip_compile *c,
-                          GLuint to, GLuint from );
+void brw_clip_copy_flatshaded_attributes( struct brw_clip_compile *c,
+                                          GLuint to, GLuint from );
 
 void brw_clip_init_clipmask( struct brw_clip_compile *c );
 
index 9ce80b83b9fadc9193bef82415ca6eaab376ae21..9001d36cd0f450f6f0e67fa0e73c916f06007d76 100644 (file)
@@ -272,11 +272,11 @@ void brw_emit_line_clip( struct brw_clip_compile *c )
    brw_clip_line_alloc_regs(c);
    brw_clip_init_ff_sync(c);
 
-   if (c->key.do_flat_shading) {
+   if (c->has_flat_shading) {
       if (c->key.pv_first)
-         brw_clip_copy_colors(c, 1, 0);
+         brw_clip_copy_flatshaded_attributes(c, 1, 0);
       else
-         brw_clip_copy_colors(c, 0, 1);
+         brw_clip_copy_flatshaded_attributes(c, 0, 1);
    }
                 
    clip_and_emit_line(c);
index bea08530ec01d087c7815c9effd3934821c58dcc..19179c1fc9d7b51f7d800c0eb4a0ebbbde457cfa 100644 (file)
@@ -190,8 +190,8 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c )
 
    brw_IF(p, BRW_EXECUTE_1);
    {
-      brw_clip_copy_colors(c, 1, 0);
-      brw_clip_copy_colors(c, 2, 0);
+      brw_clip_copy_flatshaded_attributes(c, 1, 0);
+      brw_clip_copy_flatshaded_attributes(c, 2, 0);
    }
    brw_ELSE(p);
    {
@@ -203,19 +203,19 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c )
                 brw_imm_ud(_3DPRIM_TRIFAN));
         brw_IF(p, BRW_EXECUTE_1);
         {
-           brw_clip_copy_colors(c, 0, 1);
-           brw_clip_copy_colors(c, 2, 1);
+           brw_clip_copy_flatshaded_attributes(c, 0, 1);
+           brw_clip_copy_flatshaded_attributes(c, 2, 1);
         }
         brw_ELSE(p);
         {
-           brw_clip_copy_colors(c, 1, 0);
-           brw_clip_copy_colors(c, 2, 0);
+           brw_clip_copy_flatshaded_attributes(c, 1, 0);
+           brw_clip_copy_flatshaded_attributes(c, 2, 0);
         }
         brw_ENDIF(p);
       }
       else {
-         brw_clip_copy_colors(c, 0, 2);
-         brw_clip_copy_colors(c, 1, 2);
+         brw_clip_copy_flatshaded_attributes(c, 0, 2);
+         brw_clip_copy_flatshaded_attributes(c, 1, 2);
       }
    }
    brw_ENDIF(p);
@@ -645,7 +645,7 @@ void brw_emit_tri_clip( struct brw_clip_compile *c )
     * flatshading, need to apply the flatshade here because we don't
     * respect the PV when converting to trifan for emit:
     */
-   if (c->key.do_flat_shading) 
+   if (c->has_flat_shading)
       brw_clip_tri_flat_shade(c); 
       
    if ((c->key.clip_mode == BRW_CLIPMODE_NORMAL) ||
index e211b95ec82b62821ae92d5b8425fe752d664429..af327d68ce7cf18223fdde7ac089d5117218d5b4 100644 (file)
@@ -501,7 +501,7 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c )
 
    /* Need to do this whether we clip or not:
     */
-   if (c->key.do_flat_shading)
+   if (c->has_flat_shading)
       brw_clip_tri_flat_shade(c);
    
    brw_clip_init_clipmask(c);
index 37b77341648d13a4e12df8a8270725e233342ab2..9d77d1e1b462a7afd831a58294883634bdf1a3cb 100644 (file)
@@ -290,49 +290,21 @@ struct brw_reg brw_clip_plane_stride( struct brw_clip_compile *c )
 }
 
 
-/* If flatshading, distribute color from provoking vertex prior to
+/* Distribute flatshaded attributes from provoking vertex prior to
  * clipping.
  */
-void brw_clip_copy_colors( struct brw_clip_compile *c,
+void brw_clip_copy_flatshaded_attributes( struct brw_clip_compile *c,
                           GLuint to, GLuint from )
 {
    struct brw_compile *p = &c->func;
 
-   if (brw_clip_have_varying(c, VARYING_SLOT_COL0))
-      brw_MOV(p, 
-             byte_offset(c->reg.vertex[to],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_COL0)),
-             byte_offset(c->reg.vertex[from],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_COL0)));
-
-   if (brw_clip_have_varying(c, VARYING_SLOT_COL1))
-      brw_MOV(p, 
-             byte_offset(c->reg.vertex[to],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_COL1)),
-             byte_offset(c->reg.vertex[from],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_COL1)));
-
-   if (brw_clip_have_varying(c, VARYING_SLOT_BFC0))
-      brw_MOV(p, 
-             byte_offset(c->reg.vertex[to],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_BFC0)),
-             byte_offset(c->reg.vertex[from],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_BFC0)));
-
-   if (brw_clip_have_varying(c, VARYING_SLOT_BFC1))
-      brw_MOV(p, 
-             byte_offset(c->reg.vertex[to],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_BFC1)),
-             byte_offset(c->reg.vertex[from],
-                          brw_varying_to_offset(&c->vue_map,
-                                                VARYING_SLOT_BFC1)));
+   for (int i = 0; i < c->vue_map.num_slots; i++) {
+      if (c->key.interpolation_mode.mode[i] == INTERP_QUALIFIER_FLAT) {
+         brw_MOV(p,
+                 byte_offset(c->reg.vertex[to], brw_vue_slot_to_offset(i)),
+                 byte_offset(c->reg.vertex[from], brw_vue_slot_to_offset(i)));
+      }
+   }
 }