Consolidate vertex-related code in new draw_vertex.c
authorBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 22:49:24 +0000 (16:49 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 22:49:24 +0000 (16:49 -0600)
A few functions which were basically duplicated between softpipe and the
i915 driver are now re-used:
  draw_emit_vertex_attr()
  draw_compute_vertex_size()

src/mesa/pipe/draw/draw_arrays.c
src/mesa/pipe/draw/draw_context.c
src/mesa/pipe/draw/draw_context.h
src/mesa/pipe/draw/draw_vertex.c [new file with mode: 0644]
src/mesa/pipe/draw/draw_vertex.h
src/mesa/pipe/i915simple/i915_state_derived.c
src/mesa/pipe/softpipe/sp_state_derived.c
src/mesa/sources

index 9e219ed..bbb243c 100644 (file)
@@ -74,82 +74,3 @@ draw_arrays(struct draw_context *draw, unsigned prim,
 }
 
 
-static INLINE void
-emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format, uint interp)
-{
-   const uint n = vinfo->num_attribs;
-   vinfo->attr_mask |= (1 << vfAttr);
-   vinfo->slot_to_attrib[n] = vfAttr;
-   if (n >= 2) {
-      /* the first two slots are the vertex header & clippos */
-      assert(vfAttr < Elements(vinfo->attrib_to_slot));
-      vinfo->attrib_to_slot[vfAttr] = n - 2;
-   }
-   vinfo->interp_mode[n] = interp;
-   vinfo->format[n] = format;
-   vinfo->num_attribs++;
-
-}
-
-
-/** XXX this is duplicated in the i915 driver... */
-static void
-compute_vertex_size(struct vertex_info *vinfo)
-{
-   uint i;
-
-   vinfo->size = 0;
-   for (i = 0; i < vinfo->num_attribs; i++) {
-      switch (vinfo->format[i]) {
-      case FORMAT_OMIT:
-         break;
-      case FORMAT_4UB:
-         /* fall-through */
-      case FORMAT_1F:
-         vinfo->size += 1;
-         break;
-      case FORMAT_2F:
-         vinfo->size += 2;
-         break;
-      case FORMAT_3F:
-         vinfo->size += 3;
-         break;
-      case FORMAT_4F:
-         vinfo->size += 4;
-         break;
-      default:
-         assert(0);
-      }
-   }
-}
-
-
-void
-draw_set_vertex_attributes( struct draw_context *draw,
-                            const uint *slot_to_vf_attr,
-                            const uint *interp_mode,
-                            unsigned nr_attrs )
-{
-   struct vertex_info *vinfo = &draw->vertex_info;
-   unsigned i;
-
-   assert(slot_to_vf_attr[0] == TGSI_ATTRIB_POS);
-
-   memset(vinfo, 0, sizeof(*vinfo));
-
-   /*
-    * First three attribs are always the same: header, clip pos, winpos
-    */
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_VERTEX_HEADER, FORMAT_1F, INTERP_NONE);
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_CLIP_POS, FORMAT_4F, INTERP_LINEAR);
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F_VIEWPORT, INTERP_LINEAR);
-
-   /*
-    * Remaining attribs (color, texcoords, etc)
-    */
-   for (i = 1; i < nr_attrs; i++) {
-      emit_vertex_attr(vinfo, slot_to_vf_attr[i], FORMAT_4F, interp_mode[i]);
-   }
-
-   compute_vertex_size(vinfo);
-}
index c15f765..2936a14 100644 (file)
@@ -215,39 +215,3 @@ draw_set_vertex_shader(struct draw_context *draw,
 {
    draw->vertex_shader = *shader;
 }
-
-
-/**
- * This function is used to tell the draw module about attributes
- * (like colors) that need to be selected based on front/back face
- * orientation.
- *
- * The logic is:
- *    if (polygon is back-facing) {
- *       vertex->attrib[front0] = vertex->attrib[back0];
- *       vertex->attrib[front1] = vertex->attrib[back1];
- *    }
- *
- * \param front0  first attrib to replace if the polygon is back-facing
- * \param back0  first attrib to copy if the polygon is back-facing
- * \param front1  second attrib to replace if the polygon is back-facing
- * \param back1  second attrib to copy if the polygon is back-facing
- *
- * Pass -1 to disable two-sided attributes.
- */
-void
-draw_set_twoside_attributes(struct draw_context *draw,
-                            uint front0, uint back0,
-                            uint front1, uint back1)
-{
-   /* XXX we could alternately pass an array of front/back attribs if there's
-    * ever need for more than two.  One could imagine a shader extension
-    * that allows arbitrary attributes to be selected based on polygon
-    * orientation...
-    */
-   draw->attrib_front0 = front0;
-   draw->attrib_back0 = back0;
-   draw->attrib_front1 = front1;
-   draw->attrib_back1 = back1;
-}
-
index 21ee18e..0367984 100644 (file)
@@ -42,6 +42,7 @@
 
 
 struct vertex_buffer;
+struct vertex_info;
 struct draw_context;
 struct draw_stage;
 
@@ -96,6 +97,8 @@ void draw_set_twoside_attributes(struct draw_context *draw,
                                  uint front0, uint back0,
                                  uint front1, uint back1);
 
+void draw_compute_vertex_size(struct vertex_info *vinfo);
+
 unsigned draw_prim_info( unsigned prim, unsigned *first, unsigned *incr );
 
 unsigned draw_trim( unsigned count, unsigned first, unsigned incr );
diff --git a/src/mesa/pipe/draw/draw_vertex.c b/src/mesa/pipe/draw/draw_vertex.c
new file mode 100644 (file)
index 0000000..64bc323
--- /dev/null
@@ -0,0 +1,167 @@
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+/*
+ * Functions for specifying the post-transformation vertex layout.
+ *
+ * Author:
+ *    Brian Paul
+ *    Keith Whitwell
+ */
+
+
+#include "pipe/p_defines.h"
+#include "pipe/p_context.h"
+#include "pipe/p_winsys.h"
+#include "pipe/p_util.h"
+
+#include "pipe/draw/draw_private.h"
+#include "pipe/draw/draw_context.h"
+#include "pipe/draw/draw_vertex.h"
+
+
+static INLINE void
+emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
+                 uint interp)
+{
+   const uint n = vinfo->num_attribs;
+   vinfo->attr_mask |= (1 << vfAttr);
+   vinfo->slot_to_attrib[n] = vfAttr;
+   if (n >= 2) {
+      /* the first two slots are the vertex header & clippos */
+      assert(vfAttr < Elements(vinfo->attrib_to_slot));
+      vinfo->attrib_to_slot[vfAttr] = n - 2;
+   }
+   vinfo->interp_mode[n] = interp;
+   vinfo->format[n] = format;
+   vinfo->num_attribs++;
+
+}
+
+
+/**
+ * Compute the size of a vertex, in dwords/floats, to update the
+ * vinfo->size field.
+ */
+void
+draw_compute_vertex_size(struct vertex_info *vinfo)
+{
+   uint i;
+
+   vinfo->size = 0;
+   for (i = 0; i < vinfo->num_attribs; i++) {
+      switch (vinfo->format[i]) {
+      case FORMAT_OMIT:
+         break;
+      case FORMAT_4UB:
+         /* fall-through */
+      case FORMAT_1F:
+         vinfo->size += 1;
+         break;
+      case FORMAT_2F:
+         vinfo->size += 2;
+         break;
+      case FORMAT_3F:
+         vinfo->size += 3;
+         break;
+      case FORMAT_4F:
+         vinfo->size += 4;
+         break;
+      default:
+         assert(0);
+      }
+   }
+}
+
+
+/**
+ * Tell the drawing module about the layout of post-transformation vertices
+ */
+void
+draw_set_vertex_attributes( struct draw_context *draw,
+                            const uint *slot_to_vf_attr,
+                            const uint *interp_mode,
+                            unsigned nr_attrs )
+{
+   struct vertex_info *vinfo = &draw->vertex_info;
+   unsigned i;
+
+   assert(slot_to_vf_attr[0] == TGSI_ATTRIB_POS);
+
+   memset(vinfo, 0, sizeof(*vinfo));
+
+   /*
+    * First three attribs are always the same: header, clip pos, winpos
+    */
+   emit_vertex_attr(vinfo, TGSI_ATTRIB_VERTEX_HEADER, FORMAT_1F, INTERP_NONE);
+   emit_vertex_attr(vinfo, TGSI_ATTRIB_CLIP_POS, FORMAT_4F, INTERP_LINEAR);
+   emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F_VIEWPORT, INTERP_LINEAR);
+
+   /*
+    * Remaining attribs (color, texcoords, etc)
+    */
+   for (i = 1; i < nr_attrs; i++) {
+      emit_vertex_attr(vinfo, slot_to_vf_attr[i], FORMAT_4F, interp_mode[i]);
+   }
+
+   draw_compute_vertex_size(vinfo);
+}
+
+
+/**
+ * This function is used to tell the draw module about attributes
+ * (like colors) that need to be selected based on front/back face
+ * orientation.
+ *
+ * The logic is:
+ *    if (polygon is back-facing) {
+ *       vertex->attrib[front0] = vertex->attrib[back0];
+ *       vertex->attrib[front1] = vertex->attrib[back1];
+ *    }
+ *
+ * \param front0  first attrib to replace if the polygon is back-facing
+ * \param back0  first attrib to copy if the polygon is back-facing
+ * \param front1  second attrib to replace if the polygon is back-facing
+ * \param back1  second attrib to copy if the polygon is back-facing
+ *
+ * Pass -1 to disable two-sided attributes.
+ */
+void
+draw_set_twoside_attributes(struct draw_context *draw,
+                            uint front0, uint back0,
+                            uint front1, uint back1)
+{
+   /* XXX we could alternately pass an array of front/back attribs if there's
+    * ever need for more than two.  One could imagine a shader extension
+    * that allows arbitrary attributes to be selected based on polygon
+    * orientation...
+    */
+   draw->attrib_front0 = front0;
+   draw->attrib_back0 = back0;
+   draw->attrib_front1 = front1;
+   draw->attrib_back1 = back1;
+}
index 6778df3..f696475 100644 (file)
@@ -70,6 +70,25 @@ struct vertex_info
 
 
 
