.. _vertexelements:

Vertex Elements
===============

This state controls the format of the input attributes contained in
pipe_vertex_buffers. There is one pipe_vertex_element array member for each
input attribute.

Input Formats
-------------

Gallium supports a diverse range of formats for vertex data. Drivers are
guaranteed to support 32-bit floating-point vectors of one to four components.
Additionally, they may support the following formats:

* Integers, signed or unsigned, normalized or non-normalized, 8, 16, or 32
  bits wide
* Floating-point, 16, 32, or 64 bits wide

At this time, support for varied vertex data formats is limited by driver
deficiencies. It is planned to support a single uniform set of formats for all
Gallium drivers at some point.

Rather than attempt to specify every small nuance of behavior, Gallium uses a
very simple set of rules for padding out unspecified components. If an input
uses less than four components, it will be padded out with the constant vector
``(0, 0, 0, 1)``.

Fog, point size, the facing bit, and edge flags, all are in the standard
format of ``(x, 0, 0, 1)``, and so only the first component of those inputs is
used.

Position
%%%%%%%%

Vertex position may be specified with two to four components. Using less than
two components is not allowed.

Colors
%%%%%%

Colors, both front- and back-facing, may omit the alpha component, only using
three components. Using less than three components is not allowed.

Members
-------

src_offset
    The byte offset of the attribute in the buffer given by
    vertex_buffer_index for the first vertex.
instance_divisor
    The instance data rate divisor, used for instancing.
    0 means this is per-vertex data, n means per-instance data used for
    n consecutive instances (n > 0).
vertex_buffer_index
    The vertex buffer this attribute lives in. Several attributes may
    live in the same vertex buffer.
src_format
    The format of the attribute data. One of the PIPE_FORMAT tokens.
