From: Samuel Iglesias Gonsalvez <sigles...@igalia.com> This will be used to refactor code in pack.c and support conversion to/from these types in a master convert function that will be added later.
Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> --- src/mesa/main/format_pack.c.mako | 36 ++++++++++++- src/mesa/main/format_unpack.c.mako | 35 ++++++++++++- src/mesa/main/formats.c | 104 +++++++++++++++++++++++++++++++++++++ src/mesa/main/formats.csv | 13 +++++ src/mesa/main/formats.h | 15 ++++++ src/mesa/swrast/s_texfetch.c | 13 +++++ 6 files changed, 212 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/format_pack.c.mako b/src/mesa/main/format_pack.c.mako index b846702..c5ad623 100644 --- a/src/mesa/main/format_pack.c.mako +++ b/src/mesa/main/format_pack.c.mako @@ -68,7 +68,7 @@ for f in formats: /* ubyte packing functions */ %for f in rgb_formats: - %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT'): + %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT', 'MESA_FORMAT_A2R10G10B10_UNORM'): <% continue %> %elif f.is_compressed(): <% continue %> @@ -137,6 +137,22 @@ pack_ubyte_${f.short_name()}(const GLubyte src[4], void *dst) %endfor static inline void +pack_ubyte_a2r10g10b10_unorm(const GLubyte src[4], void *dst) +{ + uint8_t a = _mesa_unorm_to_unorm(src[3], 8, 2); + uint16_t r = _mesa_unorm_to_unorm(src[0], 8, 10); + uint16_t g = _mesa_unorm_to_unorm(src[1], 8, 10); + uint16_t b = _mesa_unorm_to_unorm(src[2], 8, 10); + + uint32_t d = 0; + d |= PACK(a, 0, 2); + d |= PACK(r, 2, 10); + d |= PACK(g, 12, 10); + d |= PACK(b, 22, 10); + (*(uint32_t *) dst) = d; +} + +static inline void pack_ubyte_r9g9b9e5_float(const GLubyte src[4], void *dst) { GLuint *d = (GLuint *) dst; @@ -311,7 +327,7 @@ pack_int_r11g11b10_float(const GLint src[4], void *dst) /* float packing functions */ %for f in rgb_formats: - %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT'): + %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT', 'MESA_FORMAT_A2R10G10B10_UNORM'): <% continue %> %elif f.is_compressed(): <% continue %> @@ -373,6 +389,22 @@ pack_float_${f.short_name()}(const GLfloat src[4], void *dst) %endfor static inline void +pack_float_a2r10g10b10_unorm(const GLfloat src[4], void *dst) +{ + uint8_t a = _mesa_float_to_unorm(src[3], 2); + uint16_t r = _mesa_float_to_unorm(src[0], 10); + uint16_t g = _mesa_float_to_unorm(src[1], 10); + uint16_t b = _mesa_float_to_unorm(src[2], 10); + + uint32_t d = 0; + d |= PACK(a, 0, 2); + d |= PACK(r, 2, 10); + d |= PACK(g, 12, 10); + d |= PACK(b, 22, 10); + (*(uint32_t *) dst) = d; +} + +static inline void pack_float_r9g9b9e5_float(const GLfloat src[4], void *dst) { GLuint *d = (GLuint *) dst; diff --git a/src/mesa/main/format_unpack.c.mako b/src/mesa/main/format_unpack.c.mako index 8fd3cdd..510aed2 100644 --- a/src/mesa/main/format_unpack.c.mako +++ b/src/mesa/main/format_unpack.c.mako @@ -67,7 +67,7 @@ for f in formats: /* float unpacking functions */ %for f in rgb_formats: - %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT'): + %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT', 'MESA_FORMAT_A2R10G10B10_UNORM'): <% continue %> %elif f.is_compressed(): <% continue %> @@ -128,6 +128,21 @@ unpack_float_${f.short_name()}(const void *void_src, GLfloat dst[4]) } %endfor +static inline void +unpack_float_a2r10g10b10_unorm(const void *void_src, GLfloat dst[4]) +{ + uint32_t *src = (uint32_t *) void_src; + uint8_t a = UNPACK(*src, 0, 2); + uint16_t r = UNPACK(*src, 2, 10); + uint16_t g = UNPACK(*src, 12, 10); + uint16_t b = UNPACK(*src, 22, 10); + + dst[0] = _mesa_unorm_to_float(r, 10); + dst[1] = _mesa_unorm_to_float(g, 10); + dst[2] = _mesa_unorm_to_float(b, 10); + dst[3] = _mesa_unorm_to_float(a, 2); +} + static void unpack_float_r9g9b9e5_float(const void *src, GLfloat dst[4]) { @@ -195,7 +210,9 @@ unpack_float_ycbcr_rev(const void *src, GLfloat dst[][4], GLuint n) /* ubyte packing functions */ %for f in rgb_formats: - %if not f.is_normalized(): + %if f.name in ('MESA_FORMAT_A2R10G10B10_UNORM'): + <% continue %> + %elif not f.is_normalized(): <% continue %> %endif @@ -254,6 +271,20 @@ unpack_ubyte_${f.short_name()}(const void *void_src, GLubyte dst[4]) } %endfor +static inline void +unpack_ubyte_a2r10g10b10_unorm(const void *void_src, GLubyte dst[4]) +{ + uint32_t *src = (uint32_t *) void_src; + uint8_t a = UNPACK(*src, 0, 2); + uint16_t r = UNPACK(*src, 2, 10); + uint16_t g = UNPACK(*src, 12, 10); + uint16_t b = UNPACK(*src, 22, 10); + + dst[0] = _mesa_unorm_to_unorm(r, 10, 8); + dst[1] = _mesa_unorm_to_unorm(g, 10, 8); + dst[2] = _mesa_unorm_to_unorm(b, 10, 8); + dst[3] = _mesa_unorm_to_unorm(a, 2, 8); +} /* integer packing functions */ diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index f14250b..06e8973 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -937,6 +937,50 @@ _mesa_format_to_type_and_comps(mesa_format format, *comps = 1; return; + case MESA_FORMAT_R3G3B2_UNORM: + *datatype = GL_UNSIGNED_BYTE_2_3_3_REV; + *comps = 3; + return; + case MESA_FORMAT_A4B4G4R4_UNORM: + *datatype = GL_UNSIGNED_SHORT_4_4_4_4; + *comps = 4; + return; + + case MESA_FORMAT_R4G4B4A4_UNORM: + *datatype = GL_UNSIGNED_SHORT_4_4_4_4; + *comps = 4; + return; + case MESA_FORMAT_R1G5B5A5_UNORM: + *datatype = GL_UNSIGNED_SHORT_5_5_5_1; + *comps = 4; + return; + case MESA_FORMAT_R5G5B5A1_UNORM: + *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; + *comps = 4; + return; + case MESA_FORMAT_A5B5G5R1_UNORM: + *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; + *comps = 4; + return; + case MESA_FORMAT_A2B10G10R10_UNORM: + case MESA_FORMAT_A2B10G10R10_UINT: + *datatype = GL_UNSIGNED_INT_10_10_10_2; + *comps = 4; + return; + case MESA_FORMAT_A2R10G10B10_UNORM: + case MESA_FORMAT_A2R10G10B10_UINT: + *datatype = GL_UNSIGNED_INT_10_10_10_2; + *comps = 4; + return; + case MESA_FORMAT_R2G10B10A10_UNORM: + *datatype = GL_UNSIGNED_INT_10_10_10_2; + *comps = 4; + return; + case MESA_FORMAT_A10B10G10R2_UNORM: + *datatype = GL_UNSIGNED_INT_2_10_10_10_REV; + *comps = 4; + return; + case MESA_FORMAT_B2G3R3_UNORM: *datatype = GL_UNSIGNED_BYTE_3_3_2; *comps = 3; @@ -1581,6 +1625,66 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format, case MESA_FORMAT_B2G3R3_UNORM: return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2; + case MESA_FORMAT_R3G3B2_UNORM: + return format == GL_RGB && type == GL_UNSIGNED_BYTE_2_3_3_REV; + + case MESA_FORMAT_A4B4G4R4_UNORM: + if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4 && !swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && !swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4 && swapBytes) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_R4G4B4A4_UNORM: + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4 && !swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && !swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4 && swapBytes) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_R1G5B5A5_UNORM: + return format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_5_5_5_1; + + case MESA_FORMAT_R5G5B5A1_UNORM: + return format == GL_RGBA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV; + + case MESA_FORMAT_A5B5G5R1_UNORM: + return format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_1_5_5_5_REV; + + case MESA_FORMAT_A2B10G10R10_UNORM: + return format == GL_RGBA && type == GL_UNSIGNED_INT_10_10_10_2; + + case MESA_FORMAT_A2B10G10R10_UINT: + return format == GL_RGBA_INTEGER_EXT && type == GL_UNSIGNED_INT_10_10_10_2; + + case MESA_FORMAT_A2R10G10B10_UNORM: + return format == GL_BGRA && type == GL_UNSIGNED_INT_10_10_10_2; + + case MESA_FORMAT_A2R10G10B10_UINT: + return format == GL_BGRA_INTEGER_EXT && type == GL_UNSIGNED_INT_10_10_10_2; + + case MESA_FORMAT_R2G10B10A10_UNORM: + return format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_10_10_10_2; + + case MESA_FORMAT_A10B10G10R2_UNORM: + return format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_2_10_10_10_REV; + case MESA_FORMAT_A_UNORM8: return format == GL_ALPHA && type == GL_UNSIGNED_BYTE; case MESA_FORMAT_A_UNORM16: diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv index 39bcdbd..6d68427 100644 --- a/src/mesa/main/formats.csv +++ b/src/mesa/main/formats.csv @@ -88,6 +88,17 @@ MESA_FORMAT_X8_UINT_Z24_UNORM , packed, 1, 1, un24, x8 , , MESA_FORMAT_Z24_UNORM_S8_UINT , packed, 1, 1, u8 , un24, , , yx__, zs MESA_FORMAT_Z24_UNORM_X8_UINT , packed, 1, 1, x8 , un24, , , y___, zs +MESA_FORMAT_R3G3B2_UNORM , packed, 1, 1, un3 , un3 , un2 , , xyz1, rgb +MESA_FORMAT_A4B4G4R4_UNORM , packed, 1, 1, un4 , un4 , un4 , un4 , wzyx, rgb +MESA_FORMAT_R4G4B4A4_UNORM , packed, 1, 1, un4 , un4 , un4 , un4 , xyzw, rgb +MESA_FORMAT_R1G5B5A5_UNORM , packed, 1, 1, un1 , un5 , un5 , un5 , xyzw, rgb +MESA_FORMAT_R5G5B5A1_UNORM , packed, 1, 1, un5 , un5 , un5 , un1 , xyzw, rgb +MESA_FORMAT_A5B5G5R1_UNORM , packed, 1, 1, un5 , un5 , un5 , un1 , wzyx, rgb +MESA_FORMAT_A2B10G10R10_UNORM , packed, 1, 1, un2 , un10, un10, un10, wzyx, rgb +MESA_FORMAT_A2R10G10B10_UNORM , packed, 1, 1, un2 , un10, un10, un10, wxyz, rgb +MESA_FORMAT_R2G10B10A10_UNORM , packed, 1, 1, un2 , un10, un10, un10, xyzw, rgb +MESA_FORMAT_A10B10G10R2_UNORM , packed, 1, 1, un10, un10, un10, un2 , wzyx, rgb + MESA_FORMAT_YCBCR , other , 1, 1, x16 , , , , xyzw, yuv MESA_FORMAT_YCBCR_REV , other , 1, 1, x16 , , , , xyzw, yuv @@ -180,6 +191,8 @@ MESA_FORMAT_Z_FLOAT32 , array , 1, 1, f32 , , , # Packed signed/unsigned non-normalized integer formats MESA_FORMAT_B10G10R10A2_UINT , packed, 1, 1, u10 , u10 , u10 , u2 , zyxw, rgb MESA_FORMAT_R10G10B10A2_UINT , packed, 1, 1, u10 , u10 , u10 , u2 , xyzw, rgb +MESA_FORMAT_A2B10G10R10_UINT , packed, 1, 1, u2 , u10 , u10 , u10 , wzyx, rgb +MESA_FORMAT_A2R10G10B10_UINT , packed, 1, 1, u2 , u10 , u10 , u10 , yzwx, rgb # Array signed/unsigned non-normalized integer formats MESA_FORMAT_A_UINT8 , array , 1, 1, u8 , , , , 000x, rgb diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h index 7ddf4ee..bba5bae 100644 --- a/src/mesa/main/formats.h +++ b/src/mesa/main/formats.h @@ -281,6 +281,19 @@ typedef enum MESA_FORMAT_Z24_UNORM_S8_UINT,/* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_Z24_UNORM_X8_UINT,/* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ + /* Other formats */ + MESA_FORMAT_R3G3B2_UNORM, /* BBGG GRRR */ + MESA_FORMAT_A4B4G4R4_UNORM, /* RRRR GGGG BBBB AAAA */ + MESA_FORMAT_R4G4B4A4_UNORM, /* AAAA BBBB GGGG RRRR */ + MESA_FORMAT_R1G5B5A5_UNORM, /* AAAA ABBB BBGG GGGR */ + MESA_FORMAT_R5G5B5A1_UNORM, /* ABBB BBGG GGGR RRRR */ + MESA_FORMAT_A5B5G5R1_UNORM, /* RGGG GGBB BBBA AAAA */ + MESA_FORMAT_A2B10G10R10_UNORM,/* RRRR RRRR RRGG GGGG GGGG BBBB BBBB BBAA */ + MESA_FORMAT_A2R10G10B10_UNORM,/* BBBB BBBB BBGG GGGG GGGG RRRR RRRR RRAA */ + MESA_FORMAT_R2G10B10A10_UNORM,/* AAAA AAAA AABB BBBB BBBB GGGG GGGG GGRR */ + MESA_FORMAT_A10B10G10R2_UNORM,/* RRGG GGGG GGGG BBBB BBBB BBAA AAAA AAAA */ + + MESA_FORMAT_YCBCR, /* YYYY YYYY UorV UorV */ MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */ @@ -375,6 +388,8 @@ typedef enum /* Packed signed/unsigned non-normalized integer formats */ MESA_FORMAT_B10G10R10A2_UINT, /* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */ MESA_FORMAT_R10G10B10A2_UINT, /* AABB BBBB BBBB GGGG GGGG GGRR RRRR RRRR */ + MESA_FORMAT_A2B10G10R10_UINT, /* RRRR RRRR RRGG GGGG GGGG BBBB BBBB BBAA */ + MESA_FORMAT_A2R10G10B10_UINT, /* BBBB BBBB BBGG GGGG GGGG RRRR RRRR RRAA */ /* Array signed/unsigned non-normalized integer formats */ MESA_FORMAT_A_UINT8, diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c index 0f6da91..e9bb5eb 100644 --- a/src/mesa/swrast/s_texfetch.c +++ b/src/mesa/swrast/s_texfetch.c @@ -180,6 +180,17 @@ texfetch_funcs[] = fetch_texel_2d_Z24_UNORM_S8_UINT, fetch_texel_3d_Z24_UNORM_S8_UINT }, + FETCH_NULL(R3G3B2_UNORM), + FETCH_NULL(A4B4G4R4_UNORM), + FETCH_NULL(R4G4B4A4_UNORM), + FETCH_NULL(R1G5B5A5_UNORM), + FETCH_NULL(R5G5B5A1_UNORM), + FETCH_NULL(A5B5G5R1_UNORM), + FETCH_NULL(A2B10G10R10_UNORM), + FETCH_NULL(A2R10G10B10_UNORM), + FETCH_NULL(R2G10B10A10_UNORM), + FETCH_NULL(A10B10G10R2_UNORM), + FETCH_FUNCS(YCBCR), FETCH_FUNCS(YCBCR_REV), @@ -276,6 +287,8 @@ texfetch_funcs[] = /* Packed signed/unsigned non-normalized integer formats */ FETCH_NULL(B10G10R10A2_UINT), FETCH_NULL(R10G10B10A2_UINT), + FETCH_NULL(A2B10G10R10_UINT), + FETCH_NULL(A2R10G10B10_UINT), /* Array signed/unsigned non-normalized integer formats */ FETCH_NULL(A_UINT8), -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev