1 /*
2  * Copyright (C) 2011 LunarG, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 /**
25  * \file texcompress_etc.c
26  * GL_OES_compressed_ETC1_RGB8_texture support.
27  */
28 
29 
30 #include "mfeatures.h"
31 #include "texcompress.h"
32 #include "texcompress_etc.h"
33 #include "texstore.h"
34 #include "macros.h"
35 #include "swrast/s_context.h"
36 
37 GLboolean
_mesa_texstore_etc1_rgb8(TEXSTORE_PARAMS)38 _mesa_texstore_etc1_rgb8(TEXSTORE_PARAMS)
39 {
40    /* GL_ETC1_RGB8_OES is only valid in glCompressedTexImage2D */
41    ASSERT(0);
42 
43    return GL_FALSE;
44 }
45 
46 /* define etc1_parse_block and etc. */
47 #define UINT8_TYPE GLubyte
48 #define TAG(x) x
49 #include "texcompress_etc_tmp.h"
50 #undef TAG
51 #undef UINT8_TYPE
52 
53 void
_mesa_fetch_texel_2d_f_etc1_rgb8(const struct swrast_texture_image * texImage,GLint i,GLint j,GLint k,GLfloat * texel)54 _mesa_fetch_texel_2d_f_etc1_rgb8(const struct swrast_texture_image *texImage,
55                                  GLint i, GLint j, GLint k, GLfloat *texel)
56 {
57    struct etc1_block block;
58    GLubyte dst[3];
59    const GLubyte *src;
60 
61    src = (const GLubyte *) texImage->Map +
62       (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
63 
64    etc1_parse_block(&block, src);
65    etc1_fetch_texel(&block, i % 4, j % 4, dst);
66 
67    texel[RCOMP] = UBYTE_TO_FLOAT(dst[0]);
68    texel[GCOMP] = UBYTE_TO_FLOAT(dst[1]);
69    texel[BCOMP] = UBYTE_TO_FLOAT(dst[2]);
70    texel[ACOMP] = 1.0f;
71 }
72 
73 /**
74  * Decode texture data in format `MESA_FORMAT_ETC1_RGB8` to
75  * `MESA_FORMAT_ABGR8888`.
76  *
77  * The size of the source data must be a multiple of the ETC1 block size,
78  * which is 8, even if the texture image's dimensions are not aligned to 4.
79  * From the GL_OES_compressed_ETC1_RGB8_texture spec:
80  *   The texture is described as a number of 4x4 pixel blocks. If the
81  *   texture (or a particular mip-level) is smaller than 4 pixels in
82  *   any dimension (such as a 2x2 or a 8x1 texture), the texture is
83  *   found in the upper left part of the block(s), and the rest of the
84  *   pixels are not used. For instance, a texture of size 4x2 will be
85  *   placed in the upper half of a 4x4 block, and the lower half of the
86  *   pixels in the block will not be accessed.
87  *
88  * \param src_width in pixels
89  * \param src_height in pixels
90  * \param dst_stride in bytes
91  */
92 void
_mesa_etc1_unpack_rgba8888(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned src_width,unsigned src_height)93 _mesa_etc1_unpack_rgba8888(uint8_t *dst_row,
94                            unsigned dst_stride,
95                            const uint8_t *src_row,
96                            unsigned src_stride,
97                            unsigned src_width,
98                            unsigned src_height)
99 {
100    etc1_unpack_rgba8888(dst_row, dst_stride,
101                         src_row, src_stride,
102                         src_width, src_height);
103 }
104