diff options
Diffstat (limited to 'src/mesa/vbo/vbo_attrib_tmp.h')
-rw-r--r-- | src/mesa/vbo/vbo_attrib_tmp.h | 401 |
1 files changed, 399 insertions, 2 deletions
diff --git a/src/mesa/vbo/vbo_attrib_tmp.h b/src/mesa/vbo/vbo_attrib_tmp.h index c793ce0dc37..d6448dfb6a1 100644 --- a/src/mesa/vbo/vbo_attrib_tmp.h +++ b/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 |