aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mesa/vbo/vbo_attrib_tmp.h
diff options
context:
space:
mode:
Diffstat (limited to 'mesalib/src/mesa/vbo/vbo_attrib_tmp.h')
-rw-r--r--mesalib/src/mesa/vbo/vbo_attrib_tmp.h401
1 files changed, 399 insertions, 2 deletions
diff --git a/mesalib/src/mesa/vbo/vbo_attrib_tmp.h b/mesalib/src/mesa/vbo/vbo_attrib_tmp.h
index c793ce0dc..d6448dfb6 100644
--- a/mesalib/src/mesa/vbo/vbo_attrib_tmp.h
+++ b/mesalib/src/mesa/vbo/vbo_attrib_tmp.h
@@ -1,7 +1,7 @@
/**************************************************************************
Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
-
+Copyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a
@@ -59,7 +59,120 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#define MAT_ATTR( A, N, V ) ATTR( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
-
+static inline float conv_ui10_to_norm_float(unsigned ui10)
+{
+ return (float)(ui10) / 1023.0;
+}
+
+static inline float conv_ui2_to_norm_float(unsigned ui2)
+{
+ return (float)(ui2) / 3.0;
+}
+
+#define ATTRUI10_1( A, UI ) ATTR( A, 1, (UI) & 0x3ff, 0, 0, 1 )
+#define ATTRUI10_2( A, UI ) ATTR( A, 2, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
+#define ATTRUI10_3( A, UI ) ATTR( A, 3, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
+#define ATTRUI10_4( A, UI ) ATTR( A, 4, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
+
+#define ATTRUI10N_1( A, UI ) ATTR( A, 1, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
+#define ATTRUI10N_2( A, UI ) ATTR( A, 2, \
+ conv_ui10_to_norm_float((UI) & 0x3ff), \
+ conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
+#define ATTRUI10N_3( A, UI ) ATTR( A, 3, \
+ conv_ui10_to_norm_float((UI) & 0x3ff), \
+ conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
+ conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
+#define ATTRUI10N_4( A, UI ) ATTR( A, 4, \
+ conv_ui10_to_norm_float((UI) & 0x3ff), \
+ conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
+ conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
+ conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
+
+struct attr_bits_10 {signed int x:10;};
+struct attr_bits_2 {signed int x:2;};
+
+static inline float conv_i10_to_i(int i10)
+{
+ struct attr_bits_10 val;
+ val.x = i10;
+ return (float)val.x;
+}
+
+static inline float conv_i2_to_i(int i2)
+{
+ struct attr_bits_2 val;
+ val.x = i2;
+ return (float)val.x;
+}
+
+static inline float conv_i10_to_norm_float(int i10)
+{
+ struct attr_bits_10 val;
+ val.x = i10;
+ return (2.0F * (float)val.x + 1.0F) * (1.0F / 511.0F);
+}
+
+static inline float conv_i2_to_norm_float(int i2)
+{
+ struct attr_bits_2 val;
+ val.x = i2;
+ return (float)val.x;
+}
+
+#define ATTRI10_1( A, I10 ) ATTR( A, 1, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
+#define ATTRI10_2( A, I10 ) ATTR( A, 2, \
+ conv_i10_to_i((I10) & 0x3ff), \
+ conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
+#define ATTRI10_3( A, I10 ) ATTR( A, 3, \
+ conv_i10_to_i((I10) & 0x3ff), \
+ conv_i10_to_i(((I10) >> 10) & 0x3ff), \
+ conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
+#define ATTRI10_4( A, I10 ) ATTR( A, 4, \
+ conv_i10_to_i((I10) & 0x3ff), \
+ conv_i10_to_i(((I10) >> 10) & 0x3ff), \
+ conv_i10_to_i(((I10) >> 20) & 0x3ff), \
+ conv_i2_to_i(((I10) >> 30) & 0x3))
+
+
+#define ATTRI10N_1( A, I10 ) ATTR( A, 1, conv_i10_to_norm_float((I10) & 0x3ff), 0, 0, 1 )
+#define ATTRI10N_2( A, I10 ) ATTR( A, 2, \
+ conv_i10_to_norm_float((I10) & 0x3ff), \
+ conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), 0, 1 )
+#define ATTRI10N_3( A, I10 ) ATTR( A, 3, \
+ conv_i10_to_norm_float((I10) & 0x3ff), \
+ conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
+ conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), 1 )
+#define ATTRI10N_4( A, I10 ) ATTR( A, 4, \
+ conv_i10_to_norm_float((I10) & 0x3ff), \
+ conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
+ conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), \
+ conv_i2_to_norm_float(((I10) >> 30) & 0x3))
+
+#define ATTR_UI(val, type, normalized, attr, arg) do { \
+ if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) { \
+ if (normalized) { \
+ ATTRUI10N_##val((attr), (arg)); \
+ } else { \
+ ATTRUI10_##val((attr), (arg)); \
+ } \
+ } else if ((type) == GL_INT_2_10_10_10_REV) { \
+ if (normalized) { \
+ ATTRI10N_##val((attr), (arg)); \
+ } else { \
+ ATTRI10_##val((attr), (arg)); \
+ } \
+ } else \
+ ERROR(GL_INVALID_VALUE); \
+ } while(0)
+
+#define ATTR_UI_INDEX(val, type, normalized, index, arg) do { \
+ if ((index) == 0) { \
+ ATTR_UI(val, (type), normalized, 0, (arg)); \
+ } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) { \
+ ATTR_UI(val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
+ } else \
+ ERROR(GL_INVALID_VALUE); \
+ } while(0)
static void GLAPIENTRY
TAG(Vertex2f)(GLfloat x, GLfloat y)
@@ -725,6 +838,288 @@ TAG(Materialfv)(GLenum face, GLenum pname,
}
}
+static void GLAPIENTRY
+TAG(VertexP2ui)(GLenum type, GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(2, type, 0, VBO_ATTRIB_POS, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexP2uiv)(GLenum type, const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(2, type, 0, VBO_ATTRIB_POS, value[0]);
+}
+
+static void GLAPIENTRY
+TAG(VertexP3ui)(GLenum type, GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 0, VBO_ATTRIB_POS, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexP3uiv)(GLenum type, const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 0, VBO_ATTRIB_POS, value[0]);
+}
+
+static void GLAPIENTRY
+TAG(VertexP4ui)(GLenum type, GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 0, VBO_ATTRIB_POS, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexP4uiv)(GLenum type, const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 0, VBO_ATTRIB_POS, value[0]);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP1ui)(GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(1, type, 0, VBO_ATTRIB_TEX0, coords);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP1uiv)(GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(1, type, 0, VBO_ATTRIB_TEX0, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP2ui)(GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(2, type, 0, VBO_ATTRIB_TEX0, coords);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP2uiv)(GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(2, type, 0, VBO_ATTRIB_TEX0, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP3ui)(GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 0, VBO_ATTRIB_TEX0, coords);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP3uiv)(GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 0, VBO_ATTRIB_TEX0, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP4ui)(GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 0, VBO_ATTRIB_TEX0, coords);
+}
+
+static void GLAPIENTRY
+TAG(TexCoordP4uiv)(GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 0, VBO_ATTRIB_TEX0, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP1ui)(GLenum target, GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(1, type, 0, attr, coords);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP1uiv)(GLenum target, GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(1, type, 0, attr, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP2ui)(GLenum target, GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(2, type, 0, attr, coords);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP2uiv)(GLenum target, GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(2, type, 0, attr, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP3ui)(GLenum target, GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(3, type, 0, attr, coords);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP3uiv)(GLenum target, GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(3, type, 0, attr, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP4ui)(GLenum target, GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(4, type, 0, attr, coords);
+}
+
+static void GLAPIENTRY
+TAG(MultiTexCoordP4uiv)(GLenum target, GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
+ ATTR_UI(4, type, 0, attr, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(NormalP3ui)(GLenum type, GLuint coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_NORMAL, coords);
+}
+
+static void GLAPIENTRY
+TAG(NormalP3uiv)(GLenum type, const GLuint *coords)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_NORMAL, coords[0]);
+}
+
+static void GLAPIENTRY
+TAG(ColorP3ui)(GLenum type, GLuint color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR0, color);
+}
+
+static void GLAPIENTRY
+TAG(ColorP3uiv)(GLenum type, const GLuint *color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR0, color[0]);
+}
+
+static void GLAPIENTRY
+TAG(ColorP4ui)(GLenum type, GLuint color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 1, VBO_ATTRIB_COLOR0, color);
+}
+
+static void GLAPIENTRY
+TAG(ColorP4uiv)(GLenum type, const GLuint *color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(4, type, 1, VBO_ATTRIB_COLOR0, color[0]);
+}
+
+static void GLAPIENTRY
+TAG(SecondaryColorP3ui)(GLenum type, GLuint color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR1, color);
+}
+
+static void GLAPIENTRY
+TAG(SecondaryColorP3uiv)(GLenum type, const GLuint *color)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR1, color[0]);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP1ui)(GLuint index, GLenum type, GLboolean normalized,
+ GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(1, type, normalized, index, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP2ui)(GLuint index, GLenum type, GLboolean normalized,
+ GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(2, type, normalized, index, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP3ui)(GLuint index, GLenum type, GLboolean normalized,
+ GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(3, type, normalized, index, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP4ui)(GLuint index, GLenum type, GLboolean normalized,
+ GLuint value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(4, type, normalized, index, value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP1uiv)(GLuint index, GLenum type, GLboolean normalized,
+ const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(1, type, normalized, index, *value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP2uiv)(GLuint index, GLenum type, GLboolean normalized,
+ const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(2, type, normalized, index, *value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP3uiv)(GLuint index, GLenum type, GLboolean normalized,
+ const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(3, type, normalized, index, *value);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribP4uiv)(GLuint index, GLenum type, GLboolean normalized,
+ const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ATTR_UI_INDEX(4, type, normalized, index, *value);
+}
+
#undef ATTR1FV
#undef ATTR2FV
@@ -736,5 +1131,7 @@ TAG(Materialfv)(GLenum face, GLenum pname,
#undef ATTR3F
#undef ATTR4F
+#undef ATTR_UI
+
#undef MAT
#undef MAT_ATTR