+/**
+ * Add another attribute to the given vertex_info object.
+ * \return slot in which the attribute was added
+ */
+static INLINE uint
+draw_emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
+                      uint interp)
+{
+   const uint n = vinfo->num_attribs;
+   vinfo->attr_mask |= (1 << vfAttr);
+   vinfo->slot_to_attrib[n] = vfAttr;
+   vinfo->format[n] = format;
+   vinfo->interp_mode[n] = interp;
+   vinfo->num_attribs++;
+   return n;
+}
+
+
+
 struct draw_context;
 
 extern int draw_vertex_cache_check_space( struct draw_context *draw, 
index 4b97223..4347dad 100644 (file)
 #include "i915_fpc.h"
 
 
-static INLINE uint
-emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
-                 uint interp)
-{
-   const uint n = vinfo->num_attribs;
-   vinfo->attr_mask |= (1 << vfAttr);
-   vinfo->slot_to_attrib[n] = vfAttr;
-   vinfo->format[n] = format;
-   vinfo->interp_mode[n] = interp;
-   vinfo->num_attribs++;
-   return n;
-}
-
-
-/**
- * Recompute the vinfo->size field.
- */
-static void
-compute_vertex_size(struct vertex_info *vinfo)
-{
-   uint i;
-
-   vinfo->size = 0;
-   for (i = 0; i < vinfo->num_attribs; i++) {
-      switch (vinfo->format[i]) {
-      case FORMAT_OMIT:
-         break;
-      case FORMAT_4UB:
-         /* fall-through */
-      case FORMAT_1F:
-         vinfo->size += 1;
-         break;
-      case FORMAT_2F:
-         vinfo->size += 2;
-         break;
-      case FORMAT_3F:
-         vinfo->size += 3;
-         break;
-      case FORMAT_4F:
-         vinfo->size += 4;
-         break;
-      default:
-         assert(0);
-      }
-   }
-}
-
-
-
 /**
  * Determine which post-transform / pre-rasterization vertex attributes
  * we need.
@@ -101,21 +52,21 @@ static void calculate_vertex_layout( struct i915_context *i915 )
    memset(vinfo, 0, sizeof(*vinfo));
 
    /* pos */
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_3F, INTERP_LINEAR);
+   draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_3F, INTERP_LINEAR);
    /* Note: we'll set the S4_VFMT_XYZ[W] bits below */
 
    /* color0 */
    if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
-      front0 = emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR0,
-                                FORMAT_4UB, colorInterp);
+      front0 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR0,
+                                     FORMAT_4UB, colorInterp);
       vinfo->hwfmt[0] |= S4_VFMT_COLOR;
    }
 
    /* color 1 */
    if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
       assert(0); /* untested */
-      front1 = emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR1,
-                                FORMAT_4UB, colorInterp);
+      front1 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR1,
+                                     FORMAT_4UB, colorInterp);
       vinfo->hwfmt[0] |= S4_VFMT_SPEC_FOG;
    }
 
@@ -127,7 +78,7 @@ static void calculate_vertex_layout( struct i915_context *i915 )
       for (i = TGSI_ATTRIB_TEX0; i <= TGSI_ATTRIB_TEX7; i++) {
          uint hwtc;
          if (inputsRead & (1 << i)) {
-            emit_vertex_attr(vinfo, i, FORMAT_4F, INTERP_PERSPECTIVE);
+            draw_emit_vertex_attr(vinfo, i, FORMAT_4F, INTERP_PERSPECTIVE);
             hwtc = TEXCOORDFMT_4D;
             needW = TRUE;
          }
@@ -154,16 +105,16 @@ static void calculate_vertex_layout( struct i915_context *i915 )
     */
    if (i915->setup.light_twoside) {
       if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
-         back0 = emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0,
-                                  FORMAT_OMIT, colorInterp);
+         back0 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0,
+                                       FORMAT_OMIT, colorInterp);
       }            
       if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
-         back1 = emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC1,
-                                  FORMAT_OMIT, colorInterp);
+         back1 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC1,
+                                       FORMAT_OMIT, colorInterp);
       }
    }
 
-   compute_vertex_size(vinfo);
+   draw_compute_vertex_size(vinfo);
 
    /* If the attributes have changed, tell the draw module about the new
     * vertex layout.  We'll also update the hardware vertex format info.
index 41b7340..4880870 100644 (file)
 #include "pipe/tgsi/exec/tgsi_attribs.h"
 
 
-
-/**
- * Add another attribute to the given vertex_info object.
- * \return slot in which the attribute was added
- */
-static uint
-emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
-                 uint interp)
-{
-   const uint n = vinfo->num_attribs;
-   vinfo->attr_mask |= (1 << vfAttr);
-   vinfo->slot_to_attrib[n] = vfAttr;
-   vinfo->format[n] = format;
-   vinfo->interp_mode[n] = interp;
-   vinfo->num_attribs++;
-   return n;
-}
-
-
-
 /**
  * Determine which post-transform / pre-rasterization vertex attributes
  * we need.
@@ -91,35 +71,37 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
 
    /* position */
    /* TODO - Figure out if we need to do perspective divide, etc. */
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F, INTERP_LINEAR);
+   draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F, INTERP_LINEAR);
  
    /* color0 */
    if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
-      front0 = emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR0,
-                                FORMAT_4F, colorInterp);
+      front0 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR0,
+                                     FORMAT_4F, colorInterp);
    }
 
    /* color1 */
    if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
-      front1 = emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR1,
-                                FORMAT_4F, colorInterp);
+      front1 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR1,
+                                     FORMAT_4F, colorInterp);
    }
 
    /* fog */
    if (inputsRead & (1 << TGSI_ATTRIB_FOG)) {
-      emit_vertex_attr(vinfo, TGSI_ATTRIB_FOG, FORMAT_1F, INTERP_PERSPECTIVE);
+      draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_FOG,
+                            FORMAT_1F, INTERP_PERSPECTIVE);
    }
 
    /* point size */
 #if 0
    /* XXX only emit if drawing points or front/back polygon mode is point mode */
-   emit_vertex_attr(vinfo, TGSI_ATTRIB_POINTSIZE, FORMAT_4F, INTERP_CONSTANT);
+   draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_POINTSIZE,
+                         FORMAT_4F, INTERP_CONSTANT);
 #endif
 
    /* texcoords and varying vars */
    for (i = TGSI_ATTRIB_TEX0; i < TGSI_ATTRIB_VAR7; i++) {
       if (inputsRead & (1 << i)) {
-         emit_vertex_attr(vinfo, i, FORMAT_4F, INTERP_PERSPECTIVE);
+         draw_emit_vertex_attr(vinfo, i, FORMAT_4F, INTERP_PERSPECTIVE);
          softpipe->need_w = TRUE;
       }
    }
@@ -132,13 +114,13 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
     */
    if (softpipe->setup.light_twoside) {
       if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
-         back0 = emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0,
-                                  FORMAT_OMIT, colorInterp);
+         back0 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0,
+                                       FORMAT_OMIT, colorInterp);
       }
            
       if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
-         back1 = emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC1,
-                                  FORMAT_OMIT, colorInterp);
+         back1 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC1,
+                                       FORMAT_OMIT, colorInterp);
       }
    }
 
index be24f93..ae0797a 100644 (file)
@@ -164,6 +164,7 @@ DRAW_SOURCES = \
        pipe/draw/draw_offset.c \
        pipe/draw/draw_prim.c \
        pipe/draw/draw_twoside.c \
+       pipe/draw/draw_vertex.c \
        pipe/draw/draw_vertex_cache.c \
        pipe/draw/draw_vertex_fetch.c \
        pipe/draw/draw_vertex_shader.c \