diff options
author | Marek Olšák <[email protected]> | 2012-10-30 14:44:22 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-11-06 01:13:48 +0100 |
commit | acf438f5375e2426386694e541b843dc6f8fd11a (patch) | |
tree | 6aaa04f8419661892a74168d144537905efac8a2 /src/mesa/vbo/vbo_attrib_tmp.h | |
parent | a196f43596f6cb85a8f3e446596a2fb8e0ee7872 (diff) |
vbo: fix glVertexAttribI* functions
The functions were broken, because they converted ints to floats.
Now we can finally advertise OpenGL 3.0. ;)
In this commit, the vbo module also tracks the type for each attrib
in addition to the size. It can be one of FLOAT, INT, UNSIGNED_INT.
The little ugliness is the vertex attribs are declared as floats even though
there may be integer values. The code just copies integer values into them
without any conversion.
This implementation passes the glVertexAttribI piglit test which I am going
to commit in piglit soon. The test covers vertex arrays, immediate mode and
display lists.
NOTE: This is a candidate for the stable branches.
Reviewed-by: Brian Paul <[email protected]>
v2: cosmetic changes as suggested by Brian
Diffstat (limited to 'src/mesa/vbo/vbo_attrib_tmp.h')
-rw-r--r-- | src/mesa/vbo/vbo_attrib_tmp.h | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/src/mesa/vbo/vbo_attrib_tmp.h b/src/mesa/vbo/vbo_attrib_tmp.h index 88484453570..6bc53bab3d2 100644 --- a/src/mesa/vbo/vbo_attrib_tmp.h +++ b/src/mesa/vbo/vbo_attrib_tmp.h @@ -26,38 +26,46 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ /* float */ -#define ATTR1FV( A, V ) ATTR( A, 1, (V)[0], 0, 0, 1 ) -#define ATTR2FV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 ) -#define ATTR3FV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 ) -#define ATTR4FV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] ) +#define ATTR1FV( A, V ) ATTR( A, 1, GL_FLOAT, (V)[0], 0, 0, 1 ) +#define ATTR2FV( A, V ) ATTR( A, 2, GL_FLOAT, (V)[0], (V)[1], 0, 1 ) +#define ATTR3FV( A, V ) ATTR( A, 3, GL_FLOAT, (V)[0], (V)[1], (V)[2], 1 ) +#define ATTR4FV( A, V ) ATTR( A, 4, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] ) -#define ATTR1F( A, X ) ATTR( A, 1, X, 0, 0, 1 ) -#define ATTR2F( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 ) -#define ATTR3F( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 ) -#define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W ) +#define ATTR1F( A, X ) ATTR( A, 1, GL_FLOAT, X, 0, 0, 1 ) +#define ATTR2F( A, X, Y ) ATTR( A, 2, GL_FLOAT, X, Y, 0, 1 ) +#define ATTR3F( A, X, Y, Z ) ATTR( A, 3, GL_FLOAT, X, Y, Z, 1 ) +#define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, GL_FLOAT, X, Y, Z, W ) /* int */ -#define ATTR2IV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 ) -#define ATTR3IV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 ) -#define ATTR4IV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] ) +#define ATTRI( A, N, X, Y, Z, W) ATTR( A, N, GL_INT, \ + INT_AS_FLT(X), INT_AS_FLT(Y), \ + INT_AS_FLT(Z), INT_AS_FLT(W) ) -#define ATTR1I( A, X ) ATTR( A, 1, X, 0, 0, 1 ) -#define ATTR2I( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 ) -#define ATTR3I( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 ) -#define ATTR4I( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W ) +#define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 ) +#define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 ) +#define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] ) + +#define ATTR1I( A, X ) ATTRI( A, 1, X, 0, 0, 1 ) +#define ATTR2I( A, X, Y ) ATTRI( A, 2, X, Y, 0, 1 ) +#define ATTR3I( A, X, Y, Z ) ATTRI( A, 3, X, Y, Z, 1 ) +#define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W ) /* uint */ -#define ATTR2UIV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 ) -#define ATTR3UIV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 ) -#define ATTR4UIV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] ) +#define ATTRUI( A, N, X, Y, Z, W) ATTR( A, N, GL_UNSIGNED_INT, \ + UINT_AS_FLT(X), UINT_AS_FLT(Y), \ + UINT_AS_FLT(Z), UINT_AS_FLT(W) ) + +#define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 ) +#define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 ) +#define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] ) -#define ATTR1UI( A, X ) ATTR( A, 1, X, 0, 0, 1 ) -#define ATTR2UI( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 ) -#define ATTR3UI( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 ) -#define ATTR4UI( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W ) +#define ATTR1UI( A, X ) ATTRUI( A, 1, X, 0, 0, 1 ) +#define ATTR2UI( A, X, Y ) ATTRUI( A, 2, X, Y, 0, 1 ) +#define ATTR3UI( A, X, Y, Z ) ATTRUI( A, 3, X, Y, Z, 1 ) +#define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W ) -#define MAT_ATTR( A, N, V ) ATTR( A, N, (V)[0], (V)[1], (V)[2], (V)[3] ) +#define MAT_ATTR( A, N, V ) ATTR( A, N, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] ) static inline float conv_ui10_to_norm_float(unsigned ui10) { @@ -69,20 +77,20 @@ static inline float conv_ui2_to_norm_float(unsigned ui2) return ui2 / 3.0f; } -#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 ATTRUI10_1( A, UI ) ATTR( A, 1, GL_FLOAT, (UI) & 0x3ff, 0, 0, 1 ) +#define ATTRUI10_2( A, UI ) ATTR( A, 2, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 ) +#define ATTRUI10_3( A, UI ) ATTR( A, 3, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 ) +#define ATTRUI10_4( A, UI ) ATTR( A, 4, GL_FLOAT, (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, \ +#define ATTRUI10N_1( A, UI ) ATTR( A, 1, GL_FLOAT, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 ) +#define ATTRUI10N_2( A, UI ) ATTR( A, 2, GL_FLOAT, \ 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, \ +#define ATTRUI10N_3( A, UI ) ATTR( A, 3, GL_FLOAT, \ 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, \ +#define ATTRUI10N_4( A, UI ) ATTR( A, 4, GL_FLOAT, \ conv_ui10_to_norm_float((UI) & 0x3ff), \ conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \ conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \ @@ -119,30 +127,30 @@ static inline float conv_i2_to_norm_float(int 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, \ +#define ATTRI10_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 ) +#define ATTRI10_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \ conv_i10_to_i((I10) & 0x3ff), \ conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 ) -#define ATTRI10_3( A, I10 ) ATTR( A, 3, \ +#define ATTRI10_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \ 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, \ +#define ATTRI10_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \ 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, \ +#define ATTRI10N_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_norm_float((I10) & 0x3ff), 0, 0, 1 ) +#define ATTRI10N_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \ 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, \ +#define ATTRI10N_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \ 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, \ +#define ATTRI10N_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \ conv_i10_to_norm_float((I10) & 0x3ff), \ conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \ conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), \ |