gallium: add a src_index[] array to draw's vertex_info for mapping post-xform vertex...
authorBrian <brian.paul@tungstengraphics.com>
Mon, 21 Jan 2008 18:16:22 +0000 (11:16 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 21 Jan 2008 18:16:22 +0000 (11:16 -0700)
src/mesa/pipe/cell/ppu/cell_state_derived.c
src/mesa/pipe/draw/draw_vbuf.c
src/mesa/pipe/draw/draw_vertex.h
src/mesa/pipe/i915simple/i915_state_derived.c
src/mesa/pipe/softpipe/sp_state_derived.c

index dc2879b9150b079a156c0374dc610efc892efc05..1e31c11ecd2b8567f61786d7d7f06835f4771c1a 100644 (file)
@@ -54,6 +54,7 @@ static void calculate_vertex_layout( struct cell_context *cell )
       = cell->rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
    struct vertex_info *vinfo = &cell->vertex_info;
    uint front0;
+   uint src = 0;
 
    memset(vinfo, 0, sizeof(*vinfo));
 
@@ -68,10 +69,10 @@ static void calculate_vertex_layout( struct cell_context *cell )
 #endif
 
    /* always emit vertex pos */
-   draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_LINEAR);
+   draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_LINEAR, src++);
 
 #if 1
-   front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+   front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
 #endif
 
 #if 0
@@ -94,11 +95,11 @@ static void calculate_vertex_layout( struct cell_context *cell )
 
       case TGSI_SEMANTIC_COLOR:
          if (vs->output_semantic_index[i] == 0) {
-            front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+            front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
          }
          else {
             assert(vs->output_semantic_index[i] == 1);
-            front1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+            front1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
          }
          break;
 
@@ -113,7 +114,7 @@ static void calculate_vertex_layout( struct cell_context *cell )
          break;
 
       case TGSI_SEMANTIC_FOG:
-         draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_PERSPECTIVE, src++);
          break;
 
       case TGSI_SEMANTIC_PSIZE:
@@ -125,7 +126,7 @@ static void calculate_vertex_layout( struct cell_context *cell )
 
       case TGSI_SEMANTIC_GENERIC:
          /* this includes texcoords and varying vars */
-         draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src++);
          break;
 
       default:
@@ -140,14 +141,14 @@ static void calculate_vertex_layout( struct cell_context *cell )
     * up 1:1 with the fragment shader inputs.
     */
    if (emitBack0) {
-      back0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+      back0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
    }
    if (emitBack1) {
-      back1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+      back1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
    }
    if (emitPsize) {
       cell->psize_slot
-         = draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_CONSTANT);
+         = draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_CONSTANT, src++);
    }
 
    /* If the attributes have changed, tell the draw module about
index 6cda122c3afadf0064b38fb632b9cec0d79b1df5..7683e3381c1736fed633a563d372ecbfad71bbc6 100644 (file)
@@ -139,37 +139,38 @@ emit_vertex( struct vbuf_stage *vbuf,
    vertex->vertex_id = vbuf->nr_vertices++;
 
    for (i = 0; i < vinfo->num_attribs; i++) {
+      uint j = vinfo->src_index[i];
       switch (vinfo->format[i]) {
       case FORMAT_OMIT:
          /* no-op */
          break;
       case FORMAT_1F:
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][0]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
          count++;
          break;
       case FORMAT_2F:
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][0]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][1]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
          count += 2;
          break;
       case FORMAT_3F:
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][0]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][1]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][2]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][2]);
          count += 3;
          break;
       case FORMAT_4F:
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][0]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][1]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][2]);
-         *vbuf->vertex_ptr++ = fui(vertex->data[i][3]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][2]);
+         *vbuf->vertex_ptr++ = fui(vertex->data[j][3]);
          count += 4;
          break;
       case FORMAT_4UB:
-        *vbuf->vertex_ptr++ = pack_ub4(float_to_ubyte( vertex->data[i][2] ),
-                                        float_to_ubyte( vertex->data[i][1] ),
-                                        float_to_ubyte( vertex->data[i][0] ),
-                                        float_to_ubyte( vertex->data[i][3] ));
+        *vbuf->vertex_ptr++ = pack_ub4(float_to_ubyte( vertex->data[j][2] ),
+                                        float_to_ubyte( vertex->data[j][1] ),
+                                        float_to_ubyte( vertex->data[j][0] ),
+                                        float_to_ubyte( vertex->data[j][3] ));
          count += 1;
          break;
       default:
index 8bb328affa3a6cc785d505a00e801d4202230f27..ab0425e106d7d9101eafc3a5b35b5b5c2d22288d 100644 (file)
@@ -70,6 +70,7 @@ struct vertex_info
    uint hwfmt[4];      /**< hardware format info for this format */
    enum interp_mode interp_mode[PIPE_MAX_SHADER_OUTPUTS];
    enum attrib_format format[PIPE_MAX_SHADER_OUTPUTS];   /**< FORMAT_x */
+   uint src_index[PIPE_MAX_SHADER_OUTPUTS];
    uint size;          /**< total vertex size in dwords */
 };
 
