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