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