Hi everyone, I noticed the src_offset of pipe_vertex_element has 32 bits, but no hardware can do such a large value per vertex element and it leads to awkward workarounds in hardware drivers. To my knowledge, nv50 can only do 12 bits and r600 can only do 16 bits. There's no such limitation on pipe_vertex_buffer::buffer_offset.
I am proposing to change src_offset to 12 bits. Then the pipe_vertex_element struct can be packed like this: --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -476,20 +476,21 @@ struct pipe_stream_output_target */ struct pipe_vertex_element { - /** Offset of this attribute, in bytes, from the start of the vertex */ - unsigned src_offset; + /** Offset of this attribute, in bytes, from the start of the vertex. + * Limited to 12 bits due to lack of hardware support. */ + unsigned src_offset:12; + + /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does + * this attribute live in? + */ + unsigned vertex_buffer_index:5; + + enum pipe_format src_format:15; /** Instance data rate divisor. 0 means this is per-vertex data, * n means per-instance data used for n consecutive instances (n > 0). */ unsigned instance_divisor; - - /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does - * this attribute live in? - */ - unsigned vertex_buffer_index; - - enum pipe_format src_format; }; The Mesa state tracker change should be trivial. Opinions? Best regards, Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev