diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/mtypes.h | 1 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 256 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_atom_array.c | 263 |
3 files changed, 259 insertions, 261 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index bcca2b8c3b5..0da926e67ff 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -459,6 +459,7 @@ struct gl_vertex_format { GLenum16 Type; /**< datatype: GL_FLOAT, GL_INT, etc */ GLenum16 Format; /**< default: GL_RGBA, but may be GL_BGRA */ + enum pipe_format _PipeFormat:16; /**< pipe_format for Gallium */ GLubyte Size:5; /**< components per element (1,2,3,4) */ GLubyte Normalized:1; /**< GL_ARB_vertex_program */ GLubyte Integer:1; /**< Integer-valued? */ diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index bea3e8945ab..7ef0de7734a 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -254,6 +254,259 @@ vertex_binding_divisor(struct gl_context *ctx, } } +/* vertex_formats[gltype - GL_BYTE][integer*2 + normalized][size - 1] */ +static const uint16_t vertex_formats[][4][4] = { + { /* GL_BYTE */ + { + PIPE_FORMAT_R8_SSCALED, + PIPE_FORMAT_R8G8_SSCALED, + PIPE_FORMAT_R8G8B8_SSCALED, + PIPE_FORMAT_R8G8B8A8_SSCALED + }, + { + PIPE_FORMAT_R8_SNORM, + PIPE_FORMAT_R8G8_SNORM, + PIPE_FORMAT_R8G8B8_SNORM, + PIPE_FORMAT_R8G8B8A8_SNORM + }, + { + PIPE_FORMAT_R8_SINT, + PIPE_FORMAT_R8G8_SINT, + PIPE_FORMAT_R8G8B8_SINT, + PIPE_FORMAT_R8G8B8A8_SINT + }, + }, + { /* GL_UNSIGNED_BYTE */ + { + PIPE_FORMAT_R8_USCALED, + PIPE_FORMAT_R8G8_USCALED, + PIPE_FORMAT_R8G8B8_USCALED, + PIPE_FORMAT_R8G8B8A8_USCALED + }, + { + PIPE_FORMAT_R8_UNORM, + PIPE_FORMAT_R8G8_UNORM, + PIPE_FORMAT_R8G8B8_UNORM, + PIPE_FORMAT_R8G8B8A8_UNORM + }, + { + PIPE_FORMAT_R8_UINT, + PIPE_FORMAT_R8G8_UINT, + PIPE_FORMAT_R8G8B8_UINT, + PIPE_FORMAT_R8G8B8A8_UINT + }, + }, + { /* GL_SHORT */ + { + PIPE_FORMAT_R16_SSCALED, + PIPE_FORMAT_R16G16_SSCALED, + PIPE_FORMAT_R16G16B16_SSCALED, + PIPE_FORMAT_R16G16B16A16_SSCALED + }, + { + PIPE_FORMAT_R16_SNORM, + PIPE_FORMAT_R16G16_SNORM, + PIPE_FORMAT_R16G16B16_SNORM, + PIPE_FORMAT_R16G16B16A16_SNORM + }, + { + PIPE_FORMAT_R16_SINT, + PIPE_FORMAT_R16G16_SINT, + PIPE_FORMAT_R16G16B16_SINT, + PIPE_FORMAT_R16G16B16A16_SINT + }, + }, + { /* GL_UNSIGNED_SHORT */ + { + PIPE_FORMAT_R16_USCALED, + PIPE_FORMAT_R16G16_USCALED, + PIPE_FORMAT_R16G16B16_USCALED, + PIPE_FORMAT_R16G16B16A16_USCALED + }, + { + PIPE_FORMAT_R16_UNORM, + PIPE_FORMAT_R16G16_UNORM, + PIPE_FORMAT_R16G16B16_UNORM, + PIPE_FORMAT_R16G16B16A16_UNORM + }, + { + PIPE_FORMAT_R16_UINT, + PIPE_FORMAT_R16G16_UINT, + PIPE_FORMAT_R16G16B16_UINT, + PIPE_FORMAT_R16G16B16A16_UINT + }, + }, + { /* GL_INT */ + { + PIPE_FORMAT_R32_SSCALED, + PIPE_FORMAT_R32G32_SSCALED, + PIPE_FORMAT_R32G32B32_SSCALED, + PIPE_FORMAT_R32G32B32A32_SSCALED + }, + { + PIPE_FORMAT_R32_SNORM, + PIPE_FORMAT_R32G32_SNORM, + PIPE_FORMAT_R32G32B32_SNORM, + PIPE_FORMAT_R32G32B32A32_SNORM + }, + { + PIPE_FORMAT_R32_SINT, + PIPE_FORMAT_R32G32_SINT, + PIPE_FORMAT_R32G32B32_SINT, + PIPE_FORMAT_R32G32B32A32_SINT + }, + }, + { /* GL_UNSIGNED_INT */ + { + PIPE_FORMAT_R32_USCALED, + PIPE_FORMAT_R32G32_USCALED, + PIPE_FORMAT_R32G32B32_USCALED, + PIPE_FORMAT_R32G32B32A32_USCALED + }, + { + PIPE_FORMAT_R32_UNORM, + PIPE_FORMAT_R32G32_UNORM, + PIPE_FORMAT_R32G32B32_UNORM, + PIPE_FORMAT_R32G32B32A32_UNORM + }, + { + PIPE_FORMAT_R32_UINT, + PIPE_FORMAT_R32G32_UINT, + PIPE_FORMAT_R32G32B32_UINT, + PIPE_FORMAT_R32G32B32A32_UINT + }, + }, + { /* GL_FLOAT */ + { + PIPE_FORMAT_R32_FLOAT, + PIPE_FORMAT_R32G32_FLOAT, + PIPE_FORMAT_R32G32B32_FLOAT, + PIPE_FORMAT_R32G32B32A32_FLOAT + }, + { + PIPE_FORMAT_R32_FLOAT, + PIPE_FORMAT_R32G32_FLOAT, + PIPE_FORMAT_R32G32B32_FLOAT, + PIPE_FORMAT_R32G32B32A32_FLOAT + }, + }, + {{0}}, /* GL_2_BYTES */ + {{0}}, /* GL_3_BYTES */ + {{0}}, /* GL_4_BYTES */ + { /* GL_DOUBLE */ + { + PIPE_FORMAT_R64_FLOAT, + PIPE_FORMAT_R64G64_FLOAT, + PIPE_FORMAT_R64G64B64_FLOAT, + PIPE_FORMAT_R64G64B64A64_FLOAT + }, + { + PIPE_FORMAT_R64_FLOAT, + PIPE_FORMAT_R64G64_FLOAT, + PIPE_FORMAT_R64G64B64_FLOAT, + PIPE_FORMAT_R64G64B64A64_FLOAT + }, + }, + { /* GL_HALF_FLOAT */ + { + PIPE_FORMAT_R16_FLOAT, + PIPE_FORMAT_R16G16_FLOAT, + PIPE_FORMAT_R16G16B16_FLOAT, + PIPE_FORMAT_R16G16B16A16_FLOAT + }, + { + PIPE_FORMAT_R16_FLOAT, + PIPE_FORMAT_R16G16_FLOAT, + PIPE_FORMAT_R16G16B16_FLOAT, + PIPE_FORMAT_R16G16B16A16_FLOAT + }, + }, + { /* GL_FIXED */ + { + PIPE_FORMAT_R32_FIXED, + PIPE_FORMAT_R32G32_FIXED, + PIPE_FORMAT_R32G32B32_FIXED, + PIPE_FORMAT_R32G32B32A32_FIXED + }, + { + PIPE_FORMAT_R32_FIXED, + PIPE_FORMAT_R32G32_FIXED, + PIPE_FORMAT_R32G32B32_FIXED, + PIPE_FORMAT_R32G32B32A32_FIXED + }, + }, +}; + +/** + * Return a PIPE_FORMAT_x for the given GL datatype and size. + */ +static enum pipe_format +vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format, + GLboolean normalized, GLboolean integer, + GLboolean doubles) +{ + assert(size >= 1 && size <= 4); + assert(format == GL_RGBA || format == GL_BGRA); + + /* 64-bit attributes are translated by drivers. */ + if (doubles) + return PIPE_FORMAT_NONE; + + switch (type) { + case GL_HALF_FLOAT_OES: + type = GL_HALF_FLOAT; + break; + + case GL_INT_2_10_10_10_REV: + assert(size == 4 && !integer); + + if (format == GL_BGRA) { + if (normalized) + return PIPE_FORMAT_B10G10R10A2_SNORM; + else + return PIPE_FORMAT_B10G10R10A2_SSCALED; + } else { + if (normalized) + return PIPE_FORMAT_R10G10B10A2_SNORM; + else + return PIPE_FORMAT_R10G10B10A2_SSCALED; + } + break; + + case GL_UNSIGNED_INT_2_10_10_10_REV: + assert(size == 4 && !integer); + + if (format == GL_BGRA) { + if (normalized) + return PIPE_FORMAT_B10G10R10A2_UNORM; + else + return PIPE_FORMAT_B10G10R10A2_USCALED; + } else { + if (normalized) + return PIPE_FORMAT_R10G10B10A2_UNORM; + else + return PIPE_FORMAT_R10G10B10A2_USCALED; + } + break; + + case GL_UNSIGNED_INT_10F_11F_11F_REV: + assert(size == 3 && !integer && format == GL_RGBA); + return PIPE_FORMAT_R11G11B10_FLOAT; + + case GL_UNSIGNED_BYTE: + if (format == GL_BGRA) { + /* this is an odd-ball case */ + assert(normalized); + return PIPE_FORMAT_B8G8R8A8_UNORM; + } + break; + } + + unsigned index = integer*2 + normalized; + assert(index <= 2); + assert(type >= GL_BYTE && type <= GL_FIXED); + return vertex_formats[type - GL_BYTE][index][size-1]; +} void _mesa_set_vertex_format(struct gl_vertex_format *vertex_format, @@ -270,6 +523,9 @@ _mesa_set_vertex_format(struct gl_vertex_format *vertex_format, vertex_format->Doubles = doubles; vertex_format->_ElementSize = _mesa_bytes_per_vertex_attrib(size, type); assert(vertex_format->_ElementSize <= 4*sizeof(double)); + vertex_format->_PipeFormat = + vertex_format_to_pipe_format(size, type, format, normalized, integer, + doubles); } diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c index 5c258ed9956..be1729311e2 100644 --- a/src/mesa/state_tracker/st_atom_array.c +++ b/src/mesa/state_tracker/st_atom_array.c @@ -50,263 +50,6 @@ #include "main/varray.h" #include "main/arrayobj.h" -/* vertex_formats[gltype - GL_BYTE][integer*2 + normalized][size - 1] */ -static const uint16_t vertex_formats[][4][4] = { - { /* GL_BYTE */ - { - PIPE_FORMAT_R8_SSCALED, - PIPE_FORMAT_R8G8_SSCALED, - PIPE_FORMAT_R8G8B8_SSCALED, - PIPE_FORMAT_R8G8B8A8_SSCALED - }, - { - PIPE_FORMAT_R8_SNORM, - PIPE_FORMAT_R8G8_SNORM, - PIPE_FORMAT_R8G8B8_SNORM, - PIPE_FORMAT_R8G8B8A8_SNORM - }, - { - PIPE_FORMAT_R8_SINT, - PIPE_FORMAT_R8G8_SINT, - PIPE_FORMAT_R8G8B8_SINT, - PIPE_FORMAT_R8G8B8A8_SINT - }, - }, - { /* GL_UNSIGNED_BYTE */ - { - PIPE_FORMAT_R8_USCALED, - PIPE_FORMAT_R8G8_USCALED, - PIPE_FORMAT_R8G8B8_USCALED, - PIPE_FORMAT_R8G8B8A8_USCALED - }, - { - PIPE_FORMAT_R8_UNORM, - PIPE_FORMAT_R8G8_UNORM, - PIPE_FORMAT_R8G8B8_UNORM, - PIPE_FORMAT_R8G8B8A8_UNORM - }, - { - PIPE_FORMAT_R8_UINT, - PIPE_FORMAT_R8G8_UINT, - PIPE_FORMAT_R8G8B8_UINT, - PIPE_FORMAT_R8G8B8A8_UINT - }, - }, - { /* GL_SHORT */ - { - PIPE_FORMAT_R16_SSCALED, - PIPE_FORMAT_R16G16_SSCALED, - PIPE_FORMAT_R16G16B16_SSCALED, - PIPE_FORMAT_R16G16B16A16_SSCALED - }, - { - PIPE_FORMAT_R16_SNORM, - PIPE_FORMAT_R16G16_SNORM, - PIPE_FORMAT_R16G16B16_SNORM, - PIPE_FORMAT_R16G16B16A16_SNORM - }, - { - PIPE_FORMAT_R16_SINT, - PIPE_FORMAT_R16G16_SINT, - PIPE_FORMAT_R16G16B16_SINT, - PIPE_FORMAT_R16G16B16A16_SINT - }, - }, - { /* GL_UNSIGNED_SHORT */ - { - PIPE_FORMAT_R16_USCALED, - PIPE_FORMAT_R16G16_USCALED, - PIPE_FORMAT_R16G16B16_USCALED, - PIPE_FORMAT_R16G16B16A16_USCALED - }, - { - PIPE_FORMAT_R16_UNORM, - PIPE_FORMAT_R16G16_UNORM, - PIPE_FORMAT_R16G16B16_UNORM, - PIPE_FORMAT_R16G16B16A16_UNORM - }, - { - PIPE_FORMAT_R16_UINT, - PIPE_FORMAT_R16G16_UINT, - PIPE_FORMAT_R16G16B16_UINT, - PIPE_FORMAT_R16G16B16A16_UINT - }, - }, - { /* GL_INT */ - { - PIPE_FORMAT_R32_SSCALED, - PIPE_FORMAT_R32G32_SSCALED, - PIPE_FORMAT_R32G32B32_SSCALED, - PIPE_FORMAT_R32G32B32A32_SSCALED - }, - { - PIPE_FORMAT_R32_SNORM, - PIPE_FORMAT_R32G32_SNORM, - PIPE_FORMAT_R32G32B32_SNORM, - PIPE_FORMAT_R32G32B32A32_SNORM - }, - { - PIPE_FORMAT_R32_SINT, - PIPE_FORMAT_R32G32_SINT, - PIPE_FORMAT_R32G32B32_SINT, - PIPE_FORMAT_R32G32B32A32_SINT - }, - }, - { /* GL_UNSIGNED_INT */ - { - PIPE_FORMAT_R32_USCALED, - PIPE_FORMAT_R32G32_USCALED, - PIPE_FORMAT_R32G32B32_USCALED, - PIPE_FORMAT_R32G32B32A32_USCALED - }, - { - PIPE_FORMAT_R32_UNORM, - PIPE_FORMAT_R32G32_UNORM, - PIPE_FORMAT_R32G32B32_UNORM, - PIPE_FORMAT_R32G32B32A32_UNORM - }, - { - PIPE_FORMAT_R32_UINT, - PIPE_FORMAT_R32G32_UINT, - PIPE_FORMAT_R32G32B32_UINT, - PIPE_FORMAT_R32G32B32A32_UINT - }, - }, - { /* GL_FLOAT */ - { - PIPE_FORMAT_R32_FLOAT, - PIPE_FORMAT_R32G32_FLOAT, - PIPE_FORMAT_R32G32B32_FLOAT, - PIPE_FORMAT_R32G32B32A32_FLOAT - }, - { - PIPE_FORMAT_R32_FLOAT, - PIPE_FORMAT_R32G32_FLOAT, - PIPE_FORMAT_R32G32B32_FLOAT, - PIPE_FORMAT_R32G32B32A32_FLOAT - }, - }, - {{0}}, /* GL_2_BYTES */ - {{0}}, /* GL_3_BYTES */ - {{0}}, /* GL_4_BYTES */ - { /* GL_DOUBLE */ - { - PIPE_FORMAT_R64_FLOAT, - PIPE_FORMAT_R64G64_FLOAT, - PIPE_FORMAT_R64G64B64_FLOAT, - PIPE_FORMAT_R64G64B64A64_FLOAT - }, - { - PIPE_FORMAT_R64_FLOAT, - PIPE_FORMAT_R64G64_FLOAT, - PIPE_FORMAT_R64G64B64_FLOAT, - PIPE_FORMAT_R64G64B64A64_FLOAT - }, - }, - { /* GL_HALF_FLOAT */ - { - PIPE_FORMAT_R16_FLOAT, - PIPE_FORMAT_R16G16_FLOAT, - PIPE_FORMAT_R16G16B16_FLOAT, - PIPE_FORMAT_R16G16B16A16_FLOAT - }, - { - PIPE_FORMAT_R16_FLOAT, - PIPE_FORMAT_R16G16_FLOAT, - PIPE_FORMAT_R16G16B16_FLOAT, - PIPE_FORMAT_R16G16B16A16_FLOAT - }, - }, - { /* GL_FIXED */ - { - PIPE_FORMAT_R32_FIXED, - PIPE_FORMAT_R32G32_FIXED, - PIPE_FORMAT_R32G32B32_FIXED, - PIPE_FORMAT_R32G32B32A32_FIXED - }, - { - PIPE_FORMAT_R32_FIXED, - PIPE_FORMAT_R32G32_FIXED, - PIPE_FORMAT_R32G32B32_FIXED, - PIPE_FORMAT_R32G32B32A32_FIXED - }, - }, -}; - - -/** - * Return a PIPE_FORMAT_x for the given GL datatype and size. - */ -static enum pipe_format -st_pipe_vertex_format(const struct gl_vertex_format *vformat) -{ - const GLubyte size = vformat->Size; - const GLenum16 format = vformat->Format; - const bool normalized = vformat->Normalized; - const bool integer = vformat->Integer; - GLenum16 type = vformat->Type; - unsigned index; - - assert(size >= 1 && size <= 4); - assert(format == GL_RGBA || format == GL_BGRA); - assert(vformat->_ElementSize == _mesa_bytes_per_vertex_attrib(size, type)); - - switch (type) { - case GL_HALF_FLOAT_OES: - type = GL_HALF_FLOAT; - break; - - case GL_INT_2_10_10_10_REV: - assert(size == 4 && !integer); - - if (format == GL_BGRA) { - if (normalized) - return PIPE_FORMAT_B10G10R10A2_SNORM; - else - return PIPE_FORMAT_B10G10R10A2_SSCALED; - } else { - if (normalized) - return PIPE_FORMAT_R10G10B10A2_SNORM; - else - return PIPE_FORMAT_R10G10B10A2_SSCALED; - } - break; - - case GL_UNSIGNED_INT_2_10_10_10_REV: - assert(size == 4 && !integer); - - if (format == GL_BGRA) { - if (normalized) - return PIPE_FORMAT_B10G10R10A2_UNORM; - else - return PIPE_FORMAT_B10G10R10A2_USCALED; - } else { - if (normalized) - return PIPE_FORMAT_R10G10B10A2_UNORM; - else - return PIPE_FORMAT_R10G10B10A2_USCALED; - } - break; - - case GL_UNSIGNED_INT_10F_11F_11F_REV: - assert(size == 3 && !integer && format == GL_RGBA); - return PIPE_FORMAT_R11G11B10_FLOAT; - - case GL_UNSIGNED_BYTE: - if (format == GL_BGRA) { - /* this is an odd-ball case */ - assert(normalized); - return PIPE_FORMAT_B8G8R8A8_UNORM; - } - break; - } - - index = integer*2 + normalized; - assert(index <= 2); - assert(type >= GL_BYTE && type <= GL_FIXED); - return vertex_formats[type - GL_BYTE][index][size-1]; -} - static void init_velement(struct pipe_vertex_element *velement, int src_offset, int format, int instance_divisor, int vbo_index) @@ -357,10 +100,8 @@ static void init_velement_lowered(const struct st_vertex_program *vp, } } } else { - const unsigned format = st_pipe_vertex_format(vformat); - - init_velement(&velements[idx], src_offset, - format, instance_divisor, vbo_index); + init_velement(&velements[idx], src_offset, vformat->_PipeFormat, + instance_divisor, vbo_index); } } |