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