18d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie/* 28d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Copyright (C) 2011 Red Hat Inc. 38d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * 48d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * block compression parts are: 58d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Copyright (C) 2004 Roland Scheidegger All Rights Reserved. 68d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * 78d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 88d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * copy of this software and associated documentation files (the "Software"), 98d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * to deal in the Software without restriction, including without limitation 108d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 118d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * and/or sell copies of the Software, and to permit persons to whom the 128d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Software is furnished to do so, subject to the following conditions: 138d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * 148d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * The above copyright notice and this permission notice (including the next 158d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * paragraph) shall be included in all copies or substantial portions of the 168d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Software. 178d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * 188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 218d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 228d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 238d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 248d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * DEALINGS IN THE SOFTWARE. 258d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * 268d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Author: 278d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * Dave Airlie 288d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie */ 298d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 308d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie/** 318d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * \file texcompress_rgtc.c 328d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie * GL_EXT_texture_compression_rgtc support. 338d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie */ 348d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 358d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 368d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "glheader.h" 378d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "imports.h" 388d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "colormac.h" 398d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "image.h" 408d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "macros.h" 418d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "mfeatures.h" 428d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "mipmap.h" 438d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress.h" 448d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h" 458d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texstore.h" 46a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul#include "swrast/s_context.h" 47a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 488d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 498d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#define RGTC_DEBUG 0 508d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 51b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paulstatic void unsigned_encode_rgtc_ubyte(GLubyte *blkaddr, GLubyte srccolors[4][4], 529c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie GLint numxpixels, GLint numypixels); 53b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paulstatic void signed_encode_rgtc_ubyte(GLbyte *blkaddr, GLbyte srccolors[4][4], 548d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint numxpixels, GLint numypixels); 558d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 56531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airliestatic void unsigned_fetch_texel_rgtc(unsigned srcRowStride, const GLubyte *pixdata, 57531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airlie unsigned i, unsigned j, GLubyte *value, unsigned comps); 58531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airlie 59531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airliestatic void signed_fetch_texel_rgtc(unsigned srcRowStride, const GLbyte *pixdata, 60531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airlie unsigned i, unsigned j, GLbyte *value, unsigned comps); 61531c336fa39d8e823d05728cb7ddb3cc8a44d199Dave Airlie 62b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paulstatic void extractsrc_u( GLubyte srcpixels[4][4], const GLubyte *srcaddr, 638d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps) 648d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 658d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte i, j; 66b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul const GLubyte *curaddr; 678d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < numypixels; j++) { 688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie curaddr = srcaddr + j * srcRowStride * comps; 698d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < numxpixels; i++) { 70b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul srcpixels[j][i] = *curaddr; 718d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie curaddr += comps; 728d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 738d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 748d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 758d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 768d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airliestatic void extractsrc_s( GLbyte srcpixels[4][4], const GLfloat *srcaddr, 778d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps) 788d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 798d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte i, j; 808d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie const GLfloat *curaddr; 818d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < numypixels; j++) { 828d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie curaddr = srcaddr + j * srcRowStride * comps; 838d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < numxpixels; i++) { 848d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcpixels[j][i] = FLOAT_TO_BYTE_TEX(*curaddr); 858d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie curaddr += comps; 868d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 878d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 888d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 898d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 908d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 918d47c919859e9cd90cfc04eb220ac8a5aa87048eDave AirlieGLboolean 928d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie_mesa_texstore_red_rgtc1(TEXSTORE_PARAMS) 938d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 948d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte *dst; 95663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = NULL; 968d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int i, j; 978d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int numxpixels, numypixels; 98b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul const GLubyte *srcaddr; 998d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte srcpixels[4][4]; 1008d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte *blkaddr; 1018d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint dstRowDiff; 1027d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák ASSERT(dstFormat == MESA_FORMAT_RED_RGTC1 || 1037d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák dstFormat == MESA_FORMAT_L_LATC1); 1048d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 105663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1068d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie baseInternalFormat, 1078d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie _mesa_get_format_base_format(dstFormat), 1088d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcWidth, srcHeight, srcDepth, 1098d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcFormat, srcType, srcAddr, 1108d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcPacking); 1118d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (!tempImage) 1128d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_FALSE; /* out of memory */ 1138d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 114d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = dstSlices[0]; 1158d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1168d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr = dst; 1176eff8479af1a137d81d7bffc0c55a39910c28ce9Marek Olšák dstRowDiff = dstRowStride >= (srcWidth * 2) ? dstRowStride - (((srcWidth + 3) & ~3) * 2) : 0; 1188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < srcHeight; j+=4) { 1198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcHeight > j + 3) numypixels = 4; 1208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numypixels = srcHeight - j; 1218d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr = tempImage + j * srcWidth; 1228d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < srcWidth; i += 4) { 1238d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcWidth > i + 3) numxpixels = 4; 1248d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numxpixels = srcWidth - i; 1258d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie extractsrc_u(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 1); 126b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 1278d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr += numxpixels; 1288d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 1298d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 1308d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += dstRowDiff; 1318d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 1328d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (tempImage) 1338d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie free((void *) tempImage); 1348d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1358d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_TRUE; 1368d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 1378d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1388d47c919859e9cd90cfc04eb220ac8a5aa87048eDave AirlieGLboolean 1398d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie_mesa_texstore_signed_red_rgtc1(TEXSTORE_PARAMS) 1408d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 1418d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte *dst; 1428d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie const GLfloat *tempImage = NULL; 1438d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int i, j; 1448d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int numxpixels, numypixels; 1458d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie const GLfloat *srcaddr; 1468d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte srcpixels[4][4]; 1478d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte *blkaddr; 1488d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint dstRowDiff; 1497d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RED_RGTC1 || 1507d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L_LATC1); 1518d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1528d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie tempImage = _mesa_make_temp_float_image(ctx, dims, 1538d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie baseInternalFormat, 1548d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie _mesa_get_format_base_format(dstFormat), 1558d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcWidth, srcHeight, srcDepth, 1568d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcFormat, srcType, srcAddr, 1578d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcPacking, 0x0); 1588d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (!tempImage) 1598d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_FALSE; /* out of memory */ 1608d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 161d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = (GLbyte *) dstSlices[0]; 1628d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1638d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr = dst; 1646eff8479af1a137d81d7bffc0c55a39910c28ce9Marek Olšák dstRowDiff = dstRowStride >= (srcWidth * 2) ? dstRowStride - (((srcWidth + 3) & ~3) * 2) : 0; 1658d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < srcHeight; j+=4) { 1668d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcHeight > j + 3) numypixels = 4; 1678d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numypixels = srcHeight - j; 1688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr = tempImage + j * srcWidth; 1698d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < srcWidth; i += 4) { 1708d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcWidth > i + 3) numxpixels = 4; 1718d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numxpixels = srcWidth - i; 1728d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie extractsrc_s(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 1); 173b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 1748d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr += numxpixels; 1758d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 1768d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 1778d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += dstRowDiff; 1788d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 1798d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (tempImage) 1808d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie free((void *) tempImage); 1818d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1828d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_TRUE; 1838d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 1848d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1858d47c919859e9cd90cfc04eb220ac8a5aa87048eDave AirlieGLboolean 1868d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie_mesa_texstore_rg_rgtc2(TEXSTORE_PARAMS) 1878d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 1888d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte *dst; 189663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = NULL; 1908d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int i, j; 1918d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int numxpixels, numypixels; 192b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul const GLubyte *srcaddr; 1938d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte srcpixels[4][4]; 1948d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLubyte *blkaddr; 1958d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint dstRowDiff; 1968d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 1977d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák ASSERT(dstFormat == MESA_FORMAT_RG_RGTC2 || 1987d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák dstFormat == MESA_FORMAT_LA_LATC2); 1998d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 200663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2018d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie baseInternalFormat, 2028d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie _mesa_get_format_base_format(dstFormat), 2038d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcWidth, srcHeight, srcDepth, 2048d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcFormat, srcType, srcAddr, 2058d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcPacking); 2068d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (!tempImage) 2078d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_FALSE; /* out of memory */ 2088d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 209d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = dstSlices[0]; 2108d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2118d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr = dst; 2126eff8479af1a137d81d7bffc0c55a39910c28ce9Marek Olšák dstRowDiff = dstRowStride >= (srcWidth * 4) ? dstRowStride - (((srcWidth + 3) & ~3) * 4) : 0; 2138d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < srcHeight; j+=4) { 2148d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcHeight > j + 3) numypixels = 4; 2158d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numypixels = srcHeight - j; 2168d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr = tempImage + j * srcWidth * 2; 2178d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < srcWidth; i += 4) { 2188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcWidth > i + 3) numxpixels = 4; 2198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numxpixels = srcWidth - i; 2208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie extractsrc_u(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 2); 221b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 2228d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2238d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 224b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul extractsrc_u(srcpixels, (GLubyte *)srcaddr + 1, srcWidth, numxpixels, numypixels, 2); 225b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 2268d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2278d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 2288d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2298d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr += numxpixels * 2; 2308d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 2318d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += dstRowDiff; 2328d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 2338d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (tempImage) 2348d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie free((void *) tempImage); 2358d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2368d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_TRUE; 2378d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 2388d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2398d47c919859e9cd90cfc04eb220ac8a5aa87048eDave AirlieGLboolean 2408d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie_mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS) 2418d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 2428d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte *dst; 2438d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie const GLfloat *tempImage = NULL; 2448d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int i, j; 2458d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie int numxpixels, numypixels; 2468d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie const GLfloat *srcaddr; 2478d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte srcpixels[4][4]; 2488d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte *blkaddr; 2498d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLint dstRowDiff; 2508d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2517d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG_RGTC2 || 2527d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák dstFormat == MESA_FORMAT_SIGNED_LA_LATC2); 2538d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2548d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie tempImage = _mesa_make_temp_float_image(ctx, dims, 2558d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie baseInternalFormat, 2568d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie _mesa_get_format_base_format(dstFormat), 2578d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcWidth, srcHeight, srcDepth, 2588d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcFormat, srcType, srcAddr, 2598d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcPacking, 0x0); 2608d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (!tempImage) 2618d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_FALSE; /* out of memory */ 2628d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 263d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = (GLbyte *) dstSlices[0]; 2648d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2658d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr = dst; 2666eff8479af1a137d81d7bffc0c55a39910c28ce9Marek Olšák dstRowDiff = dstRowStride >= (srcWidth * 4) ? dstRowStride - (((srcWidth + 3) & ~3) * 4) : 0; 2678d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (j = 0; j < srcHeight; j += 4) { 2688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcHeight > j + 3) numypixels = 4; 2698d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numypixels = srcHeight - j; 2708d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr = tempImage + j * srcWidth * 2; 2718d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie for (i = 0; i < srcWidth; i += 4) { 2728d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (srcWidth > i + 3) numxpixels = 4; 2738d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie else numxpixels = srcWidth - i; 2748d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2758d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie extractsrc_s(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 2); 276b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 2778d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 2788d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2798d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie extractsrc_s(srcpixels, srcaddr + 1, srcWidth, numxpixels, numypixels, 2); 280b4e6afbf7715df7473723f3e0c5d714cd5721802Brian Paul signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels); 2818d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += 8; 2828d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2838d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie srcaddr += numxpixels * 2; 2848d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2858d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 2868d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie blkaddr += dstRowDiff; 2878d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie } 2888d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie if (tempImage) 2898d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie free((void *) tempImage); 2908d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2918d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie return GL_TRUE; 2928d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 2938d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 2948d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlievoid 295d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage, 296d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 2978d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 2985f714c2aaf8d25e5d5ba2e4c29cb3046f7639d24Dave Airlie GLubyte red; 299d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0; 300d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 301d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset, 302d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 1); 3035f714c2aaf8d25e5d5ba2e4c29cb3046f7639d24Dave Airlie texel[RCOMP] = UBYTE_TO_FLOAT(red); 3048d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[GCOMP] = 0.0; 3058d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[BCOMP] = 0.0; 3068d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[ACOMP] = 1.0; 3078d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 3088d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 3098d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlievoid 310d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage, 311d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3128d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 3138d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte red; 314d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0; 315d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 316d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset, 317d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 1); 3188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[RCOMP] = BYTE_TO_FLOAT_TEX(red); 3198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[GCOMP] = 0.0; 3208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[BCOMP] = 0.0; 3218d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[ACOMP] = 1.0; 3228d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 3238d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 3248d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlievoid 325d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage, 326d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3278d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 3285f714c2aaf8d25e5d5ba2e4c29cb3046f7639d24Dave Airlie GLubyte red, green; 329d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0; 330d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 331d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset, 332d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 2); 333d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 334d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset + 8, 335d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &green, 2); 3365f714c2aaf8d25e5d5ba2e4c29cb3046f7639d24Dave Airlie texel[RCOMP] = UBYTE_TO_FLOAT(red); 3375f714c2aaf8d25e5d5ba2e4c29cb3046f7639d24Dave Airlie texel[GCOMP] = UBYTE_TO_FLOAT(green); 3388d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[BCOMP] = 0.0; 3398d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[ACOMP] = 1.0; 3408d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 3418d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 3428d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlievoid 343d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage, 344d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3458d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie{ 3468d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie GLbyte red, green; 347d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0; 348d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 349d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset, 350d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 2); 351d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 352d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset + 8, 353d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &green, 2); 3548d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[RCOMP] = BYTE_TO_FLOAT_TEX(red); 3558d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[GCOMP] = BYTE_TO_FLOAT_TEX(green); 3568d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[BCOMP] = 0.0; 3578d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie texel[ACOMP] = 1.0; 3588d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie} 3598d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 3607d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšákvoid 361d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage, 362d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3637d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák{ 3647d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák GLubyte red; 365d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0; 366d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 367d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset, 368d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 1); 3697d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[RCOMP] = 3707d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[GCOMP] = 3717d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[BCOMP] = UBYTE_TO_FLOAT(red); 3727d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[ACOMP] = 1.0; 3737d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák} 3747d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 3757d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšákvoid 376d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage, 377d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3787d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák{ 3797d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák GLbyte red; 380d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0; 381d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 382d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset, 383d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 1); 3847d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[RCOMP] = 3857d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[GCOMP] = 3867d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[BCOMP] = BYTE_TO_FLOAT_TEX(red); 3877d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[ACOMP] = 1.0; 3887d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák} 3897d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 3907d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšákvoid 391d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage, 392d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 3937d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák{ 3947d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák GLubyte red, green; 395d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0; 396d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 397d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset, 398d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 2); 399d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul unsigned_fetch_texel_rgtc(texImage->RowStride, 400d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul texImage->Map + sliceOffset + 8, 401d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &green, 2); 4027d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[RCOMP] = 4037d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[GCOMP] = 4047d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[BCOMP] = UBYTE_TO_FLOAT(red); 4057d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[ACOMP] = UBYTE_TO_FLOAT(green); 4067d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák} 4077d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 4087d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšákvoid 409d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage, 410d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint i, GLint j, GLint k, GLfloat *texel) 4117d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák{ 4127d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák GLbyte red, green; 413d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0; 414d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 415d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset, 416d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &red, 2); 417d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul signed_fetch_texel_rgtc(texImage->RowStride, 418d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul (GLbyte *)(texImage->Map) + sliceOffset + 8, 419d78b44c2651b45c337dda71b17351beb41eb9c14Brian Paul i, j, &green, 2); 4207d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[RCOMP] = 4217d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[GCOMP] = 4227d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[BCOMP] = BYTE_TO_FLOAT_TEX(red); 4237d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák texel[ACOMP] = BYTE_TO_FLOAT_TEX(green); 4247d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák} 4257d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 4269c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define TAG(x) unsigned_##x 4278d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4289c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define TYPE GLubyte 4299c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define T_MIN 0 4309c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define T_MAX 0xff 4318d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4329c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#include "texcompress_rgtc_tmp.h" 4338d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4349c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef TAG 4359c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef TYPE 4369c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef T_MIN 4379c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef T_MAX 4388d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4399c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define TAG(x) signed_##x 4409c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#define TYPE GLbyte 441fb6ecca0a556dcca1f77bfb84a835e2b9c2e2e6aDave Airlie#define T_MIN (GLbyte)-128 442fb6ecca0a556dcca1f77bfb84a835e2b9c2e2e6aDave Airlie#define T_MAX (GLbyte)127 4438d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4449c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#include "texcompress_rgtc_tmp.h" 4458d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 4469c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef TAG 4479c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef TYPE 4489c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef T_MIN 4499c16fcc617b8c5c4db825ed290f994e535de8c65Dave Airlie#undef T_MAX 450