@@ -77,16 +78,20 @@ struct vertex_info
 
 /**
  * Add another attribute to the given vertex_info object.
+ * \param src_index  indicates which post-transformed vertex attrib slot
+ *                   corresponds to this attribute.
  * \return slot in which the attribute was added
  */
 static INLINE uint
 draw_emit_vertex_attr(struct vertex_info *vinfo,
-                      enum attrib_format format, enum interp_mode interp)
+                      enum attrib_format format, enum interp_mode interp,
+                      uint src_index)
 {
    const uint n = vinfo->num_attribs;
    assert(n < PIPE_MAX_SHADER_OUTPUTS);
    vinfo->format[n] = format;
    vinfo->interp_mode[n] = interp;
+   vinfo->src_index[n] = src_index;
    vinfo->num_attribs++;
    return n;
 }
index be73769cf2f65787770bac1955276d603817fe66..466c704d87bdbd23a8eac6189b49f2a1762a7f5d 100644 (file)
@@ -50,12 +50,13 @@ static void calculate_vertex_layout( struct i915_context *i915 )
    boolean needW = 0;
    uint i;
    boolean texCoords[8];
+   uint src = 0;
 
    memset(texCoords, 0, sizeof(texCoords));
    memset(&vinfo, 0, sizeof(vinfo));
 
    /* pos */
-   draw_emit_vertex_attr(&vinfo, FORMAT_3F, INTERP_LINEAR);
+   draw_emit_vertex_attr(&vinfo, FORMAT_3F, INTERP_LINEAR, src++);
    /* Note: we'll set the S4_VFMT_XYZ[W] bits below */
 
    for (i = 0; i < fs->num_inputs; i++) {
@@ -64,12 +65,12 @@ static void calculate_vertex_layout( struct i915_context *i915 )
          break;
       case TGSI_SEMANTIC_COLOR:
          if (fs->input_semantic_index[i] == 0) {
-            front0 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp);
+            front0 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp, src++);
             vinfo.hwfmt[0] |= S4_VFMT_COLOR;
          }
          else {
             assert(fs->input_semantic_index[i] == 1);
-            front1 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp);
+            front1 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp, src++);
             vinfo.hwfmt[0] |= S4_VFMT_SPEC_FOG;
          }
          break;
@@ -79,7 +80,7 @@ static void calculate_vertex_layout( struct i915_context *i915 )
             const uint unit = fs->input_semantic_index[i];
             uint hwtc;
             texCoords[unit] = TRUE;
-            draw_emit_vertex_attr(&vinfo, FORMAT_4F, INTERP_PERSPECTIVE);
+            draw_emit_vertex_attr(&vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src++);
             hwtc = TEXCOORDFMT_4D;
             needW = TRUE;
             vinfo.hwfmt[1] |= hwtc << (unit * 4);
@@ -87,7 +88,7 @@ static void calculate_vertex_layout( struct i915_context *i915 )
          break;
       case TGSI_SEMANTIC_FOG:
          fprintf(stderr, "i915 fogcoord not implemented yet\n");
-         draw_emit_vertex_attr(&vinfo, FORMAT_1F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(&vinfo, FORMAT_1F, INTERP_PERSPECTIVE, src++);
          break;
       default:
          assert(0);
@@ -119,10 +120,10 @@ static void calculate_vertex_layout( struct i915_context *i915 )
     */
    if (i915->rasterizer->light_twoside) {
       if (front0) {
-         back0 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp);
+         back0 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp, src++);
       }
       if (back0) {
-         back1 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp);
+         back1 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp, src++);
       }
    }
 
index 630ae3163fba7a0a10c38e0bfc8d599916239eba..0f1410e5ded0457fe3797ed55cf61b184b17ff6b 100644 (file)
@@ -48,6 +48,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
    boolean emitBack0 = FALSE, emitBack1 = FALSE, emitPsize = FALSE;
    uint front0 = 0, back0 = 0, front1 = 0, back1 = 0;
    uint i;
+   int src = 0;
 
    memset(vinfo, 0, sizeof(*vinfo));
 
@@ -61,7 +62,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
    softpipe->psize_slot = -1;
 
    /* always emit vertex pos */
-   draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_LINEAR);
+   draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_LINEAR, src++);
 
    /*
     * XXX I think we need to reconcile the vertex shader outputs with
@@ -82,11 +83,11 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
 
       case TGSI_SEMANTIC_COLOR:
          if (vs->output_semantic_index[i] == 0) {
-            front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+            front0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
          }
          else {
             assert(vs->output_semantic_index[i] == 1);
-            front1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+            front1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
          }
          break;
 
@@ -101,7 +102,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
          break;
 
       case TGSI_SEMANTIC_FOG:
-         draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_PERSPECTIVE, src++);
          break;
 
       case TGSI_SEMANTIC_PSIZE:
@@ -113,7 +114,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
 
       case TGSI_SEMANTIC_GENERIC:
          /* this includes texcoords and varying vars */
-         draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src++);
          break;
 
       default:
@@ -128,14 +129,14 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
     * up 1:1 with the fragment shader inputs.
     */
    if (emitBack0) {
-      back0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+      back0 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
    }
    if (emitBack1) {
-      back1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp);
+      back1 = draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src++);
    }
    if (emitPsize) {
       softpipe->psize_slot
-         = draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_CONSTANT);
+         = draw_emit_vertex_attr(vinfo, FORMAT_1F, INTERP_CONSTANT, src++);
    }
 
    /* If the attributes have changed, tell the draw module about