diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/pipe/draw/draw_vf.c | 10 | ||||
| -rw-r--r-- | src/mesa/pipe/draw/draw_vf.h | 22 | ||||
| -rw-r--r-- | src/mesa/pipe/draw/draw_vf_generic.c | 42 | ||||
| -rw-r--r-- | src/mesa/pipe/draw/draw_vf_sse.c | 4 | 
4 files changed, 62 insertions, 16 deletions
diff --git a/src/mesa/pipe/draw/draw_vf.c b/src/mesa/pipe/draw/draw_vf.c index 4fc2312ad1..958d31933b 100644 --- a/src/mesa/pipe/draw/draw_vf.c +++ b/src/mesa/pipe/draw/draw_vf.c @@ -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];     }  } diff --git a/src/mesa/pipe/draw/draw_vf.h b/src/mesa/pipe/draw/draw_vf.h index c0fa063c52..911ea07bdf 100644 --- a/src/mesa/pipe/draw/draw_vf.h +++ b/src/mesa/pipe/draw/draw_vf.h @@ -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  diff --git a/src/mesa/pipe/draw/draw_vf_generic.c b/src/mesa/pipe/draw/draw_vf_generic.c index a16eb456b7..0caa798396 100644 --- a/src/mesa/pipe/draw/draw_vf_generic.c +++ b/src/mesa/pipe/draw/draw_vf_generic.c @@ -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 },  }; diff --git a/src/mesa/pipe/draw/draw_vf_sse.c b/src/mesa/pipe/draw/draw_vf_sse.c index 4036ded1d8..1389e6cfb9 100644 --- a/src/mesa/pipe/draw/draw_vf_sse.c +++ b/src/mesa/pipe/draw/draw_vf_sse.c @@ -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);  | 
