Mesa (master): i915g: initial support for SEMANTIC_FACE.

Stephane Marchesin marcheu at kemper.freedesktop.org
Mon Jun 27 09:06:04 UTC 2011


Module: Mesa
Branch: master
Commit: ef3dac2aff5fda16d7b7662c2c8828f07c9842ae
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ef3dac2aff5fda16d7b7662c2c8828f07c9842ae

Author: Stéphane Marchesin <marcheu at chromium.org>
Date:   Mon Jun 27 02:04:38 2011 -0700

i915g: initial support for SEMANTIC_FACE.

Doesn't work yet, see TODO.

---

 src/gallium/drivers/i915/i915_fpc.h           |    5 +++--
 src/gallium/drivers/i915/i915_fpc_translate.c |    9 +++++++++
 src/gallium/drivers/i915/i915_state_derived.c |   19 ++++++++++++++++---
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/i915/i915_fpc.h b/src/gallium/drivers/i915/i915_fpc.h
index 8502dc0..e298e78 100644
--- a/src/gallium/drivers/i915/i915_fpc.h
+++ b/src/gallium/drivers/i915/i915_fpc.h
@@ -37,8 +37,9 @@
 
 #define I915_PROGRAM_SIZE 192
 
-/* Use that index for pos routing, must be >= I915_TEX_UNITS */
-#define I915_SEMANTIC_POS 10
+/* Use those indices for pos/face routing, must be >= I915_TEX_UNITS */
+#define I915_SEMANTIC_POS  10
+#define I915_SEMANTIC_FACE 11
 
 
 /**
diff --git a/src/gallium/drivers/i915/i915_fpc_translate.c b/src/gallium/drivers/i915/i915_fpc_translate.c
index 6948fc3..f39b020 100644
--- a/src/gallium/drivers/i915/i915_fpc_translate.c
+++ b/src/gallium/drivers/i915/i915_fpc_translate.c
@@ -212,6 +212,15 @@ src_vector(struct i915_fp_compile *p,
             src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_ALL);
             break;
          }
+      case TGSI_SEMANTIC_FACE:
+         {
+            /* for back/front faces */
+            /* XXX also emit something from 0,1 to -1,1 */
+            int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE);
+            printf("semantic face fpc at %d\n",real_tex_unit);
+            src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X);
+            break;
+         }
       default:
          i915_program_error(p, "Bad source->Index");
          return 0;
diff --git a/src/gallium/drivers/i915/i915_state_derived.c b/src/gallium/drivers/i915/i915_state_derived.c
index 72b7571..dd4fd18 100644
--- a/src/gallium/drivers/i915/i915_state_derived.c
+++ b/src/gallium/drivers/i915/i915_state_derived.c
@@ -59,12 +59,12 @@ static void calculate_vertex_layout(struct i915_context *i915)
    const struct i915_fragment_shader *fs = i915->fs;
    const enum interp_mode colorInterp = i915->rasterizer->color_interp;
    struct vertex_info vinfo;
-   boolean texCoords[I915_TEX_UNITS], colors[2], fog, needW;
+   boolean texCoords[I915_TEX_UNITS], colors[2], fog, needW, face;
    uint i;
    int src;
 
    memset(texCoords, 0, sizeof(texCoords));
-   colors[0] = colors[1] = fog = needW = FALSE;
+   colors[0] = colors[1] = fog = needW = face = FALSE;
    memset(&vinfo, 0, sizeof(vinfo));
 
    /* Determine which fragment program inputs are needed.  Setup HW vertex
@@ -85,7 +85,6 @@ static void calculate_vertex_layout(struct i915_context *i915)
       case TGSI_SEMANTIC_GENERIC:
          {
             /* texcoords/varyings/other generic */
-            /* XXX handle back/front face and point size */
             uint unit = fs->info.input_semantic_index[i];
 
             texCoords[find_mapping(fs, unit)] = TRUE;
@@ -95,7 +94,11 @@ static void calculate_vertex_layout(struct i915_context *i915)
       case TGSI_SEMANTIC_FOG:
          fog = TRUE;
          break;
+      case TGSI_SEMANTIC_FACE:
+         face = TRUE;
+         break;
       default:
+         debug_printf("Unknown input type %d\n", fs->info.input_semantic_name[i]);
          assert(0);
       }
    }
@@ -152,6 +155,16 @@ static void calculate_vertex_layout(struct i915_context *i915)
       vinfo.hwfmt[1] |= hwtc << (i * 4);
    }
 
+   /* front/back face */
+   if (face) {
+      uint slot = find_mapping(fs, I915_SEMANTIC_FACE);	 
+      debug_printf("Front/back face is broken\n");
+      src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_FACE, 0);
+      /* really here it's EMIT_1F_FACE */
+      draw_emit_vertex_attr(&vinfo, EMIT_1F, INTERP_CONSTANT, src);
+      vinfo.hwfmt[1] |= TEXCOORDFMT_1D << (slot * 4);
+   }
+
    draw_compute_vertex_size(&vinfo);
 
    if (memcmp(&i915->current.vertex_info, &vinfo, sizeof(vinfo))) {




More information about the mesa-commit mailing list