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