On 32-bit builds you can't set int attributes using glUniformI* to certain values if they happen to look like a signalling NaN number when interpreted as a float. This is similar to bug 81150 except that it is not limited to the i965 driver.
The problem is that the attribute values are always stored in float variables even if they are actually integers. The values are converted to float using INT_AS_FLT and UINT_AS_FLT. I think the best thing to do would be to get rid of these functions and have FLT_AS_UINT instead. Then we can change all of the variables to store the values in GLuints instead of floats.
Created attachment 104683 [details]
Piglit test case to demonstrate the problem
(In reply to comment #0)
> On 32-bit builds you can't set int attributes using glUniformI*
Err, I meant glVertexAttribI*
I took a brief look at this. It doesn't look too hard to chane. We just need to update the code in mesa/vbo to do integer copies instead of float copies. Maybe we should change the pointer type while we're at it?
After some investigation and testing ,the best solution I found is to use union gl_constant_value to store the values(vtx.attrptr) instead of storing them in a float. That involve to update all the dependency and use a new defined macros like this:
#define ATTR( A, N, T, V0, V1, V2, V3 ) ATTR_##T(A, N, T, V0, V1, V2, V3)
#define ATTR_GLuint( A, N, T, V0, V1, V2, V3 ) \
ATTR_UNION(A, N, T, UINT_AS_UNION(V0), UINT_AS_UNION(V1), UINT_AS_UNION(V2), UINT_AS_UNION(V3))
#define ATTR_GLint( A, N, T, V0, V1, V2, V3 ) \
ATTR_UNION(A, N, T, INT_AS_UNION(V0), INT_AS_UNION(V1), INT_AS_UNION(V2), INT_AS_UNION(V3))
The old ATTR became ATTR_UNION and treat the input values(V1,...,V4) as gl_constant_value union.
A patch that fix this defect was sent to firstname.lastname@example.org
Patch committed to master.