1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2011 Red Hat Inc.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * block compression parts are:
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2004  Roland Scheidegger   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author:
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Dave Airlie
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file texcompress_rgtc.c
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_EXT_texture_compression_rgtc support.
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mipmap.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_rgtc.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texstore.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_context.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RGTC_DEBUG 0
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void unsigned_encode_rgtc_ubyte(GLubyte *blkaddr, GLubyte srccolors[4][4],
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLint numxpixels, GLint numypixels);
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void signed_encode_rgtc_ubyte(GLbyte *blkaddr, GLbyte srccolors[4][4],
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     GLint numxpixels, GLint numypixels);
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void unsigned_fetch_texel_rgtc(unsigned srcRowStride, const GLubyte *pixdata,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      unsigned i, unsigned j, GLubyte *value, unsigned comps);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void signed_fetch_texel_rgtc(unsigned srcRowStride, const GLbyte *pixdata,
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      unsigned i, unsigned j, GLbyte *value, unsigned comps);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void extractsrc_u( GLubyte srcpixels[4][4], const GLubyte *srcaddr,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte i, j;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *curaddr;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < numypixels; j++) {
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      curaddr = srcaddr + j * srcRowStride * comps;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < numxpixels; i++) {
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcpixels[j][i] = *curaddr;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 curaddr += comps;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void extractsrc_s( GLbyte srcpixels[4][4], const GLfloat *srcaddr,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte i, j;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *curaddr;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < numypixels; j++) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      curaddr = srcaddr + j * srcRowStride * comps;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < numxpixels; i++) {
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcpixels[j][i] = FLOAT_TO_BYTE_TEX(*curaddr);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 curaddr += comps;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_red_rgtc1(TEXSTORE_PARAMS)
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *dst;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *tempImage = NULL;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, j;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numxpixels, numypixels;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *srcaddr;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte srcpixels[4][4];
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *blkaddr;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint dstRowDiff;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RED_RGTC1 ||
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_L_LATC1);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  baseInternalFormat,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  _mesa_get_format_base_format(dstFormat),
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcWidth, srcHeight, srcDepth,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcFormat, srcType, srcAddr,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcPacking);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* out of memory */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = dstSlices[0];
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blkaddr = dst;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dstRowDiff = dstRowStride >= (srcWidth * 2) ? dstRowStride - (((srcWidth + 3) & ~3) * 2) : 0;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < srcHeight; j+=4) {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (srcHeight > j + 3) numypixels = 4;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else numypixels = srcHeight - j;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcaddr = tempImage + j * srcWidth;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < srcWidth; i += 4) {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (srcWidth > i + 3) numxpixels = 4;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else numxpixels = srcWidth - i;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_u(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 1);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcaddr += numxpixels;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blkaddr += dstRowDiff;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tempImage)
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_red_rgtc1(TEXSTORE_PARAMS)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte *dst;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *tempImage = NULL;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, j;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numxpixels, numypixels;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *srcaddr;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte srcpixels[4][4];
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte *blkaddr;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint dstRowDiff;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RED_RGTC1 ||
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_L_LATC1);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = _mesa_make_temp_float_image(ctx, dims,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   baseInternalFormat,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   _mesa_get_format_base_format(dstFormat),
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcWidth, srcHeight, srcDepth,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcFormat, srcType, srcAddr,
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcPacking, 0x0);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* out of memory */
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = (GLbyte *) dstSlices[0];
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blkaddr = dst;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dstRowDiff = dstRowStride >= (srcWidth * 2) ? dstRowStride - (((srcWidth + 3) & ~3) * 2) : 0;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < srcHeight; j+=4) {
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (srcHeight > j + 3) numypixels = 4;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else numypixels = srcHeight - j;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcaddr = tempImage + j * srcWidth;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < srcWidth; i += 4) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (srcWidth > i + 3) numxpixels = 4;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else numxpixels = srcWidth - i;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_s(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 1);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcaddr += numxpixels;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blkaddr += dstRowDiff;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tempImage)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rg_rgtc2(TEXSTORE_PARAMS)
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *dst;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *tempImage = NULL;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, j;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numxpixels, numypixels;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *srcaddr;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte srcpixels[4][4];
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *blkaddr;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint dstRowDiff;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RG_RGTC2 ||
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LA_LATC2);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  baseInternalFormat,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  _mesa_get_format_base_format(dstFormat),
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcWidth, srcHeight, srcDepth,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcFormat, srcType, srcAddr,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  srcPacking);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* out of memory */
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = dstSlices[0];
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blkaddr = dst;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dstRowDiff = dstRowStride >= (srcWidth * 4) ? dstRowStride - (((srcWidth + 3) & ~3) * 4) : 0;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < srcHeight; j+=4) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (srcHeight > j + 3) numypixels = 4;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else numypixels = srcHeight - j;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcaddr = tempImage + j * srcWidth * 2;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < srcWidth; i += 4) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (srcWidth > i + 3) numxpixels = 4;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else numxpixels = srcWidth - i;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_u(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 2);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_u(srcpixels, (GLubyte *)srcaddr + 1, srcWidth, numxpixels, numypixels, 2);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 unsigned_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcaddr += numxpixels * 2;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blkaddr += dstRowDiff;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tempImage)
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte *dst;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *tempImage = NULL;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, j;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numxpixels, numypixels;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *srcaddr;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte srcpixels[4][4];
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte *blkaddr;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint dstRowDiff;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG_RGTC2 ||
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_LA_LATC2);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = _mesa_make_temp_float_image(ctx, dims,
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   baseInternalFormat,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   _mesa_get_format_base_format(dstFormat),
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcWidth, srcHeight, srcDepth,
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcFormat, srcType, srcAddr,
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   srcPacking, 0x0);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* out of memory */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = (GLbyte *) dstSlices[0];
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blkaddr = dst;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dstRowDiff = dstRowStride >= (srcWidth * 4) ? dstRowStride - (((srcWidth + 3) & ~3) * 4) : 0;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; j < srcHeight; j += 4) {
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (srcHeight > j + 3) numypixels = 4;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else numypixels = srcHeight - j;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcaddr = tempImage + j * srcWidth * 2;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < srcWidth; i += 4) {
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (srcWidth > i + 3) numxpixels = 4;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else numxpixels = srcWidth - i;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_s(srcpixels, srcaddr, srcWidth, numxpixels, numypixels, 2);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 extractsrc_s(srcpixels, srcaddr + 1, srcWidth, numxpixels, numypixels, 2);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 signed_encode_rgtc_ubyte(blkaddr, srcpixels, numxpixels, numypixels);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 blkaddr += 8;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcaddr += numxpixels * 2;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blkaddr += dstRowDiff;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tempImage)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLint i, GLint j, GLint k, GLfloat *texel)
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte red;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &red, 1);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] = UBYTE_TO_FLOAT(red);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] = 0.0;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = 0.0;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLint i, GLint j, GLint k, GLfloat *texel)
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte red;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &red, 1);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] = 0.0;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = 0.0;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLint i, GLint j, GLint k, GLfloat *texel)
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte red, green;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset,
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &red, 2);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset + 8,
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &green, 2);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] = UBYTE_TO_FLOAT(red);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] = UBYTE_TO_FLOAT(green);
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = 0.0;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLint i, GLint j, GLint k, GLfloat *texel)
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte red, green;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &red, 2);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset + 8,
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &green, 2);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = 0.0;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLint i, GLint j, GLint k, GLfloat *texel)
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte red;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset,
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &red, 1);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] =
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] =
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = UBYTE_TO_FLOAT(red);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLint i, GLint j, GLint k, GLfloat *texel)
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte red;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset,
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &red, 1);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] =
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] =
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = 1.0;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLint i, GLint j, GLint k, GLfloat *texel)
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte red, green;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset,
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &red, 2);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned_fetch_texel_rgtc(texImage->RowStride,
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             texImage->Map + sliceOffset + 8,
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             i, j, &green, 2);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] =
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] =
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = UBYTE_TO_FLOAT(red);
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = UBYTE_TO_FLOAT(green);
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLint i, GLint j, GLint k, GLfloat *texel)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbyte red, green;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset,
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &red, 2);
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed_fetch_texel_rgtc(texImage->RowStride,
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (GLbyte *)(texImage->Map) + sliceOffset + 8,
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           i, j, &green, 2);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[RCOMP] =
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[GCOMP] =
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texel[ACOMP] = BYTE_TO_FLOAT_TEX(green);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) unsigned_##x
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TYPE GLubyte
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T_MIN 0
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T_MAX 0xff
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_rgtc_tmp.h"
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TYPE
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef T_MIN
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef T_MAX
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) signed_##x
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TYPE GLbyte
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T_MIN (GLbyte)-128
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T_MAX (GLbyte)127
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_rgtc_tmp.h"
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TYPE
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef T_MIN
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef T_MAX
450