Minor point in case we ever refactor the API at some point. glVertexAttribIPointer is a bit of a wart in that if you have generic batch launch code (vtx attrib binds, etc.) you have to use a separate API for this, which doesn't even have the same signature, so you're more likely to eat the cost of an "if" per vtx attrib to select the right API (potential branch prediction miss).
Code :if ( integer ) glVertexAttribIPointer( index, size, type, stride, ptr ); else glVertexAttribPointer (index, size, type, normalized, stride, ptr );
Would have been better had this been handled like the normalized flag (i.e. added as a flag on a new API call): ignored if your input type isn't a fixed-point value, but used if it is. Then you could just call one API regardless. Alternatively, handle this internally based on the shader input type (e.g. uvec4 vs. vec4) and not even have an arg.
A middle ground solution isn't as pretty -- wrap AttribIPointer with an function that has the same signature as AttribPointer and then select from a 2-element array based on an integer flag. Avoids the if, but imposes another layer of function call on IPointer.