summaryrefslogtreecommitdiffstats
path: root/src/mesa/tnl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/tnl')
-rw-r--r--src/mesa/tnl/t_vertex.c50
-rw-r--r--src/mesa/tnl/t_vertex.h1
2 files changed, 34 insertions, 17 deletions
diff --git a/src/mesa/tnl/t_vertex.c b/src/mesa/tnl/t_vertex.c
index 3729e1cc7d7..dc9ea6184c6 100644
--- a/src/mesa/tnl/t_vertex.c
+++ b/src/mesa/tnl/t_vertex.c
@@ -657,7 +657,12 @@ struct {
extract_4chan_4f_rgba,
{ insert_4chan_4f_rgba_1, insert_4chan_4f_rgba_2, insert_4chan_4f_rgba_3,
insert_4chan_4f_rgba_4 },
- 4 * sizeof(GLchan) }
+ 4 * sizeof(GLchan) },
+
+ { "pad",
+ 0,
+ { 0, 0, 0, 0 },
+ 0 }
};
@@ -958,36 +963,47 @@ GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map,
{
struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx);
int offset = 0;
- GLuint i;
+ GLuint i, j;
assert(nr < _TNL_ATTRIB_MAX);
assert(nr == 0 || map[0].attrib == VERT_ATTRIB_POS);
- vtx->attr_count = nr;
vtx->emit = choose_emit_func;
vtx->interp = choose_interp_func;
vtx->copy_pv = choose_copy_pv_func;
vtx->new_inputs = ~0;
- for (i = 0; i < nr; i++) {
+ for (j = 0, i = 0; i < nr; i++) {
GLuint format = map[i].format;
- vtx->attr[i].attrib = map[i].attrib;
- vtx->attr[i].vp = vp;
- vtx->attr[i].insert = format_info[format].insert;
- vtx->attr[i].extract = format_info[format].extract;
- vtx->attr[i].vertattrsize = format_info[format].attrsize;
+ if (format == EMIT_PAD) {
+ offset += map[i].offset;
- if (unpacked_size)
- vtx->attr[i].vertoffset = map[i].offset;
- else
- vtx->attr[i].vertoffset = offset;
+/* fprintf(stderr, "%d: pad %d, offset now %d\n", i, */
+/* map[i].offset, offset); */
-/* fprintf(stderr, "%d: %s offset %d\n", i, */
-/* format_info[format].name, vtx->attr[i].vertoffset); */
-
- offset += format_info[format].attrsize;
+ }
+ else {
+ vtx->attr[j].attrib = map[i].attrib;
+ vtx->attr[j].vp = vp;
+ vtx->attr[j].insert = format_info[format].insert;
+ vtx->attr[j].extract = format_info[format].extract;
+ vtx->attr[j].vertattrsize = format_info[format].attrsize;
+
+ if (unpacked_size)
+ vtx->attr[j].vertoffset = map[i].offset;
+ else
+ vtx->attr[j].vertoffset = offset;
+
+/* fprintf(stderr, "%d: %s offset %d\n", i, */
+/* format_info[format].name, vtx->attr[j].vertoffset); */
+
+ offset += format_info[format].attrsize;
+ j++;
+ }
}
+ vtx->attr_count = j;
+
if (unpacked_size)
vtx->vertex_size = unpacked_size;
else
diff --git a/src/mesa/tnl/t_vertex.h b/src/mesa/tnl/t_vertex.h
index 297b6a4cbe9..6c58ca994b3 100644
--- a/src/mesa/tnl/t_vertex.h
+++ b/src/mesa/tnl/t_vertex.h
@@ -51,6 +51,7 @@ enum tnl_attr_format {
EMIT_4UB_4F_BGRA, /* for color */
EMIT_4UB_4F_RGBA, /* for color */
EMIT_4CHAN_4F_RGBA, /* for swrast color */
+ EMIT_PAD, /* leave a hole of 'offset' bytes */
EMIT_MAX
};