[Mesa-dev] [PATCH 14/36] i965: SF: Modify calculate_point_sprite_mask to use the VUE map.

Paul Berry stereotype441 at gmail.com
Fri Sep 2 09:06:53 PDT 2011


---
 src/mesa/drivers/dri/i965/brw_sf.c      |    8 ++++++-
 src/mesa/drivers/dri/i965/brw_sf.h      |    5 +++-
 src/mesa/drivers/dri/i965/brw_sf_emit.c |   32 ++++++++++++++++++++----------
 3 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
index 1c149db..7b003dc 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.c
+++ b/src/mesa/drivers/dri/i965/brw_sf.c
@@ -67,6 +67,9 @@ static void compile_sf_prog( struct brw_context *brw,
    c.nr_attr_regs = (c.nr_attrs+1)/2;
    c.nr_setup_attrs = brw_count_bits(c.key.attrs);
    c.nr_setup_regs = (c.nr_setup_attrs+1)/2;
+   brw_compute_vue_map(&c.vue_map, intel, c.key.nr_userclip,
+                       c.key.do_twoside_color, c.key.attrs);
+   c.urb_entry_read_offset = brw_sf_compute_urb_entry_read_offset(intel);
 
    c.prog_data.urb_read_length = c.nr_attr_regs;
    c.prog_data.urb_entry_size = c.nr_setup_regs * 2;
@@ -163,6 +166,9 @@ static void upload_sf_prog(struct brw_context *brw)
       break;
    }
 
+   /* _NEW_TRANSFORM */
+   key.nr_userclip = brw_count_bits(ctx->Transform.ClipPlanesEnabled);
+
    /* _NEW_POINT */
    key.do_point_sprite = ctx->Point.PointSprite;
    if (key.do_point_sprite) {
@@ -198,7 +204,7 @@ static void upload_sf_prog(struct brw_context *brw)
 
 const struct brw_tracked_state brw_sf_prog = {
    .dirty = {
-      .mesa  = (_NEW_HINT | _NEW_LIGHT | _NEW_POLYGON | _NEW_POINT),
+      .mesa  = (_NEW_HINT | _NEW_LIGHT | _NEW_POLYGON | _NEW_POINT | _NEW_TRANSFORM),
       .brw   = (BRW_NEW_REDUCED_PRIMITIVE),
       .cache = CACHE_NEW_VS_PROG
    },
diff --git a/src/mesa/drivers/dri/i965/brw_sf.h b/src/mesa/drivers/dri/i965/brw_sf.h
index 102df33..12c655f 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.h
+++ b/src/mesa/drivers/dri/i965/brw_sf.h
@@ -53,7 +53,8 @@ struct brw_sf_prog_key {
    GLuint frontface_ccw:1;
    GLuint do_point_sprite:1;
    GLuint sprite_origin_lower_left:1;
-   GLuint pad:24;
+   GLuint nr_userclip:4;
+   GLuint pad:20;
 };
 
 struct brw_sf_compile {
@@ -93,9 +94,11 @@ struct brw_sf_compile {
    GLuint nr_attr_regs;
    GLuint nr_setup_attrs;
    GLuint nr_setup_regs;
+   int urb_entry_read_offset;
 
    GLubyte attr_to_idx[VERT_RESULT_MAX];   
    GLubyte idx_to_attr[VERT_RESULT_MAX];   
+   struct brw_vue_map vue_map;
 };
 
  
diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c
index 52a3fb3..f1fe567 100644
--- a/src/mesa/drivers/dri/i965/brw_sf_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c
@@ -43,6 +43,18 @@
 #include "brw_sf.h"
 
 
+/**
+ * Determine the vert_result corresponding to the given half of the given
+ * register.  half=0 means the first half of a register, half=1 means the
+ * second half.
+ */
+static inline int vert_reg_to_vert_result(struct brw_sf_compile *c, GLuint reg,
+                                          int half)
+{
+   int vue_slot = (reg + c->urb_entry_read_offset) * 2 + half;
+   return c->vue_map.slot_to_vert_result[vue_slot];
+}
+
 static struct brw_reg get_vert_attr(struct brw_sf_compile *c,
 				    struct brw_reg vert,
 				    GLuint attr)
@@ -359,22 +371,20 @@ static GLboolean calculate_masks( struct brw_sf_compile *c,
 static uint16_t
 calculate_point_sprite_mask(struct brw_sf_compile *c, GLuint reg)
 {
-   int attr1, attr2;
+   int vert_result1, vert_result2;
    uint16_t pc = 0;
 
-   attr1 = c->idx_to_attr[reg * 2];
-   if (attr1 >= VERT_RESULT_TEX0 && attr1 <= VERT_RESULT_TEX7) {
-      if (c->key.point_sprite_coord_replace & (1 << (attr1 - VERT_RESULT_TEX0)))
+   vert_result1 = vert_reg_to_vert_result(c, reg, 0);
+   if (vert_result1 >= VERT_RESULT_TEX0 && vert_result1 <= VERT_RESULT_TEX7) {
+      if (c->key.point_sprite_coord_replace & (1 << (vert_result1 - VERT_RESULT_TEX0)))
 	 pc |= 0x0f;
    }
 
-   if (reg * 2 + 1 < c->nr_setup_attrs) {
-       attr2 = c->idx_to_attr[reg * 2 + 1];
-       if (attr2 >= VERT_RESULT_TEX0 && attr2 <= VERT_RESULT_TEX7) {
-	  if (c->key.point_sprite_coord_replace & (1 << (attr2 -
-							 VERT_RESULT_TEX0)))
-	     pc |= 0xf0;
-       }
+   vert_result2 = vert_reg_to_vert_result(c, reg, 1);
+   if (vert_result2 >= VERT_RESULT_TEX0 && vert_result2 <= VERT_RESULT_TEX7) {
+      if (c->key.point_sprite_coord_replace & (1 << (vert_result2 -
+                                                     VERT_RESULT_TEX0)))
+         pc |= 0xf0;
    }
 
    return pc;
-- 
1.7.6



More information about the mesa-dev mailing list