On 07/14/2013 02:39 AM, Chris Forbes wrote:
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

[V1-2]: Signed-off-by: Olivier Galibert <galibert at pobox.com>
Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
---
  src/mesa/drivers/dri/i965/brw_clip.c          | 13 +++++--
  src/mesa/drivers/dri/i965/brw_clip.h          |  6 ++--
  src/mesa/drivers/dri/i965/brw_clip_line.c     |  6 ++--
  src/mesa/drivers/dri/i965/brw_clip_tri.c      | 18 +++++-----
  src/mesa/drivers/dri/i965/brw_clip_unfilled.c |  2 +-
  src/mesa/drivers/dri/i965/brw_clip_util.c     | 51 +++++++--------------------
  6 files changed, 40 insertions(+), 56 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_clip.c 
b/src/mesa/drivers/dri/i965/brw_clip.c
index 488e0a0..7df4b18 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.c
+++ b/src/mesa/drivers/dri/i965/brw_clip.c
@@ -186,6 +186,7 @@ brw_upload_clip_prog(struct brw_context *brw)
  {
     struct gl_context *ctx = &brw->ctx;
     struct brw_clip_prog_key key;
+   int i;

     memset(&key, 0, sizeof(key));

@@ -200,8 +201,16 @@ 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);

If you end up splitting the s/do/has/ out of the previous patch, you might put this rename in there too.

Other than that tiny comment, this patch looks good to me!
Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>

+
+   /* BRW_NEW_FRAGMENT_PROGRAM, _NEW_LIGHT */
+   key.has_flat_shading = 0;
+   for (i = 0; i < brw->vue_map_geom_out.num_slots; i++) {
+      if (key.interpolation_mode[i] == INTERP_QUALIFIER_FLAT) {
+         key.has_flat_shading = 1;
+         break;
+      }
+   }
+
     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);
diff --git a/src/mesa/drivers/dri/i965/brw_clip.h 
b/src/mesa/drivers/dri/i965/brw_clip.h
index fcbe2a0..656254b 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.h
+++ b/src/mesa/drivers/dri/i965/brw_clip.h
@@ -46,7 +46,7 @@ struct brw_clip_prog_key {
     unsigned char interpolation_mode[BRW_VARYING_SLOT_COUNT];
     GLuint primitive:4;
     GLuint nr_userclip:4;
-   GLuint do_flat_shading:1;
+   GLuint has_flat_shading:1;
     GLuint pv_first:1;
     GLuint do_unfilled:1;
     GLuint fill_cw:2;          /* includes cull information */
@@ -173,8 +173,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 );

diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c 
b/src/mesa/drivers/dri/i965/brw_clip_line.c
index 9ce80b8..8df7d0c 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_line.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_line.c
@@ -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->key.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);
diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c 
b/src/mesa/drivers/dri/i965/brw_clip_tri.c
index bea0853..ac24929 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_tri.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c
@@ -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->key.has_flat_shading)
        brw_clip_tri_flat_shade(c);

     if ((c->key.clip_mode == BRW_CLIPMODE_NORMAL) ||
diff --git a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c 
b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c
index e211b95..0e645c0 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c
@@ -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->key.has_flat_shading)
        brw_clip_tri_flat_shade(c);

     brw_clip_init_clipmask(c);
diff --git a/src/mesa/drivers/dri/i965/brw_clip_util.c 
b/src/mesa/drivers/dri/i965/brw_clip_util.c
index 37b7734..8a21c1f 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_util.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_util.c
@@ -290,49 +290,24 @@ 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)));
+   int i;
+
+   for (i=0; i < c->vue_map.num_slots; i++) {
+      if (c->key.interpolation_mode[i] == INTERP_QUALIFIER_FLAT) {
+         printf("flatshaded: %d @ %d\n", i,
+               brw_vue_slot_to_offset(i));
+         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)));
+      }
+   }
  }




_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to