----- Original Message ----- > To match PIPE_FORMAT_R8G8B8A8_SRGB. > --- > src/mesa/main/format_pack.c | 27 +++++++++++++++++++++++++++ > src/mesa/main/format_unpack.c | 14 ++++++++++++++ > src/mesa/main/formats.c | 15 +++++++++++++++ > src/mesa/main/formats.h | 1 + > src/mesa/main/texstore.c | 3 +++ > src/mesa/swrast/s_texfetch.c | 6 ++++++ > src/mesa/swrast/s_texfetch_tmp.h | 13 +++++++++++++ > 7 files changed, 79 insertions(+) > > diff --git a/src/mesa/main/format_pack.c b/src/mesa/main/format_pack.c > index b870001..3c14d8f 100644 > --- a/src/mesa/main/format_pack.c > +++ b/src/mesa/main/format_pack.c > @@ -1108,6 +1108,31 @@ pack_float_SARGB8(const GLfloat src[4], void *dst) > } > > > +/* MESA_FORMAT_R8G8B8A8_SRGB */ > + > +static void > +pack_ubyte_SABGR8(const GLubyte src[4], void *dst) > +{ > + GLuint *d = ((GLuint *) dst); > + GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]); > + GLubyte g = linear_ubyte_to_srgb_ubyte(src[RCOMP]); > + GLubyte b = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
G/BCOMP here Otherwise looks good. Jose > + *d = PACK_COLOR_8888(src[ACOMP], b, g, r); > +} > + > +static void > +pack_float_SABGR8(const GLfloat src[4], void *dst) > +{ > + GLuint *d = ((GLuint *) dst); > + GLubyte r, g, b, a; > + r = linear_float_to_srgb_ubyte(src[RCOMP]); > + g = linear_float_to_srgb_ubyte(src[GCOMP]); > + b = linear_float_to_srgb_ubyte(src[BCOMP]); > + UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]); > + *d = PACK_COLOR_8888(a, b, g, r); > +} > + > + > /* MESA_FORMAT_L_SRGB8 */ > > static void > @@ -1961,6 +1986,7 @@ _mesa_get_pack_ubyte_rgba_function(mesa_format format) > table[MESA_FORMAT_BGR_SRGB8] = pack_ubyte_SRGB8; > table[MESA_FORMAT_A8B8G8R8_SRGB] = pack_ubyte_SRGBA8; > table[MESA_FORMAT_B8G8R8A8_SRGB] = pack_ubyte_SARGB8; > + table[MESA_FORMAT_R8G8B8A8_SRGB] = pack_ubyte_SABGR8; > table[MESA_FORMAT_L_SRGB8] = pack_ubyte_SL8; > table[MESA_FORMAT_L8A8_SRGB] = pack_ubyte_SLA8; > /* n/a */ > @@ -2125,6 +2151,7 @@ _mesa_get_pack_float_rgba_function(mesa_format format) > table[MESA_FORMAT_BGR_SRGB8] = pack_float_SRGB8; > table[MESA_FORMAT_A8B8G8R8_SRGB] = pack_float_SRGBA8; > table[MESA_FORMAT_B8G8R8A8_SRGB] = pack_float_SARGB8; > + table[MESA_FORMAT_R8G8B8A8_SRGB] = pack_float_SABGR8; > table[MESA_FORMAT_L_SRGB8] = pack_float_SL8; > table[MESA_FORMAT_L8A8_SRGB] = pack_float_SLA8; > > diff --git a/src/mesa/main/format_unpack.c b/src/mesa/main/format_unpack.c > index 1a0e727..2348ef6 100644 > --- a/src/mesa/main/format_unpack.c > +++ b/src/mesa/main/format_unpack.c > @@ -797,6 +797,19 @@ unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint > n) > } > > static void > +unpack_SABGR8(const void *src, GLfloat dst[][4], GLuint n) > +{ > + const GLuint *s = ((const GLuint *) src); > + GLuint i; > + for (i = 0; i < n; i++) { > + dst[i][RCOMP] = _mesa_nonlinear_to_linear( (s[i] ) & 0xff ); > + dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 8) & 0xff ); > + dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 16) & 0xff ); > + dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */ > + } > +} > + > +static void > unpack_SL8(const void *src, GLfloat dst[][4], GLuint n) > { > const GLubyte *s = ((const GLubyte *) src); > @@ -2388,6 +2401,7 @@ get_unpack_rgba_function(mesa_format format) > table[MESA_FORMAT_BGR_SRGB8] = unpack_SRGB8; > table[MESA_FORMAT_A8B8G8R8_SRGB] = unpack_SRGBA8; > table[MESA_FORMAT_B8G8R8A8_SRGB] = unpack_SARGB8; > + table[MESA_FORMAT_R8G8B8A8_SRGB] = unpack_SABGR8; > table[MESA_FORMAT_L_SRGB8] = unpack_SL8; > table[MESA_FORMAT_L8A8_SRGB] = unpack_SLA8; > table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1; > diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c > index e0b774e..0cf97fa 100644 > --- a/src/mesa/main/formats.c > +++ b/src/mesa/main/formats.c > @@ -520,6 +520,15 @@ static struct gl_format_info > format_info[MESA_FORMAT_COUNT] = > 1, 1, 4 > }, > { > + MESA_FORMAT_R8G8B8A8_SRGB, > + "MESA_FORMAT_R8G8B8A8_SRGB", > + GL_RGBA, > + GL_UNSIGNED_NORMALIZED, > + 8, 8, 8, 8, > + 0, 0, 0, 0, 0, > + 1, 1, 4 > + }, > + { > MESA_FORMAT_L_SRGB8, > "MESA_FORMAT_L_SRGB8", > GL_LUMINANCE, > @@ -2034,6 +2043,7 @@ _mesa_get_format_color_encoding(mesa_format format) > case MESA_FORMAT_BGR_SRGB8: > case MESA_FORMAT_A8B8G8R8_SRGB: > case MESA_FORMAT_B8G8R8A8_SRGB: > + case MESA_FORMAT_R8G8B8A8_SRGB: > case MESA_FORMAT_L_SRGB8: > case MESA_FORMAT_L8A8_SRGB: > case MESA_FORMAT_SRGB_DXT1: > @@ -2069,6 +2079,9 @@ _mesa_get_srgb_format_linear(mesa_format format) > case MESA_FORMAT_B8G8R8A8_SRGB: > format = MESA_FORMAT_B8G8R8A8_UNORM; > break; > + case MESA_FORMAT_R8G8B8A8_SRGB: > + format = MESA_FORMAT_R8G8B8A8_UNORM; > + break; > case MESA_FORMAT_L_SRGB8: > format = MESA_FORMAT_L_UNORM8; > break; > @@ -2576,6 +2589,7 @@ _mesa_format_to_type_and_comps(mesa_format format, > return; > case MESA_FORMAT_A8B8G8R8_SRGB: > case MESA_FORMAT_B8G8R8A8_SRGB: > + case MESA_FORMAT_R8G8B8A8_SRGB: > *datatype = GL_UNSIGNED_BYTE; > *comps = 4; > return; > @@ -2985,6 +2999,7 @@ _mesa_format_matches_format_and_type(mesa_format > mesa_format, > return GL_FALSE; > > case MESA_FORMAT_R8G8B8A8_UNORM: > + case MESA_FORMAT_R8G8B8A8_SRGB: > if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && > !swapBytes) > return GL_TRUE; > diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h > index 07b84d6..a12fe4f 100644 > --- a/src/mesa/main/formats.h > +++ b/src/mesa/main/formats.h > @@ -419,6 +419,7 @@ typedef enum > /* Type P formats */ > MESA_FORMAT_A8B8G8R8_SRGB, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA > */ > MESA_FORMAT_B8G8R8A8_SRGB, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB > */ > + MESA_FORMAT_R8G8B8A8_SRGB, /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR > */ > > /* Type A format(s) */ > MESA_FORMAT_L_SRGB8, /* uchar[i] = L */ > diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c > index edf7e81..557703d 100644 > --- a/src/mesa/main/texstore.c > +++ b/src/mesa/main/texstore.c > @@ -3294,6 +3294,9 @@ _mesa_texstore_sargb8(TEXSTORE_PARAMS) > case MESA_FORMAT_B8G8R8A8_SRGB: > newDstFormat = MESA_FORMAT_B8G8R8A8_UNORM; > break; > + case MESA_FORMAT_R8G8B8A8_SRGB: > + newDstFormat = MESA_FORMAT_R8G8B8A8_UNORM; > + break; > case MESA_FORMAT_B8G8R8X8_SRGB: > newDstFormat = MESA_FORMAT_B8G8R8X8_UNORM; > break; > diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c > index 9c173a8..8ba7534 100644 > --- a/src/mesa/swrast/s_texfetch.c > +++ b/src/mesa/swrast/s_texfetch.c > @@ -437,6 +437,12 @@ texfetch_funcs[] = > fetch_texel_3d_sargb8 > }, > { > + MESA_FORMAT_R8G8B8A8_SRGB, > + fetch_texel_1d_sabgr8, > + fetch_texel_2d_sabgr8, > + fetch_texel_3d_sabgr8 > + }, > + { > MESA_FORMAT_L_SRGB8, > fetch_texel_1d_sl8, > fetch_texel_2d_sl8, > diff --git a/src/mesa/swrast/s_texfetch_tmp.h > b/src/mesa/swrast/s_texfetch_tmp.h > index 1db3adc..8821125 100644 > --- a/src/mesa/swrast/s_texfetch_tmp.h > +++ b/src/mesa/swrast/s_texfetch_tmp.h > @@ -1015,6 +1015,19 @@ static void FETCH(sargb8)(const struct > swrast_texture_image *texImage, > > > > +/* Fetch texel from 1D, 2D or 3D sabgr8 texture, return 4 GLfloats */ > +static void FETCH(sabgr8)(const struct swrast_texture_image *texImage, > + GLint i, GLint j, GLint k, GLfloat *texel ) > +{ > + const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); > + texel[RCOMP] = nonlinear_to_linear( (s ) & 0xff ); > + texel[GCOMP] = nonlinear_to_linear( (s >> 8) & 0xff ); > + texel[BCOMP] = nonlinear_to_linear( (s >> 16) & 0xff ); > + texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */ > +} > + > + > + > /* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */ > static void FETCH(sl8)(const struct swrast_texture_image *texImage, > GLint i, GLint j, GLint k, GLfloat *texel ) > -- > 1.7.10.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=LrQViUM4hX%2B7j5YFe9quRbL6rMigtH8eC3u015ROmeA%3D%0A&s=b4bd58d3c1fea0d132366b127ce9ee8a162e9c96c735a22a487fcb9ea803922d > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev