1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "u_format_etc.h"
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* define etc1_parse_block and etc. */
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UINT8_TYPE uint8_t
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../../mesa/main/texcompress_etc_tmp.h"
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef UINT8_TYPE
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_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)
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   etc1_unpack_rgba8888(dst_row, dst_stride, src_row, src_stride, width, height);
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_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)
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_etc1_rgb8_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct etc1_block block;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned x, y, i, j;
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (y = 0; y < height; y += bh) {
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const uint8_t *src = src_row;
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (x = 0; x < width; x+= bw) {
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         etc1_parse_block(&block, src);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (j = 0; j < bh; j++) {
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            float *dst = dst_row + (y + j) * dst_stride / sizeof(*dst_row) + x * comps;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            uint8_t tmp[3];
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < bw; i++) {
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               etc1_fetch_texel(&block, i, j, tmp);
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[0] = ubyte_to_float(tmp[0]);
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[1] = ubyte_to_float(tmp[1]);
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[2] = ubyte_to_float(tmp[2]);
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[3] = 1.0f;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst += comps;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += bs;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src_row += src_stride;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_etc1_rgb8_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_etc1_rgb8_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned bw = 4, bh = 4;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct etc1_block block;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t tmp[3];
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i < bw && j < bh);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   etc1_parse_block(&block, src);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   etc1_fetch_texel(&block, i, j, tmp);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst[0] = ubyte_to_float(tmp[0]);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst[1] = ubyte_to_float(tmp[1]);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst[2] = ubyte_to_float(tmp[2]);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst[3] = 1.0f;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
82