From 1b4278117a58625d20fdedfb1787d0979fae7b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 7 Nov 2022 19:33:32 -0500 Subject: [PATCH] mesa: add more cases to the gallium vertex_formats table The way we convert gltype to the index changed to handle more enums. The reason why (gltype & 0x3f) works is because of how the enums are defined. Also change the type to uint8_t. We only need the low 7 bits of the pipe format enum. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/mesa/main/varray.c | 133 ++++++++++++++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 22 deletions(-) diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 2fa12a9e9bd..8ea0c41bf67 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -289,8 +289,8 @@ 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] = { +/* vertex_formats[gltype & 0x3f][integer*2 + normalized][size - 1] */ +static const uint8_t vertex_formats[][4][4] = { { /* GL_BYTE */ { PIPE_FORMAT_R8_SSCALED, @@ -470,6 +470,105 @@ static const uint16_t vertex_formats[][4][4] = { PIPE_FORMAT_R32G32B32A32_FIXED }, }, + {{0}}, /* unused (13) */ + {{0}}, /* unused (14) */ + {{0}}, /* unused (15) */ + {{0}}, /* unused (16) */ + {{0}}, /* unused (17) */ + {{0}}, /* unused (18) */ + {{0}}, /* unused (19) */ + {{0}}, /* unused (20) */ + {{0}}, /* unused (21) */ + {{0}}, /* unused (22) */ + {{0}}, /* unused (23) */ + {{0}}, /* unused (24) */ + {{0}}, /* unused (25) */ + {{0}}, /* unused (26) */ + {{0}}, /* unused (27) */ + {{0}}, /* unused (28) */ + {{0}}, /* unused (29) */ + {{0}}, /* unused (30) */ + { /* GL_INT_2_10_10_10_REV */ + { + 0, + 0, + 0, + PIPE_FORMAT_R10G10B10A2_SSCALED + }, + { + 0, + 0, + 0, + PIPE_FORMAT_R10G10B10A2_SNORM + }, + }, + {{0}}, /* unused (32) */ + { /* GL_HALF_FLOAT_OES */ + { + 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 + }, + }, + {{0}}, /* unused (34) */ + {{0}}, /* unused (35) */ + {{0}}, /* unused (36) */ + {{0}}, /* unused (37) */ + {{0}}, /* unused (38) */ + {{0}}, /* unused (39) */ + { /* GL_UNSIGNED_INT_2_10_10_10_REV */ + { + 0, + 0, + 0, + PIPE_FORMAT_R10G10B10A2_USCALED + }, + { + 0, + 0, + 0, + PIPE_FORMAT_R10G10B10A2_UNORM + }, + }, + {{0}}, /* unused (41) */ + {{0}}, /* unused (42) */ + {{0}}, /* unused (43) */ + {{0}}, /* unused (44) */ + {{0}}, /* unused (45) */ + {{0}}, /* unused (46) */ + {{0}}, /* unused (47) */ + {{0}}, /* unused (48) */ + {{0}}, /* unused (49) */ + {{0}}, /* unused (50) */ + {{0}}, /* unused (51) */ + {{0}}, /* unused (52) */ + {{0}}, /* unused (53) */ + {{0}}, /* unused (54) */ + {{0}}, /* unused (55) */ + {{0}}, /* unused (56) */ + {{0}}, /* unused (57) */ + {{0}}, /* unused (58) */ + { /* GL_UNSIGNED_INT_10F_11F_11F_REV */ + { + 0, + 0, + PIPE_FORMAT_R11G11B10_FLOAT, + 0 + }, + { + 0, + 0, + PIPE_FORMAT_R11G11B10_FLOAT, + 0 + }, + }, }; /** @@ -487,10 +586,6 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format, return PIPE_FORMAT_R64_UINT + size - 1; switch (type) { - case GL_HALF_FLOAT_OES: - type = GL_HALF_FLOAT; - break; - case GL_INT_2_10_10_10_REV: assert(size == 4 && !integer); @@ -499,11 +594,6 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format, 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; @@ -515,18 +605,9 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format, 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 */ @@ -538,8 +619,16 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format, unsigned index = integer*2 + normalized; assert(index <= 2); - assert(type >= GL_BYTE && type <= GL_FIXED); - return vertex_formats[type - GL_BYTE][index][size-1]; + assert((type >= GL_BYTE && type <= GL_FIXED) || + type == GL_HALF_FLOAT_OES || + type == GL_INT_2_10_10_10_REV || + type == GL_UNSIGNED_INT_2_10_10_10_REV || + type == GL_UNSIGNED_INT_10F_11F_11F_REV); + + enum pipe_format pipe_format = + vertex_formats[type & 0x3f][index][size-1]; + assert(pipe_format); + return pipe_format; } void