Refactor code that converts between gl_vert_result and gl_frag_attrib.
authorPaul Berry <stereotype441@gmail.com>
Tue, 30 Aug 2011 18:46:29 +0000 (11:46 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 6 Sep 2011 18:02:32 +0000 (11:02 -0700)
Previously, this conversion was duplicated in several places in the
i965 driver.  This patch moves it to a common location in mtypes.h,
near the declaration of gl_vert_result and gl_frag_attrib.

I've also added comments to remind us that we may need to revisit the
conversion code when adding elements to gl_vert_result and
gl_frag_attrib.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_vs_constval.c
src/mesa/drivers/dri/i965/brw_wm_pass2.c
src/mesa/drivers/dri/i965/gen6_sf_state.c
src/mesa/main/mtypes.h

index 8b85f3bc1edcab6220a3d654135197fbe20065ae..93323739a250665774206b1ad20b22f2bd907d7f 100644 (file)
@@ -672,14 +672,7 @@ fs_visitor::calculate_urb_setup()
       /* FINISHME: The sf doesn't map VS->FS inputs for us very well. */
       for (unsigned int i = 0; i < VERT_RESULT_MAX; i++) {
         if (c->key.vp_outputs_written & BITFIELD64_BIT(i)) {
-           int fp_index;
-
-           if (i >= VERT_RESULT_VAR0)
-              fp_index = i - (VERT_RESULT_VAR0 - FRAG_ATTRIB_VAR0);
-           else if (i <= VERT_RESULT_TEX7)
-              fp_index = i;
-           else
-              fp_index = -1;
+           int fp_index = vert_result_to_frag_attrib(i);
 
            if (fp_index >= 0)
               urb_setup[fp_index] = urb_next++;
@@ -1828,17 +1821,12 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
 
    key.vp_outputs_written |= BITFIELD64_BIT(FRAG_ATTRIB_WPOS);
    for (int i = 0; i < FRAG_ATTRIB_MAX; i++) {
-      int vp_index = -1;
-
       if (!(fp->Base.InputsRead & BITFIELD64_BIT(i)))
         continue;
 
       key.proj_attrib_mask |= 1 << i;
 
-      if (i <= FRAG_ATTRIB_TEX7)
-        vp_index = i;
-      else if (i >= FRAG_ATTRIB_VAR0)
-        vp_index = i - FRAG_ATTRIB_VAR0 + VERT_RESULT_VAR0;
+      int vp_index = vert_result_to_frag_attrib(i);
 
       if (vp_index >= 0)
         key.vp_outputs_written |= BITFIELD64_BIT(vp_index);
index 47cc0a7da7a2c7c9ad9a8a4775001a5f378680db..4d9d4b714e8ec8f3970bd741ff85492fabc2565b 100644 (file)
@@ -144,14 +144,10 @@ static void calc_sizes( struct tracker *t )
     * which describes the fragment program input sizes.
     */
    for (vertRes = VERT_RESULT_TEX0; vertRes < VERT_RESULT_MAX; vertRes++) {
-      GLint fragAttrib;
 
       /* map vertex program output index to fragment program input index */
-      if (vertRes <= VERT_RESULT_TEX7)
-         fragAttrib = FRAG_ATTRIB_TEX0 + vertRes - VERT_RESULT_TEX0;
-      else if (vertRes >= VERT_RESULT_VAR0)
-         fragAttrib = FRAG_ATTRIB_VAR0 + vertRes - VERT_RESULT_VAR0;
-      else
+      GLint fragAttrib = vert_result_to_frag_attrib(vertRes);
+      if (fragAttrib < 0)
          continue;
       assert(fragAttrib >= FRAG_ATTRIB_TEX0);
       assert(fragAttrib <= FRAG_ATTRIB_MAX);
index 8c2b9e7020b32c75ed02508bbdc487c6a980408f..f1d70f79a77ecd2d730f290fe4803d6bda33496d 100644 (file)
@@ -94,14 +94,7 @@ static void init_registers( struct brw_wm_compile *c )
    } else {
       for (j = 0; j < VERT_RESULT_MAX; j++) {
         if (c->key.vp_outputs_written & BITFIELD64_BIT(j)) {
-           int fp_index;
-
-           if (j >= VERT_RESULT_VAR0)
-              fp_index = j - (VERT_RESULT_VAR0 - FRAG_ATTRIB_VAR0);
-           else if (j <= VERT_RESULT_TEX7)
-              fp_index = j;
-           else
-              fp_index = -1;
+           int fp_index = vert_result_to_frag_attrib(j);
 
            nr_interp_regs++;
            if (fp_index >= 0)
index 5bb731dc8fd1088f991a03bf4a02e9646d1607d1..714914aa6bb8e52abec2ae7dc0cb669b4be491f1 100644 (file)
 uint32_t
 get_attr_override(struct brw_context *brw, int fs_attr, int two_side_color)
 {
-   int attr_index = 0, i, vs_attr;
+   int attr_index = 0, i;
    int bfc = 0;
+   int vs_attr = frag_attrib_to_vert_result(fs_attr);
 
-   if (fs_attr <= FRAG_ATTRIB_TEX7)
-      vs_attr = fs_attr;
-   else if (fs_attr == FRAG_ATTRIB_FACE)
-      vs_attr = 0; /* XXX */
-   else if (fs_attr == FRAG_ATTRIB_PNTC)
-      vs_attr = 0; /* XXX */
-   else {
-      assert(fs_attr >= FRAG_ATTRIB_VAR0);
-      vs_attr = fs_attr - FRAG_ATTRIB_VAR0 + VERT_RESULT_VAR0;
-   }
+   if (vs_attr < 0)
+      vs_attr = 0;
 
    /* Find the source index (0 = first attribute after the 4D position)
     * for this output attribute.  attr is currently a VERT_RESULT_* but should
index ad5979796d62dc7754c40061f99e3ca86d2c968f..bf96fdf9635d1ae9b18803f728dfaa9378a18cfe 100644 (file)
@@ -215,7 +215,9 @@ typedef enum
 
 
 /**
- * Indexes for vertex program result attributes
+ * Indexes for vertex program result attributes.  Note that
+ * vert_result_to_frag_attrib() and frag_attrib_to_vert_result() make
+ * assumptions about the layout of this enum.
  */
 typedef enum
 {
@@ -313,7 +315,9 @@ typedef enum
 
 
 /**
- * Indexes for fragment program input attributes.
+ * Indexes for fragment program input attributes.  Note that
+ * vert_result_to_frag_attrib() and frag_attrib_to_vert_result() make
+ * assumptions about the layout of this enum.
  */
 typedef enum
 {
@@ -335,6 +339,43 @@ typedef enum
    FRAG_ATTRIB_MAX = (FRAG_ATTRIB_VAR0 + MAX_VARYING)
 } gl_frag_attrib;
 
+/**
+ * Convert from a gl_vert_result value to the corresponding gl_frag_attrib.
+ *
+ * VERT_RESULT_HPOS is converted to FRAG_ATTRIB_WPOS.
+ *
+ * gl_vert_result values which have no corresponding gl_frag_attrib
+ * (VERT_RESULT_PSIZ, VERT_RESULT_BFC0, VERT_RESULT_BFC1, and
+ * VERT_RESULT_EDGE) are converted to a value of -1.
+ */
+static inline int vert_result_to_frag_attrib(int vert_result)
+{
+   if (vert_result >= VERT_RESULT_VAR0)
+      return vert_result - VERT_RESULT_VAR0 + FRAG_ATTRIB_VAR0;
+   else if (vert_result <= VERT_RESULT_TEX7)
+      return vert_result;
+   else
+      return -1;
+}
+
+/**
+ * Convert from a gl_frag_attrib value to the corresponding gl_vert_result.
+ *
+ * FRAG_ATTRIB_WPOS is converted to VERT_RESULT_HPOS.
+ *
+ * gl_frag_attrib values which have no corresponding gl_vert_result
+ * (FRAG_ATTRIB_FACE and FRAG_ATTRIB_PNTC) are converted to a value of -1.
+ */
+static inline int frag_attrib_to_vert_result(int frag_attrib)
+{
+   if (frag_attrib <= FRAG_ATTRIB_TEX7)
+      return frag_attrib;
+   else if (frag_attrib >= FRAG_ATTRIB_VAR0)
+      return frag_attrib - FRAG_ATTRIB_VAR0 + VERT_RESULT_VAR0;
+   else
+      return -1;
+}
+
 /**
  * Bitflags for fragment program input attributes.
  */