Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Mon, Aug 11, 2014 at 4:21 AM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > > v1 -> v2: > - add cases to util_format_srgb and util_format_linear > - remove special SRGBA case from util_format_fits_8unorm > > Not sure if I should rename the SRGBA one to not have a _UNORM ending... > > src/gallium/auxiliary/Makefile.sources | 1 + > src/gallium/auxiliary/util/u_format.c | 4 + > src/gallium/auxiliary/util/u_format.csv | 6 ++ > src/gallium/auxiliary/util/u_format.h | 12 ++- > src/gallium/auxiliary/util/u_format_bptc.c | 26 +++++++ > src/gallium/auxiliary/util/u_format_bptc.h | 109 > +++++++++++++++++++++++++++ > src/gallium/auxiliary/util/u_format_pack.py | 2 +- > src/gallium/auxiliary/util/u_format_table.py | 3 +- > src/gallium/include/pipe/p_format.h | 5 ++ > 9 files changed, 165 insertions(+), 3 deletions(-) > create mode 100644 src/gallium/auxiliary/util/u_format_bptc.c > create mode 100644 src/gallium/auxiliary/util/u_format_bptc.h > > diff --git a/src/gallium/auxiliary/Makefile.sources > b/src/gallium/auxiliary/Makefile.sources > index 3eae9e5..9bfaa0e 100644 > --- a/src/gallium/auxiliary/Makefile.sources > +++ b/src/gallium/auxiliary/Makefile.sources > @@ -113,6 +113,7 @@ C_SOURCES := \ > util/u_format_s3tc.c \ > util/u_format_rgtc.c \ > util/u_format_etc.c \ > + util/u_format_bptc.c \ > util/u_format_tests.c \ > util/u_format_yuv.c \ > util/u_format_zs.c \ > diff --git a/src/gallium/auxiliary/util/u_format.c > b/src/gallium/auxiliary/util/u_format.c > index a53ed6f..d53dd78 100644 > --- a/src/gallium/auxiliary/util/u_format.c > +++ b/src/gallium/auxiliary/util/u_format.c > @@ -496,6 +496,10 @@ util_format_fits_8unorm(const struct > util_format_description *format_desc) > format_desc->format == PIPE_FORMAT_LATC2_SNORM) > return FALSE; > return TRUE; > + case UTIL_FORMAT_LAYOUT_BPTC: > + if (format_desc->format == PIPE_FORMAT_BPTC_RGBA_UNORM) > + return TRUE; > + return FALSE; > > case UTIL_FORMAT_LAYOUT_PLAIN: > /* > diff --git a/src/gallium/auxiliary/util/u_format.csv > b/src/gallium/auxiliary/util/u_format.csv > index 8aa5c36..570ea5a 100644 > --- a/src/gallium/auxiliary/util/u_format.csv > +++ b/src/gallium/auxiliary/util/u_format.csv > @@ -160,6 +160,7 @@ PIPE_FORMAT_R8G8Bx_SNORM , other, 1, 1, > sn8 , sn8 , , , x > # - http://www.opengl.org/registry/specs/EXT/texture_compression_s3tc.txt > # - http://www.opengl.org/registry/specs/ARB/texture_compression_rgtc.txt > # - http://www.opengl.org/registry/specs/EXT/texture_compression_latc.txt > +# - http://www.opengl.org/registry/specs/ARB/texture_compression_bptc.txt > # - > http://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt > # - http://msdn.microsoft.com/en-us/library/bb694531.aspx > PIPE_FORMAT_DXT1_RGB , s3tc, 4, 4, x64 , , , , > xyz1, rgb > @@ -183,6 +184,11 @@ PIPE_FORMAT_LATC2_SNORM , rgtc, 4, 4, x128, > , , , xxxy, rg > > PIPE_FORMAT_ETC1_RGB8 , etc, 4, 4, x64, , , , > xyz1, rgb > > +PIPE_FORMAT_BPTC_RGBA_UNORM , bptc, 4, 4, x128, , , , > xyzw, rgb > +PIPE_FORMAT_BPTC_SRGBA_UNORM , bptc, 4, 4, x128, , , , > xyzw, srgb > +PIPE_FORMAT_BPTC_RGB_FLOAT , bptc, 4, 4, x128, , , , > xyz1, rgb > +PIPE_FORMAT_BPTC_RGB_UFLOAT , bptc, 4, 4, x128, , , , > xyz1, rgb > + > # Straightforward D3D10-like formats (also used for > # vertex buffer element description) > # > diff --git a/src/gallium/auxiliary/util/u_format.h > b/src/gallium/auxiliary/util/u_format.h > index 2e2bf02..93597ae 100644 > --- a/src/gallium/auxiliary/util/u_format.h > +++ b/src/gallium/auxiliary/util/u_format.h > @@ -79,9 +79,14 @@ enum util_format_layout { > UTIL_FORMAT_LAYOUT_ETC = 6, > > /** > + * BC6/7 Texture Compression > + */ > + UTIL_FORMAT_LAYOUT_BPTC = 7, > + > + /** > * Everything else that doesn't fit in any of the above layouts. > */ > - UTIL_FORMAT_LAYOUT_OTHER = 7 > + UTIL_FORMAT_LAYOUT_OTHER = 8 > }; > > > @@ -475,6 +480,7 @@ util_format_is_compressed(enum pipe_format format) > case UTIL_FORMAT_LAYOUT_S3TC: > case UTIL_FORMAT_LAYOUT_RGTC: > case UTIL_FORMAT_LAYOUT_ETC: > + case UTIL_FORMAT_LAYOUT_BPTC: > /* XXX add other formats in the future */ > return TRUE; > default: > @@ -911,6 +917,8 @@ util_format_srgb(enum pipe_format format) > return PIPE_FORMAT_DXT5_SRGBA; > case PIPE_FORMAT_B5G6R5_UNORM: > return PIPE_FORMAT_B5G6R5_SRGB; > + case PIPE_FORMAT_BPTC_RGBA_UNORM: > + return PIPE_FORMAT_BPTC_SRGBA_UNORM; > default: > return PIPE_FORMAT_NONE; > } > @@ -956,6 +964,8 @@ util_format_linear(enum pipe_format format) > return PIPE_FORMAT_DXT5_RGBA; > case PIPE_FORMAT_B5G6R5_SRGB: > return PIPE_FORMAT_B5G6R5_UNORM; > + case PIPE_FORMAT_BPTC_SRGBA_UNORM: > + return PIPE_FORMAT_BPTC_RGBA_UNORM; > default: > return format; > } > diff --git a/src/gallium/auxiliary/util/u_format_bptc.c > b/src/gallium/auxiliary/util/u_format_bptc.c > new file mode 100644 > index 0000000..8fb002f > --- /dev/null > +++ b/src/gallium/auxiliary/util/u_format_bptc.c > @@ -0,0 +1,26 @@ > +#include "u_format.h" > +#include "u_format_bptc.h" > + > +#define fake(format) \ > +void \ > +util_format_##format##_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, > unsigned i, unsigned j) {assert(0);} \ > +\ > +void \ > +util_format_##format##_unpack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height) {assert(0);} \ > +\ > +void \ > +util_format_##format##_pack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height) {assert(0);} \ > +\ > +void \ > +util_format_##format##_unpack_rgba_float(float *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height) {assert(0);} \ > +\ > +void \ > +util_format_##format##_pack_rgba_float(uint8_t *dst_row, unsigned > dst_stride, const float *src_row, unsigned src_stride, unsigned width, > unsigned height) {assert(0);} \ > +\ > +void \ > +util_format_##format##_fetch_rgba_float(float *dst, const uint8_t *src, > unsigned i, unsigned j) {assert(0);} > + > +fake(bptc_rgba_unorm) > +fake(bptc_srgba_unorm) > +fake(bptc_rgb_float) > +fake(bptc_rgb_ufloat) > diff --git a/src/gallium/auxiliary/util/u_format_bptc.h > b/src/gallium/auxiliary/util/u_format_bptc.h > new file mode 100644 > index 0000000..77bedfd > --- /dev/null > +++ b/src/gallium/auxiliary/util/u_format_bptc.h > @@ -0,0 +1,109 @@ > +/************************************************************************** > + * > + * Copyright 2011 Red Hat Inc. > + * All Rights Reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the > + * "Software"), to deal in the Software without restriction, including > + * without limitation the rights to use, copy, modify, merge, publish, > + * distribute, sub license, and/or sell copies of the Software, and to > + * permit persons to whom the Software is furnished to do so, subject to > + * the following conditions: > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL > + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY > CLAIM, > + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR > + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE > + * USE OR OTHER DEALINGS IN THE SOFTWARE. > + * > + * The above copyright notice and this permission notice (including the > + * next paragraph) shall be included in all copies or substantial portions > + * of the Software. > + * > + **************************************************************************/ > + > +#ifndef U_FORMAT_BPTC_H_ > +#define U_FORMAT_BPTC_H_ > + > +void > +util_format_bptc_rgba_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t > *src, unsigned i, unsigned j); > + > +void > +util_format_bptc_rgba_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgba_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgba_unorm_unpack_rgba_float(float *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgba_unorm_pack_rgba_float(uint8_t *dst_row, unsigned > dst_stride, const float *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgba_unorm_fetch_rgba_float(float *dst, const uint8_t *src, > unsigned i, unsigned j); > + > + > + > +void > +util_format_bptc_srgba_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t > *src, unsigned i, unsigned j); > + > +void > +util_format_bptc_srgba_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_srgba_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_srgba_unorm_unpack_rgba_float(float *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_srgba_unorm_pack_rgba_float(uint8_t *dst_row, unsigned > dst_stride, const float *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_srgba_unorm_fetch_rgba_float(float *dst, const uint8_t > *src, unsigned i, unsigned j); > + > + > + > +void > +util_format_bptc_rgb_float_fetch_rgba_8unorm(uint8_t *dst, const uint8_t > *src, unsigned i, unsigned j); > + > +void > +util_format_bptc_rgb_float_unpack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_float_pack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_float_unpack_rgba_float(float *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_float_pack_rgba_float(uint8_t *dst_row, unsigned > dst_stride, const float *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_float_fetch_rgba_float(float *dst, const uint8_t *src, > unsigned i, unsigned j); > + > + > +void > +util_format_bptc_rgb_ufloat_fetch_rgba_8unorm(uint8_t *dst, const uint8_t > *src, unsigned i, unsigned j); > + > +void > +util_format_bptc_rgb_ufloat_unpack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_ufloat_pack_rgba_8unorm(uint8_t *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_ufloat_unpack_rgba_float(float *dst_row, unsigned > dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_ufloat_pack_rgba_float(uint8_t *dst_row, unsigned > dst_stride, const float *src_row, unsigned src_stride, unsigned width, > unsigned height); > + > +void > +util_format_bptc_rgb_ufloat_fetch_rgba_float(float *dst, const uint8_t *src, > unsigned i, unsigned j); > + > + > +#endif > diff --git a/src/gallium/auxiliary/util/u_format_pack.py > b/src/gallium/auxiliary/util/u_format_pack.py > index a553e23..6ccf04c 100644 > --- a/src/gallium/auxiliary/util/u_format_pack.py > +++ b/src/gallium/auxiliary/util/u_format_pack.py > @@ -659,7 +659,7 @@ def generate_format_fetch(format, dst_channel, > dst_native_type, dst_suffix): > > > def is_format_hand_written(format): > - return format.layout in ('s3tc', 'rgtc', 'etc', 'subsampled', 'other') > or format.colorspace == ZS > + return format.layout in ('s3tc', 'rgtc', 'etc', 'bptc', 'subsampled', > 'other') or format.colorspace == ZS > > > def generate(formats): > diff --git a/src/gallium/auxiliary/util/u_format_table.py > b/src/gallium/auxiliary/util/u_format_table.py > index 81fd399..ad582e4 100755 > --- a/src/gallium/auxiliary/util/u_format_table.py > +++ b/src/gallium/auxiliary/util/u_format_table.py > @@ -90,6 +90,7 @@ def write_format_table(formats): > print '#include "u_format_rgtc.h"' > print '#include "u_format_latc.h"' > print '#include "u_format_etc.h"' > + print '#include "u_format_bptc.h"' > print > > u_format_pack.generate(formats) > @@ -141,7 +142,7 @@ def write_format_table(formats): > if format.colorspace != ZS and not format.is_pure_color(): > print " &util_format_%s_unpack_rgba_8unorm," % > format.short_name() > print " &util_format_%s_pack_rgba_8unorm," % > format.short_name() > - if format.layout == 's3tc' or format.layout == 'rgtc': > + if format.layout == 's3tc' or format.layout == 'rgtc' or > format.layout == 'bptc': > print " &util_format_%s_fetch_rgba_8unorm," % > format.short_name() > else: > print " NULL, /* fetch_rgba_8unorm */" > diff --git a/src/gallium/include/pipe/p_format.h > b/src/gallium/include/pipe/p_format.h > index a7fdcd0..a29b9d6 100644 > --- a/src/gallium/include/pipe/p_format.h > +++ b/src/gallium/include/pipe/p_format.h > @@ -344,6 +344,11 @@ enum pipe_format { > > PIPE_FORMAT_B5G6R5_SRGB = 254, > > + PIPE_FORMAT_BPTC_RGBA_UNORM = 255, > + PIPE_FORMAT_BPTC_SRGBA_UNORM = 256, > + PIPE_FORMAT_BPTC_RGB_FLOAT = 257, > + PIPE_FORMAT_BPTC_RGB_UFLOAT = 258, > + > PIPE_FORMAT_COUNT > }; > > -- > 1.8.5.5 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev