151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu/*
251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * Copyright (C) 2011 LunarG, Inc.
351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu *
451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * copy of this software and associated documentation files (the "Software"),
651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * to deal in the Software without restriction, including without limitation
751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * Software is furnished to do so, subject to the following conditions:
1051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu *
1151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * The above copyright notice and this permission notice (including the next
1251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * paragraph) shall be included in all copies or substantial portions of the
1351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * Software.
1451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu *
1551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * DEALINGS IN THE SOFTWARE.
2251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu */
2351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
2451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu/**
2551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * \file texcompress_etc.c
2651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu * GL_OES_compressed_ETC1_RGB8_texture support.
2751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu */
2851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
2951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
3051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "mfeatures.h"
3151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "texcompress.h"
3251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "texcompress_etc.h"
3351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "texstore.h"
3451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "macros.h"
3551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "swrast/s_context.h"
3651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
3751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I WuGLboolean
3851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu_mesa_texstore_etc1_rgb8(TEXSTORE_PARAMS)
3951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu{
4051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   /* GL_ETC1_RGB8_OES is only valid in glCompressedTexImage2D */
4151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   ASSERT(0);
4251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
4351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   return GL_FALSE;
4451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu}
4551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
4651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu/* define etc1_parse_block and etc. */
4751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#define UINT8_TYPE GLubyte
4851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#define TAG(x) x
4951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#include "texcompress_etc_tmp.h"
5051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#undef TAG
5151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu#undef UINT8_TYPE
5251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
5351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wuvoid
5451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu_mesa_fetch_texel_2d_f_etc1_rgb8(const struct swrast_texture_image *texImage,
5551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu                                 GLint i, GLint j, GLint k, GLfloat *texel)
5651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu{
5751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   struct etc1_block block;
5851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   GLubyte dst[3];
5951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   const GLubyte *src;
6051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
61bd3c10c0f0c60ab3421c2da2eab814edc2296cb0Brian Paul   src = (const GLubyte *) texImage->Map +
6251f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
6351f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
6451f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   etc1_parse_block(&block, src);
6551f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   etc1_fetch_texel(&block, i % 4, j % 4, dst);
6651f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu
6751f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   texel[RCOMP] = UBYTE_TO_FLOAT(dst[0]);
6851f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   texel[GCOMP] = UBYTE_TO_FLOAT(dst[1]);
6951f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   texel[BCOMP] = UBYTE_TO_FLOAT(dst[2]);
7051f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu   texel[ACOMP] = 1.0f;
7151f4d2725417088c75d512b69a31a26ae5cb3ef2Chia-I Wu}
728ec721264c7ae0f73a520362963b2691bf098b9bChad Versace
738ec721264c7ae0f73a520362963b2691bf098b9bChad Versace/**
748ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * Decode texture data in format `MESA_FORMAT_ETC1_RGB8` to
758ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * `MESA_FORMAT_ABGR8888`.
768ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *
778ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * The size of the source data must be a multiple of the ETC1 block size,
788ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * which is 8, even if the texture image's dimensions are not aligned to 4.
798ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * From the GL_OES_compressed_ETC1_RGB8_texture spec:
808ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   The texture is described as a number of 4x4 pixel blocks. If the
818ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   texture (or a particular mip-level) is smaller than 4 pixels in
828ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   any dimension (such as a 2x2 or a 8x1 texture), the texture is
838ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   found in the upper left part of the block(s), and the rest of the
848ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   pixels are not used. For instance, a texture of size 4x2 will be
858ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   placed in the upper half of a 4x4 block, and the lower half of the
868ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *   pixels in the block will not be accessed.
878ec721264c7ae0f73a520362963b2691bf098b9bChad Versace *
888ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * \param src_width in pixels
898ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * \param src_height in pixels
908ec721264c7ae0f73a520362963b2691bf098b9bChad Versace * \param dst_stride in bytes
918ec721264c7ae0f73a520362963b2691bf098b9bChad Versace */
928ec721264c7ae0f73a520362963b2691bf098b9bChad Versacevoid
938ec721264c7ae0f73a520362963b2691bf098b9bChad Versace_mesa_etc1_unpack_rgba8888(uint8_t *dst_row,
948ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                           unsigned dst_stride,
958ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                           const uint8_t *src_row,
968ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                           unsigned src_stride,
978ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                           unsigned src_width,
988ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                           unsigned src_height)
998ec721264c7ae0f73a520362963b2691bf098b9bChad Versace{
1008ec721264c7ae0f73a520362963b2691bf098b9bChad Versace   etc1_unpack_rgba8888(dst_row, dst_stride,
1018ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                        src_row, src_stride,
1028ec721264c7ae0f73a520362963b2691bf098b9bChad Versace                        src_width, src_height);
1038ec721264c7ae0f73a520362963b2691bf098b9bChad Versace}
104