15c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#include "pipe/p_compiler.h"
25c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#include "util/u_debug.h"
35c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#include "util/u_math.h"
45c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#include "u_format_etc.h"
55c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
65c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu/* define etc1_parse_block and etc. */
75c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#define UINT8_TYPE uint8_t
85c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#define TAG(x) x
95c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#include "../../../mesa/main/texcompress_etc_tmp.h"
105c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#undef TAG
115c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu#undef UINT8_TYPE
125c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
135c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuvoid
145c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuutil_format_etc1_rgb8_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
155c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu{
16d7458e401e97aea882309855cc72730aa3b39920Chad Versace   etc1_unpack_rgba8888(dst_row, dst_stride, src_row, src_stride, width, height);
175c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu}
185c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
195c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuvoid
205c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuutil_format_etc1_rgb8_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
215c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu{
225c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   assert(0);
235c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu}
245c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
255c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuvoid
265c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuutil_format_etc1_rgb8_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
275c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu{
285c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
295c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   struct etc1_block block;
305c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   unsigned x, y, i, j;
315c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
325c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   for (y = 0; y < height; y += bh) {
335c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu      const uint8_t *src = src_row;
345c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
355c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu      for (x = 0; x < width; x+= bw) {
365c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu         etc1_parse_block(&block, src);
375c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
385c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu         for (j = 0; j < bh; j++) {
395c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu            float *dst = dst_row + (y + j) * dst_stride / sizeof(*dst_row) + x * comps;
405c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu            uint8_t tmp[3];
415c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
425c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu            for (i = 0; i < bw; i++) {
435c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               etc1_fetch_texel(&block, i, j, tmp);
445c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               dst[0] = ubyte_to_float(tmp[0]);
455c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               dst[1] = ubyte_to_float(tmp[1]);
465c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               dst[2] = ubyte_to_float(tmp[2]);
475c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               dst[3] = 1.0f;
485c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu               dst += comps;
495c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu            }
505c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu         }
515c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
525c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu         src += bs;
535c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu      }
545c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
555c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu      src_row += src_stride;
565c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   }
575c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu}
585c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
595c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuvoid
605c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuutil_format_etc1_rgb8_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
615c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu{
625c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   assert(0);
635c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu}
645c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
655c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuvoid
665c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wuutil_format_etc1_rgb8_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
675c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu{
685c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   const unsigned bw = 4, bh = 4;
695c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   struct etc1_block block;
705c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   uint8_t tmp[3];
715c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
725c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   assert(i < bw && j < bh);
735c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
745c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   etc1_parse_block(&block, src);
755c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   etc1_fetch_texel(&block, i, j, tmp);
765c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
775c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   dst[0] = ubyte_to_float(tmp[0]);
785c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   dst[1] = ubyte_to_float(tmp[1]);
795c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   dst[2] = ubyte_to_float(tmp[2]);
805c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   dst[3] = 1.0f;
815c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu}
82