gallium: Emit constants.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Tue, 29 Jan 2008 11:46:48 +0000 (20:46 +0900)
committerBen Skeggs <skeggsb@gmail.com>
Fri, 15 Feb 2008 02:50:24 +0000 (13:50 +1100)
src/mesa/pipe/draw/draw_vf.c
src/mesa/pipe/draw/draw_vf.h
src/mesa/pipe/draw/draw_vf_generic.c
src/mesa/pipe/draw/draw_vf_sse.c

index 4fc2312ad1e0936702323f0b18fa362c2ce1e2f4..958d31933bac028cbd2daa97d9f80faa2c0cff41 100644 (file)
@@ -182,6 +182,9 @@ unsigned draw_vf_set_vertex_attributes( struct draw_vertex_fetch *vf,
         vf->attr[j].insert = draw_vf_format_info[format].insert;
         vf->attr[j].vertattrsize = draw_vf_format_info[format].attrsize;
         vf->attr[j].vertoffset = offset;
+        vf->attr[j].isconst = draw_vf_format_info[format].isconst;
+        if(vf->attr[j].isconst)
+           memcpy(vf->attr[j].data, &map[i].data, vf->attr[j].vertattrsize);
         
         if (DBG)
            _mesa_printf("%d: %s, offset %d\n", i,  
@@ -240,8 +243,11 @@ void draw_vf_set_data( struct draw_vertex_fetch *vf,
    for (j = 0; j < vf->attr_count; j++) {
       a[j].inputstride = 0; /* XXX: one-vertex-max ATM */ 
       a[j].inputsize = 4;
-      a[j].do_insert = a[j].insert[4 - 1]; 
-      a[j].inputptr = (uint8_t *)&data[a[j].attrib][0];
+      a[j].do_insert = a[j].insert[4 - 1];
+      if(a[j].isconst)
+        a[j].inputptr = a[j].data;
+      else
+        a[j].inputptr = (uint8_t *)&data[a[j].attrib][0];
    }
 }
 
index c0fa063c52f5c4e4460dbce8e5da014beaf03993..911ea07bdfe6bfae4d4b777dfb275803729530a7 100644 (file)
@@ -48,14 +48,30 @@ enum draw_vf_attr_format {
    DRAW_EMIT_4UB_4F_BGRA,              /**< for color */
    DRAW_EMIT_4UB_4F_ARGB,              /**< for color */
    DRAW_EMIT_4UB_4F_ABGR,              /**< for color */
+   DRAW_EMIT_1F_CONST,
+   DRAW_EMIT_2F_CONST,
+   DRAW_EMIT_3F_CONST,
+   DRAW_EMIT_4F_CONST,
    DRAW_EMIT_PAD,                      /**< leave a hole of 'offset' bytes */
    DRAW_EMIT_MAX
 };
 
-struct draw_vf_attr_map {
+struct draw_vf_attr_map 
+{
+   /** Input attribute number */
    unsigned attrib;
+   
    enum draw_vf_attr_format format;
+   
    unsigned offset;
+   
+   /** 
+    * Constant data for DRAW_EMIT_*_CONST 
+    */
+   union {
+      uint8_t ub[4];
+      float f[4];
+   } data;
 };
 
 struct draw_vertex_fetch;
@@ -124,6 +140,9 @@ struct draw_vf_attr
    unsigned inputsize;
    unsigned inputstride;
    unsigned vertoffset;      /**< position of the attrib in the vertex struct */
+   
+   boolean isconst;              /**< read from const data below */
+   uint8_t data[16];
 
    unsigned attrib;          /**< which vertex attrib (0=position, etc) */
    unsigned vertattrsize;    /**< size of the attribute in bytes */
@@ -193,6 +212,7 @@ struct draw_vf_format_info {
    const char *name;
    draw_vf_insert_func insert[4];
    const unsigned attrsize;
+   const boolean isconst;
 };
 
 extern const struct draw_vf_format_info 
index a16eb456b7476a8dcc297d6fe809b816df6cb7c0..0caa798396daa80624b3f60a3b61aa9fe5c18e62 100644 (file)
@@ -387,62 +387,78 @@ const struct draw_vf_format_info draw_vf_format_info[DRAW_EMIT_MAX] =
 {
    { "1f",
      { insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 },
-     sizeof(float) },
+     sizeof(float), FALSE },
 
    { "2f",
      { insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 },
-     2 * sizeof(float) },
+     2 * sizeof(float), FALSE },
 
    { "3f",
      { insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 },
-     3 * sizeof(float) },
+     3 * sizeof(float), FALSE },
 
    { "4f",
      { insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 },
-     4 * sizeof(float) },
+     4 * sizeof(float), FALSE },
 
    { "3f_xyw",
      { insert_3f_xyw_err, insert_3f_xyw_err, insert_3f_xyw_err, 
        insert_3f_xyw_4 },
-     3 * sizeof(float) },
+     3 * sizeof(float), FALSE },
 
    { "1ub_1f",
      { insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1 },
-     sizeof(uint8_t) },
+     sizeof(uint8_t), FALSE },
 
    { "3ub_3f_rgb",
      { insert_3ub_3f_rgb_1, insert_3ub_3f_rgb_2, insert_3ub_3f_rgb_3,
        insert_3ub_3f_rgb_3 },
-     3 * sizeof(uint8_t) },
+     3 * sizeof(uint8_t), FALSE },
 
    { "3ub_3f_bgr",
      { insert_3ub_3f_bgr_1, insert_3ub_3f_bgr_2, insert_3ub_3f_bgr_3,
        insert_3ub_3f_bgr_3 },
-     3 * sizeof(uint8_t) },
+     3 * sizeof(uint8_t), FALSE },
 
    { "4ub_4f_rgba",
      { insert_4ub_4f_rgba_1, insert_4ub_4f_rgba_2, insert_4ub_4f_rgba_3, 
        insert_4ub_4f_rgba_4 },
-     4 * sizeof(uint8_t) },
+     4 * sizeof(uint8_t), FALSE },
 
    { "4ub_4f_bgra",
      { insert_4ub_4f_bgra_1, insert_4ub_4f_bgra_2, insert_4ub_4f_bgra_3,
        insert_4ub_4f_bgra_4 },
-     4 * sizeof(uint8_t) },
+     4 * sizeof(uint8_t), FALSE },
 
    { "4ub_4f_argb",
      { insert_4ub_4f_argb_1, insert_4ub_4f_argb_2, insert_4ub_4f_argb_3,
        insert_4ub_4f_argb_4 },
-     4 * sizeof(uint8_t) },
+     4 * sizeof(uint8_t), FALSE },
 
    { "4ub_4f_abgr",
      { insert_4ub_4f_abgr_1, insert_4ub_4f_abgr_2, insert_4ub_4f_abgr_3,
        insert_4ub_4f_abgr_4 },
-     4 * sizeof(uint8_t) },
+     4 * sizeof(uint8_t), FALSE },
+
+   { "1f_const",
+     { insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 },
+     sizeof(float), TRUE },
+   
+   { "2f_const",
+     { insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 },
+     2 * sizeof(float), TRUE },
+   
+   { "3f_const",
+     { insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 },
+     3 * sizeof(float), TRUE },
+   
+   { "4f_const",
+     { insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 },
+     4 * sizeof(float), TRUE },
 
    { "pad",
      { NULL, NULL, NULL, NULL },
-     0 }
+     0, FALSE },
 
 };
 
index 4036ded1d84c1327bab5e4600bbf48bb3c73e8e5..1389e6cfb9c57cad2197ce8a326457a9399eccc5 100644 (file)
@@ -388,18 +388,21 @@ static boolean build_vertex_emit( struct x86_program *p )
        */
       switch (a->format) {
       case DRAW_EMIT_1F:
+      case DRAW_EMIT_1F_CONST:
         get_src_ptr(p, srcECX, vfESI, a);
         emit_load(p, temp, 1, x86_deref(srcECX), a->inputsize);
         emit_store(p, dest, 1, temp);
         update_src_ptr(p, srcECX, vfESI, a);
         break;
       case DRAW_EMIT_2F:
+      case DRAW_EMIT_2F_CONST:
         get_src_ptr(p, srcECX, vfESI, a);
         emit_load(p, temp, 2, x86_deref(srcECX), a->inputsize);
         emit_store(p, dest, 2, temp);
         update_src_ptr(p, srcECX, vfESI, a);
         break;
       case DRAW_EMIT_3F:
+      case DRAW_EMIT_3F_CONST:
         /* Potentially the worst case - hardcode 2+1 copying:
          */
         if (0) {
@@ -423,6 +426,7 @@ static boolean build_vertex_emit( struct x86_program *p )
         }
         break;
       case DRAW_EMIT_4F:
+      case DRAW_EMIT_4F_CONST:
         get_src_ptr(p, srcECX, vfESI, a);
         emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize);
         emit_store(p, dest, 4, temp);