18f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/*
28f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * Mesa 3-D graphics library
3c9855a60f4b4b478bd036db8cefc06d1c7ff521dBrian * Version:  6.5.3
48f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul *
5c9855a60f4b4b478bd036db8cefc06d1c7ff521dBrian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
65bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger * Copyright (c) 2008 VMware, Inc.
78f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul *
88f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
98f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * copy of this software and associated documentation files (the "Software"),
108f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * to deal in the Software without restriction, including without limitation
118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
128f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
138f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * Software is furnished to do so, subject to the following conditions:
148f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul *
158f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * The above copyright notice and this permission notice shall be included
168f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * in all copies or substantial portions of the Software.
178f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul *
188f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
218f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
228f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
238f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
258f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
268f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
278f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/**
288f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * \file texcompress_s3tc.c
298f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul * GL_EXT_texture_compression_s3tc support.
308f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
318f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
32d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#ifndef USE_EXTERNAL_DXTN_LIB
33c573b9f94a532c07438d72694115182c6a12903aBrian Paul#define USE_EXTERNAL_DXTN_LIB 1
34d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#endif
358f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
368f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "glheader.h"
378f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "imports.h"
388f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "colormac.h"
39c573b9f94a532c07438d72694115182c6a12903aBrian Paul#include "dlopen.h"
408f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "image.h"
413fdd9fa556e9ba48244cb2b3966d3bfb0b84731bVinson Lee#include "macros.h"
42db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
430117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "texcompress.h"
457116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paul#include "texcompress_s3tc.h"
468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul#include "texstore.h"
47a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul#include "swrast/s_context.h"
488f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4959798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu
5059798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu#if FEATURE_texture_s3tc
5159798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu
5259798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu
5396548d80e541691281a947836b673177542fd400José Fonseca#if defined(_WIN32) || defined(WIN32)
549c3876d7d852d84bcf317e625210699dd39696ebBrian Paul#define DXTN_LIBNAME "dxtn.dll"
557e75f51b2791165dae6bd7eb1f6bab9bef40fb87Brian Paul#define RTLD_LAZY 0
567e75f51b2791165dae6bd7eb1f6bab9bef40fb87Brian Paul#define RTLD_GLOBAL 0
5776908ab9d46a46c08815162971395176dfc7780aDaniel Borca#elif defined(__DJGPP__)
589c3876d7d852d84bcf317e625210699dd39696ebBrian Paul#define DXTN_LIBNAME "dxtn.dxe"
5976908ab9d46a46c08815162971395176dfc7780aDaniel Borca#else
609c3876d7d852d84bcf317e625210699dd39696ebBrian Paul#define DXTN_LIBNAME "libtxc_dxtn.so"
61d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#endif
629c3876d7d852d84bcf317e625210699dd39696ebBrian Paul
635bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger#if FEATURE_EXT_texture_sRGB
645bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger/**
655bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger * Convert an 8-bit sRGB value from non-linear space to a
665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger * linear RGB value in [0, 1].
675bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger * Implemented with a 256-entry lookup table.
685bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger */
699520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLfloat
705bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheideggernonlinear_to_linear(GLubyte cs8)
715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   static GLfloat table[256];
735bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   static GLboolean tableReady = GL_FALSE;
745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   if (!tableReady) {
755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger      /* compute lookup table now */
765bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger      GLuint i;
775bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger      for (i = 0; i < 256; i++) {
785bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger         const GLfloat cs = UBYTE_TO_FLOAT(i);
795bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger         if (cs <= 0.04045) {
805bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger            table[i] = cs / 12.92f;
815bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger         }
825bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger         else {
83fef303bc94f2fb15a068563ac8abfb1765bde035Eric Anholt            table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
845bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger         }
855bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger      }
865bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger      tableReady = GL_TRUE;
875bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   }
885bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return table[cs8];
895bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
905bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger#endif /* FEATURE_EXT_texture_sRGB */
91d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
92d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholttypedef void (*dxtFetchTexelFuncExt)( GLint srcRowstride, GLubyte *pixdata, GLint col, GLint row, GLvoid *texelOut );
939c3876d7d852d84bcf317e625210699dd39696ebBrian Paul
9476908ab9d46a46c08815162971395176dfc7780aDaniel BorcadxtFetchTexelFuncExt fetch_ext_rgb_dxt1 = NULL;
9576908ab9d46a46c08815162971395176dfc7780aDaniel BorcadxtFetchTexelFuncExt fetch_ext_rgba_dxt1 = NULL;
9676908ab9d46a46c08815162971395176dfc7780aDaniel BorcadxtFetchTexelFuncExt fetch_ext_rgba_dxt3 = NULL;
9776908ab9d46a46c08815162971395176dfc7780aDaniel BorcadxtFetchTexelFuncExt fetch_ext_rgba_dxt5 = NULL;
98d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
99f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paultypedef void (*dxtCompressTexFuncExt)(GLint srccomps, GLint width,
100ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul                                      GLint height, const GLubyte *srcPixData,
101f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paul                                      GLenum destformat, GLubyte *dest,
102f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paul                                      GLint dstRowStride);
1039c3876d7d852d84bcf317e625210699dd39696ebBrian Paul
104f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paulstatic dxtCompressTexFuncExt ext_tx_compress_dxtn = NULL;
105f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paul
106f15b499cfd575ad8ace74d6b9047ecb1266bf7efBrian Paulstatic void *dxtlibhandle = NULL;
1078f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
1088f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
1098f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paulvoid
110f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_texture_s3tc( struct gl_context *ctx )
1118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
1128f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   /* called during context initialization */
113d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   ctx->Mesa_DXTn = GL_FALSE;
114d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#if USE_EXTERNAL_DXTN_LIB
115d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (!dxtlibhandle) {
116c573b9f94a532c07438d72694115182c6a12903aBrian Paul      dxtlibhandle = _mesa_dlopen(DXTN_LIBNAME, 0);
117d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      if (!dxtlibhandle) {
1189c3876d7d852d84bcf317e625210699dd39696ebBrian Paul	 _mesa_warning(ctx, "couldn't open " DXTN_LIBNAME ", software DXTn "
119b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul	    "compression/decompression unavailable");
120d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      }
121d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      else {
122d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         /* the fetch functions are not per context! Might be problematic... */
1239c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         fetch_ext_rgb_dxt1 = (dxtFetchTexelFuncExt)
1249c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlsym(dxtlibhandle, "fetch_2d_texel_rgb_dxt1");
1259c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         fetch_ext_rgba_dxt1 = (dxtFetchTexelFuncExt)
1269c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlsym(dxtlibhandle, "fetch_2d_texel_rgba_dxt1");
1279c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         fetch_ext_rgba_dxt3 = (dxtFetchTexelFuncExt)
1289c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlsym(dxtlibhandle, "fetch_2d_texel_rgba_dxt3");
1299c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         fetch_ext_rgba_dxt5 = (dxtFetchTexelFuncExt)
1309c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlsym(dxtlibhandle, "fetch_2d_texel_rgba_dxt5");
1319c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         ext_tx_compress_dxtn = (dxtCompressTexFuncExt)
1329c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlsym(dxtlibhandle, "tx_compress_dxtn");
133d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
1349c3876d7d852d84bcf317e625210699dd39696ebBrian Paul         if (!fetch_ext_rgb_dxt1 ||
1359c3876d7d852d84bcf317e625210699dd39696ebBrian Paul             !fetch_ext_rgba_dxt1 ||
1369c3876d7d852d84bcf317e625210699dd39696ebBrian Paul             !fetch_ext_rgba_dxt3 ||
1379c3876d7d852d84bcf317e625210699dd39696ebBrian Paul             !fetch_ext_rgba_dxt5 ||
1389c3876d7d852d84bcf317e625210699dd39696ebBrian Paul             !ext_tx_compress_dxtn) {
139d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt	    _mesa_warning(ctx, "couldn't reference all symbols in "
1409c3876d7d852d84bcf317e625210699dd39696ebBrian Paul	       DXTN_LIBNAME ", software DXTn compression/decompression "
141b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul	       "unavailable");
142d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            fetch_ext_rgb_dxt1 = NULL;
143d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            fetch_ext_rgba_dxt1 = NULL;
144d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            fetch_ext_rgba_dxt3 = NULL;
145d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            fetch_ext_rgba_dxt5 = NULL;
146d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            ext_tx_compress_dxtn = NULL;
1479c3876d7d852d84bcf317e625210699dd39696ebBrian Paul            _mesa_dlclose(dxtlibhandle);
148d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt            dxtlibhandle = NULL;
149d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         }
150d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      }
151d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
152d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (dxtlibhandle) {
153d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      ctx->Mesa_DXTn = GL_TRUE;
154d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
155d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#else
156a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
157d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt#endif
1588f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
1598f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
1608f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/**
1614fc344790d0fefa3c38c63cadc4ee6a52633b006Brian Paul * Store user's image in rgb_dxt1 format.
1628f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
1637116ae857c6ef3809c712e96b28bd69d92b3cd33Brian PaulGLboolean
1647116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paul_mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS)
1658f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
166ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   const GLubyte *pixels;
1678f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   GLubyte *dst;
168663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   const GLubyte *tempImage = NULL;
1698f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
1709f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB_DXT1 ||
1719f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul          dstFormat == MESA_FORMAT_SRGB_DXT1);
1728f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
1738f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (srcFormat != GL_RGB ||
174ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul       srcType != GL_UNSIGNED_BYTE ||
1758f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       ctx->_ImageTransferState ||
176d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul       srcPacking->RowLength != srcWidth ||
1778f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       srcPacking->SwapBytes) {
178ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul      /* convert image to RGB/GLubyte */
179663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1808f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             baseInternalFormat,
1811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul                                             _mesa_get_format_base_format(dstFormat),
1828f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcWidth, srcHeight, srcDepth,
1838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcFormat, srcType, srcAddr,
1848f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcPacking);
1858f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      if (!tempImage)
1868f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul         return GL_FALSE; /* out of memory */
1878f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      pixels = tempImage;
1888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      srcFormat = GL_RGB;
1898f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
1908f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   else {
191d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul      pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
192d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul                                     srcFormat, srcType, 0, 0);
1938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
1948f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
195d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul   dst = dstSlices[0];
1968f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
197d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (ext_tx_compress_dxtn) {
1985999c5b620236fb6a996cf56759aec31f01c126bBrian Paul      (*ext_tx_compress_dxtn)(3, srcWidth, srcHeight, pixels,
1995999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
2005999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              dst, dstRowStride);
201d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
202d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
203b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_warning(ctx, "external dxt library not available: texstore_rgb_dxt1");
204d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
2058f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2068f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (tempImage)
20732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2088f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2098f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   return GL_TRUE;
2108f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
2118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2128f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2138f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/**
2144fc344790d0fefa3c38c63cadc4ee6a52633b006Brian Paul * Store user's image in rgba_dxt1 format.
2158f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
2167116ae857c6ef3809c712e96b28bd69d92b3cd33Brian PaulGLboolean
2177116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paul_mesa_texstore_rgba_dxt1(TEXSTORE_PARAMS)
2188f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
219ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   const GLubyte *pixels;
2208f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   GLubyte *dst;
221663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   const GLubyte *tempImage = NULL;
2228f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2239f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_DXT1 ||
2249f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul          dstFormat == MESA_FORMAT_SRGBA_DXT1);
2258f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2268f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (srcFormat != GL_RGBA ||
227ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul       srcType != GL_UNSIGNED_BYTE ||
2288f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       ctx->_ImageTransferState ||
229d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul       srcPacking->RowLength != srcWidth ||
2308f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       srcPacking->SwapBytes) {
231ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul      /* convert image to RGBA/GLubyte */
232663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2338f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             baseInternalFormat,
2341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul                                             _mesa_get_format_base_format(dstFormat),
2358f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcWidth, srcHeight, srcDepth,
2368f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcFormat, srcType, srcAddr,
2378f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcPacking);
2388f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      if (!tempImage)
2398f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul         return GL_FALSE; /* out of memory */
2408f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      pixels = tempImage;
2418f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      srcFormat = GL_RGBA;
2428f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
2438f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   else {
244d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul      pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
245d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul                                     srcFormat, srcType, 0, 0);
2468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
2478f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
248d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul   dst = dstSlices[0];
249d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul
250d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (ext_tx_compress_dxtn) {
2515999c5b620236fb6a996cf56759aec31f01c126bBrian Paul      (*ext_tx_compress_dxtn)(4, srcWidth, srcHeight, pixels,
2525999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
2535999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              dst, dstRowStride);
254d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
255d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
256b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_warning(ctx, "external dxt library not available: texstore_rgba_dxt1");
257d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
258d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
2598f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (tempImage)
26032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void*) tempImage);
2618f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2628f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   return GL_TRUE;
2638f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
2648f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2658f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2668f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/**
2674fc344790d0fefa3c38c63cadc4ee6a52633b006Brian Paul * Store user's image in rgba_dxt3 format.
2688f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
2697116ae857c6ef3809c712e96b28bd69d92b3cd33Brian PaulGLboolean
2707116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paul_mesa_texstore_rgba_dxt3(TEXSTORE_PARAMS)
2718f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
272ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   const GLubyte *pixels;
2738f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   GLubyte *dst;
274663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   const GLubyte *tempImage = NULL;
2758f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2769f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_DXT3 ||
2779f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul          dstFormat == MESA_FORMAT_SRGBA_DXT3);
2788f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
2798f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (srcFormat != GL_RGBA ||
280ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul       srcType != GL_UNSIGNED_BYTE ||
2818f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       ctx->_ImageTransferState ||
282d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul       srcPacking->RowLength != srcWidth ||
2838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       srcPacking->SwapBytes) {
284ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul      /* convert image to RGBA/GLubyte */
285663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2868f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             baseInternalFormat,
2871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul                                             _mesa_get_format_base_format(dstFormat),
2888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcWidth, srcHeight, srcDepth,
2898f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcFormat, srcType, srcAddr,
2908f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcPacking);
2918f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      if (!tempImage)
2928f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul         return GL_FALSE; /* out of memory */
2938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      pixels = tempImage;
2948f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
2958f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   else {
296d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul      pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
297d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul                                     srcFormat, srcType, 0, 0);
2988f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
2998f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
300d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul   dst = dstSlices[0];
301d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul
302d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (ext_tx_compress_dxtn) {
3035999c5b620236fb6a996cf56759aec31f01c126bBrian Paul      (*ext_tx_compress_dxtn)(4, srcWidth, srcHeight, pixels,
3045999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
3055999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              dst, dstRowStride);
306d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
307d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
308b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_warning(ctx, "external dxt library not available: texstore_rgba_dxt3");
309d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
310d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
3118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (tempImage)
31232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3138f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3148f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   return GL_TRUE;
3158f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
3168f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3178f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3188f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul/**
3194fc344790d0fefa3c38c63cadc4ee6a52633b006Brian Paul * Store user's image in rgba_dxt5 format.
3208f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul */
3217116ae857c6ef3809c712e96b28bd69d92b3cd33Brian PaulGLboolean
3227116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paul_mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
3238f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
324ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   const GLubyte *pixels;
3258f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   GLubyte *dst;
326663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   const GLubyte *tempImage = NULL;
3278f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3289f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_DXT5 ||
3299f7c8053e06663ba1f7b105f987052d9412d8fadBrian Paul          dstFormat == MESA_FORMAT_SRGBA_DXT5);
3308f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3318f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (srcFormat != GL_RGBA ||
332ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul       srcType != GL_UNSIGNED_BYTE ||
3338f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       ctx->_ImageTransferState ||
334d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul       srcPacking->RowLength != srcWidth ||
3358f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul       srcPacking->SwapBytes) {
336ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul      /* convert image to RGBA/GLubyte */
337663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
3388f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             baseInternalFormat,
3391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul                                   	     _mesa_get_format_base_format(dstFormat),
3408f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcWidth, srcHeight, srcDepth,
3418f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcFormat, srcType, srcAddr,
3428f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                                             srcPacking);
3438f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      if (!tempImage)
3448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul         return GL_FALSE; /* out of memory */
3458f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      pixels = tempImage;
3468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
3478f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   else {
348d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul      pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
349d7477ad0a38a178d1e03f8064ee8245b46e24f1eBrian Paul                                     srcFormat, srcType, 0, 0);
3508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   }
3518f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
352d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul   dst = dstSlices[0];
353d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul
354d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (ext_tx_compress_dxtn) {
3555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul      (*ext_tx_compress_dxtn)(4, srcWidth, srcHeight, pixels,
3565999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
3575999c5b620236fb6a996cf56759aec31f01c126bBrian Paul                              dst, dstRowStride);
358d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
359d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
360b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_warning(ctx, "external dxt library not available: texstore_rgba_dxt5");
361d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
362d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
3638f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   if (tempImage)
36432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3658f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3668f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   return GL_TRUE;
3678f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
3688f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3698f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3708f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paulstatic void
3714fec5e9154582439bc185eb143e89f220b169c32Brian Paulfetch_texel_2d_rgb_dxt1(const struct swrast_texture_image *texImage,
3724fec5e9154582439bc185eb143e89f220b169c32Brian Paul                        GLint i, GLint j, GLint k, GLubyte *texel)
3738f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
3745999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   (void) k;
3755999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   if (fetch_ext_rgb_dxt1) {
3764fec5e9154582439bc185eb143e89f220b169c32Brian Paul      GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
3776e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul      fetch_ext_rgb_dxt1(texImage->RowStride,
3784fec5e9154582439bc185eb143e89f220b169c32Brian Paul                         texImage->Map + sliceOffset, i, j, texel);
3795999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   }
3805999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   else
381b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgb_dxt1");
3828f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
3838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3848f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3857116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
3864fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_rgb_dxt1(const struct swrast_texture_image *texImage,
3874fec5e9154582439bc185eb143e89f220b169c32Brian Paul                           GLint i, GLint j, GLint k, GLfloat *texel)
3888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
389ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
390ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
3918f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba);
392ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
393ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
394ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
395ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
3968f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
3978f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3988f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
3998f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paulstatic void
4004fec5e9154582439bc185eb143e89f220b169c32Brian Paulfetch_texel_2d_rgba_dxt1(const struct swrast_texture_image *texImage,
4014fec5e9154582439bc185eb143e89f220b169c32Brian Paul                         GLint i, GLint j, GLint k, GLubyte *texel)
4028f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
403d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   (void) k;
404d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (fetch_ext_rgba_dxt1) {
4054fec5e9154582439bc185eb143e89f220b169c32Brian Paul      GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
4066e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul      fetch_ext_rgba_dxt1(texImage->RowStride,
4074fec5e9154582439bc185eb143e89f220b169c32Brian Paul                          texImage->Map + sliceOffset, i, j, texel);
4085999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   }
4095999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   else
410b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt1\n");
4118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4128f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4138f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4147116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
4154fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_rgba_dxt1(const struct swrast_texture_image *texImage,
4164fec5e9154582439bc185eb143e89f220b169c32Brian Paul                            GLint i, GLint j, GLint k, GLfloat *texel)
4178f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
418ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
419ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
4208f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba);
421ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
422ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
423ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
424ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
4258f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4268f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4278f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4288f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paulstatic void
4294fec5e9154582439bc185eb143e89f220b169c32Brian Paulfetch_texel_2d_rgba_dxt3(const struct swrast_texture_image *texImage,
4304fec5e9154582439bc185eb143e89f220b169c32Brian Paul                         GLint i, GLint j, GLint k, GLubyte *texel)
4318f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
432d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   (void) k;
433d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (fetch_ext_rgba_dxt3) {
4344fec5e9154582439bc185eb143e89f220b169c32Brian Paul      GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
4356e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul      fetch_ext_rgba_dxt3(texImage->RowStride,
4364fec5e9154582439bc185eb143e89f220b169c32Brian Paul                          texImage->Map + sliceOffset, i, j, texel);
4375999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   }
4385999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   else
439b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt3\n");
4408f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4418f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4428f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4437116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
4444fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_rgba_dxt3(const struct swrast_texture_image *texImage,
4454fec5e9154582439bc185eb143e89f220b169c32Brian Paul                            GLint i, GLint j, GLint k, GLfloat *texel)
4468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
447ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
448ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
4498f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba);
450ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
451ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
452ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
453ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
4548f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4558f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4568f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4578f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paulstatic void
4584fec5e9154582439bc185eb143e89f220b169c32Brian Paulfetch_texel_2d_rgba_dxt5(const struct swrast_texture_image *texImage,
4594fec5e9154582439bc185eb143e89f220b169c32Brian Paul                         GLint i, GLint j, GLint k, GLubyte *texel)
4608f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
461d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   (void) k;
462d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if (fetch_ext_rgba_dxt5) {
4634fec5e9154582439bc185eb143e89f220b169c32Brian Paul      GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
4646e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul      fetch_ext_rgba_dxt5(texImage->RowStride,
4654fec5e9154582439bc185eb143e89f220b169c32Brian Paul                          texImage->Map + sliceOffset, i, j, texel);
4665999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   }
4675999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   else
468b3c1c5cf2c5848d794a5690c7296b9b927412353Jakob Bornecrantz      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt5\n");
4698f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4708f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4718f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4727116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
4734fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_rgba_dxt5(const struct swrast_texture_image *texImage,
4744fec5e9154582439bc185eb143e89f220b169c32Brian Paul                            GLint i, GLint j, GLint k, GLfloat *texel)
4758f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul{
476ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
477ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
4788f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba);
479ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
480ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
481ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
482ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
4838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul}
4848f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
4855bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger#if FEATURE_EXT_texture_sRGB
4867116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
4874fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_srgb_dxt1(const struct swrast_texture_image *texImage,
4884fec5e9154582439bc185eb143e89f220b169c32Brian Paul                            GLint i, GLint j, GLint k, GLfloat *texel)
4895bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
490ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
491ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
4925bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba);
4935bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]);
4945bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]);
4955bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]);
496ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
4975bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
4985bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
4997116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
5004fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_srgba_dxt1(const struct swrast_texture_image *texImage,
5014fec5e9154582439bc185eb143e89f220b169c32Brian Paul                             GLint i, GLint j, GLint k, GLfloat *texel)
5025bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
503ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
504ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
5055bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba);
5065bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]);
5075bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]);
5085bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]);
509ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
5105bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
5115bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
5127116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
5134fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_srgba_dxt3(const struct swrast_texture_image *texImage,
5144fec5e9154582439bc185eb143e89f220b169c32Brian Paul                             GLint i, GLint j, GLint k, GLfloat *texel)
5155bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
516ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
517ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
5185bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba);
5195bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]);
5205bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]);
5215bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]);
522ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
5235bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
5245bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
5257116ae857c6ef3809c712e96b28bd69d92b3cd33Brian Paulvoid
5264fec5e9154582439bc185eb143e89f220b169c32Brian Paul_mesa_fetch_texel_srgba_dxt5(const struct swrast_texture_image *texImage,
5274fec5e9154582439bc185eb143e89f220b169c32Brian Paul                             GLint i, GLint j, GLint k, GLfloat *texel)
5285bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
529ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   /* just sample as GLubyte and convert to float here */
530ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   GLubyte rgba[4];
5315bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba);
5325bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]);
5335bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]);
5345bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]);
535ae670b58d4e0234c5ee79ba0b074251380897c38Brian Paul   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
5365bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
53759798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu#endif /* FEATURE_EXT_texture_sRGB */
53859798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu
5398f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
54059798cd8864b601e035cf2414517cd90d24ed786Chia-I Wu#endif /* FEATURE_texture_s3tc */
541