texstore.c revision 6e9a1650e541bf7db15b7e8afaf90d7975b165fe
18e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
28e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Mesa 3-D graphics library
3a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Version:  7.5
48e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
5501338d70e96e0388fd5198625d856c4ec07745fBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Copyright (c) 2008-2009  VMware, Inc.
78e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
88e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
98e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * copy of this software and associated documentation files (the "Software"),
108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * to deal in the Software without restriction, including without limitation
118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Software is furnished to do so, subject to the following conditions:
148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * The above copyright notice and this permission notice shall be included
168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * in all copies or substantial portions of the Software.
178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Authors:
288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *   Brian Paul
298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
31248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
3289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * The GL texture image functions in teximage.c basically just do
3389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * error checking and data structure allocation.  They in turn call
3489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * device driver functions which actually copy/convert/store the user's
3589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture image data.
3689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
3789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * However, most device drivers will be able to use the fallback functions
3889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * in this file.  That is, most drivers will have the following bit of
3989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * code:
4089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
4189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   etc...
4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated.  We have to do:
4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    Format/type conversions
4789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    pixel unpacking
48a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt *    pixel transfer (scale, bais, lookup, etc)
4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full
5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images.
5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
553c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h"
567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
57e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h"
584c7e44e8e6fd1f441a97016d8bcc67133149e15eBrian Paul#include "format_pack.h"
598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h"
608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h"
6124edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h"
62db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
630117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
65b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h"
663c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
6789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
68da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h"
698d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h"
70da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h"
71d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu#include "texcompress_etc.h"
728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h"
738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
742e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h"
751271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
76631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
78248200737398a7d6403a23930a6c9d93db06b942Brian Paul
79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
81fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
82fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
8371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
84248200737398a7d6403a23930a6c9d93db06b942Brian Paul
85248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
90e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
91e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
92248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
93248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
94248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
95248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
96248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
10371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
10471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
1115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG:
11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
11671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
11771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
126fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
1335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   IDX_RG,
134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
136fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
142fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1432e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
149fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
155fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
161fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
167fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
173fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
178fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
179fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   {
2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      IDX_RG,
2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP4(0, 1, ZERO, ONE),
2245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP2(0, 1)
2255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   },
226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
229fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
233248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
234248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
241fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
242fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
2495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG: return IDX_RG;
250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
255fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
262fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
263fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
269248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
270248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
271248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
272248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2742e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2816b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[0],
286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[1],
287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[2],
288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[3],
289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[4],
290298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[5]);
2916b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
30039de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
318e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat *
319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum logicalBaseFormat,
321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum textureBaseFormat,
322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum srcFormat, GLenum srcType,
324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const GLvoid *srcAddr,
325e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const struct gl_pixelstore_attrib *srcPacking,
326e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLbitfield transferOps)
327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint components = _mesa_components_in_format(logicalBaseFormat);
330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint srcStride =
331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
332a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLfloat *dst;
333a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLint img, row;
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
3395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
3405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
3495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
3505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				  * components * sizeof(GLfloat));
359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   if (!tempImage)
360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      return NULL;
361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   dst = tempImage;
363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   for (img = 0; img < srcDepth; img++) {
364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      const GLubyte *src
365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcWidth, srcHeight,
367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcFormat, srcType,
368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 img, 0, 0);
369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      for (row = 0; row < srcHeight; row++) {
370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       dst, srcFormat, srcType, src,
372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       srcPacking, transferOps);
373a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 dst += srcWidth * components;
374a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 src += srcStride;
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
3843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
38713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
38813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
39532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
39832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
41832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values.  Used for unsigned
428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures.
429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */
430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint *
431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims,
432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum logicalBaseFormat,
433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum textureBaseFormat,
434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum srcFormat, GLenum srcType,
436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const GLvoid *srcAddr,
437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const struct gl_pixelstore_attrib *srcPacking)
438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{
439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *tempImage;
440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint srcStride =
442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *dst;
444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLint img, row;
445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(dims >= 1 && dims <= 3);
447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RGB ||
450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RG ||
451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RED ||
452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_INTENSITY ||
455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_ALPHA);
456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RGB ||
459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RG ||
460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RED ||
461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
462dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE ||
46338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          textureBaseFormat == GL_INTENSITY ||
464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_ALPHA);
465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                 * components * sizeof(GLuint));
468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (!tempImage)
469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      return NULL;
470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   dst = tempImage;
472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   for (img = 0; img < srcDepth; img++) {
473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLubyte *src
474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcWidth, srcHeight,
476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcFormat, srcType,
477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 img, 0, 0);
478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (row = 0; row < srcHeight; row++) {
479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      dst, srcFormat, srcType, src,
481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      srcPacking);
482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 dst += srcWidth * components;
483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 src += srcStride;
484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* more work */
489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLuint *newImage;
492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint i, n;
493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLubyte map[6];
494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* The actual texture format should have at least as many components
500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       * as the logical texture format.
501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       */
502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(texComponents >= logComponents);
503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                   * texComponents * sizeof(GLuint));
506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      if (!newImage) {
507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         free(tempImage);
508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         return NULL;
509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      n = srcWidth * srcHeight * srcDepth;
514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (i = 0; i < n; i++) {
515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         GLint k;
516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         for (k = 0; k < texComponents; k++) {
517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            GLint j = map[k];
518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            if (j == ZERO)
519a240c998ac649d79f423bb0c445993132cd56f97Brian Paul               newImage[i * texComponents + k] = 0;
520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else if (j == ONE)
521a240c998ac649d79f423bb0c445993132cd56f97Brian Paul               newImage[i * texComponents + k] = 1;
522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else
523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         }
525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      free(tempImage);
528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      tempImage = newImage;
529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   return tempImage;
532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul}
533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
534dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
535dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
536dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/**
537663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components.
538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
54139de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte.
558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
559663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte *
560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum logicalBaseFormat,
562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum textureBaseFormat,
563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLint srcWidth, GLint srcHeight, GLint srcDepth,
564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum srcFormat, GLenum srcType,
565663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const GLvoid *srcAddr,
566663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const struct gl_pixelstore_attrib *srcPacking)
567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
571663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   GLubyte *tempImage, *dst;
572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
5775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
5785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
5865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
5875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
595663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                       * components * sizeof(GLubyte));
59696128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
59896128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
6068c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
6078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
6088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
610e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
611e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       srcFormat, srcType, src, srcPacking,
612e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       transferOps);
613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
622663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      GLubyte *newImage;
623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
6243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
62813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
635663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
636663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                         * texComponents * sizeof(GLubyte));
637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
63832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
6423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
652663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               newImage[i * texComponents + k] = 255;
653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
65832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
666c039af165d5919008c6df599795951f85dea164dBrian Paul/**
667c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
671c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
672248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
673248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
674248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
675c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
676c039af165d5919008c6df599795951f85dea164dBrian Paul */
677c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
678c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
679c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
68071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
701501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
702248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
70671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
709501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
71171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
726501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
72971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
744501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
74771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
762501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
76471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
7653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
780501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
7823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
784501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
78571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
786501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
78871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
78946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
790501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
792bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
79346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
79439de9251c4770fdcce3395643003aa626178446dBrian Paul
79539de9251c4770fdcce3395643003aa626178446dBrian Paul/**
79639de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
79739de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness.
798bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
79946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
800bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
80246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
803c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
80446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
80546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
806bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
807df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
808bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
809df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
81446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
81539de9251c4770fdcce3395643003aa626178446dBrian Paul
81639de9251c4770fdcce3395643003aa626178446dBrian Paul/**
81739de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
81839de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state.
81946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
822bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
82346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
824bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
825bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
826bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
828c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
83846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
84046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
841c039af165d5919008c6df599795951f85dea164dBrian Paul/**
842c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
843c039af165d5919008c6df599795951f85dea164dBrian Paul */
84471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
845f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx,
84671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
84771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
84846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
84946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
8510c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
85246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
8530c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
8565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                          GLubyte **dstSlices,
85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
86271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
863bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
8643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
86571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
866c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
867c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
868c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
869c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
870c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
871c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
872c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
873c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
874c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
875c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
87671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
878edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
8820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
8843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
886bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
88746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
88971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
890bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
89171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
892298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
8932e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
895b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
8969c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
899d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLubyte *dstImage = dstSlices[0];
90071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
907d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
90871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
90971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
91071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
91171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         srcImage += srcImageStride;
91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
920f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do.
921f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed.
922f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported.
923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void
925f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx,
92617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
9271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
928b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
9295253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul               GLubyte **dstSlices,
930f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
93960909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
94060909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
9411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
94222108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
943b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
9455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul       dstRowStride == bytesPerRow) {
9465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy image by image */
9475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLint img;
9485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      for (img = 0; img < srcDepth; img++) {
949d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstImage = dstSlices[img];
9505acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul         memcpy(dstImage, srcImage, bytesPerRow * srcHeight);
9515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         srcImage += srcImageStride;
9525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      }
953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
9545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   else {
9555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy row by row */
956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
959d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
9615acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul            memcpy(dstRow, srcRow, bytesPerRow);
962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
9716e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul/**
9726e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * General-case function for storing a color texture images with
9736e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * components that can be represented with ubytes.  Example destination
9746e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565.
9756e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul */
9766e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstatic GLboolean
9776e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstore_ubyte_texture(TEXSTORE_PARAMS)
9786e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul{
9796e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte);
9806e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   GLubyte *tempImage, *src;
9816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   GLint img;
9826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
9836e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
9846e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           baseInternalFormat,
9856e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           GL_RGBA,
9866e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcWidth, srcHeight, srcDepth,
9876e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcFormat, srcType, srcAddr,
9886e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcPacking);
9896e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   if (!tempImage)
9906e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return GL_FALSE;
9916e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
9926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   src = tempImage;
9936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   for (img = 0; img < srcDepth; img++) {
9946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight,
9956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 src, srcRowStride,
9966e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstSlices[img], dstRowStride);
9976e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      src += srcHeight * srcRowStride;
9986e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   }
9996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   free(tempImage);
10006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   return GL_TRUE;
10026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul}
10036e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10046e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10056e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
1006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1008bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image.
1009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
101049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1011b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
101325cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
1014755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   GLenum dstType;
1015a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1016bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32 ||
1017bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák          dstFormat == MESA_FORMAT_Z32_FLOAT);
101844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLuint));
1019f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1020755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   if (dstFormat == MESA_FORMAT_Z32)
1021755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_UNSIGNED_INT;
1022755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   else
1023755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_FLOAT;
1024755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt
1025966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1026966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1028a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1029a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1030bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák       srcType == dstType) {
1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
103217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1033d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
10345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1036f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1042d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1043f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
104460909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1047bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák                                    dstType, dstRow,
1048a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
1060e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
1061e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1063e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
1064e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1065a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1066e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1068e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
1069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1071f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1072d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
107460909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10761ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1077a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1078a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1086e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1087f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   (void) dims;
1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   {
1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      /* general path */
1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      GLint img, row;
1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      for (img = 0; img < srcDepth; img++) {
1102d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1119c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1120c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1121c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1122a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
112449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1125b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
112725cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
1128a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
11291f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
113044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLushort));
1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1132966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1133966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1137a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
113917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1140d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
11415253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
11471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1149d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
115160909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1153a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
11541ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1155a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1166defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
116849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1169b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
11711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
11721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
117344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1176a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1177f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1178f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
118017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1181d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
11825253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1183f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1186a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1187a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1188a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1190a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1192a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
11938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
11948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
119660909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1197a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
1198d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLubyte *dst = dstSlices[0];
1199a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1201a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1202a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1203defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
12041f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1205f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1206f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1207f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1208f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1209f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1210f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1211f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1212f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1213f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1214f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1215defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1216a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1218a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1219a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
12216e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
12226e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
12236e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
12246e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
123349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1234b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1236184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
123771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
12381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
1239d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBA8888_REV ||
1240d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888 ||
1241d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888_REV);
124244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
12452e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
1246b27792335e284bcddcbcfa807e5152feff330f58Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1247b27792335e284bcddcbcfa807e5152feff330f58Brian Paul                                            srcPacking->SwapBytes)) {
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
124917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1250d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
12515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
125571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
125646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
125746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
125846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1259528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
126071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
126146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
126271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
126371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1264528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
126571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
1266d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 ||
1267d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu                            dstFormat == MESA_FORMAT_RGBX8888)) ||
1268d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	  (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV ||
1269d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	                     dstFormat == MESA_FORMAT_RGBX8888_REV))) {
127046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
127146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
127246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
127346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
127446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
127546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
127646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
127746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
127846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
127946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
128046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
128171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
128271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
128371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
128446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1285528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
128671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
12875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
128871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
128971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
129071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
12926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
12936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
12946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
12956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1296a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1297a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1298a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1299a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1300a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
130149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1302b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1304184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
1305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
13061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
130774d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
13082d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888 ||
13092d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888_REV );
131044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1313a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1314b27792335e284bcddcbcfa807e5152feff330f58Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1315b27792335e284bcddcbcfa807e5152feff330f58Brian Paul                                            srcPacking->SwapBytes)) {
1316defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
131717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1318d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
13195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1320a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1321a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1322a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
132371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
132471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
132574d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
132674d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
13280c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
13290c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
133071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
133171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
13338c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13348c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
133571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
133671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1337d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
133871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1339259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
134124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
134224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
134324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
134424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
134571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
134971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
135071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
13531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
135471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
13550c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
135624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1357259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1359ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1360ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1361ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1362ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1363ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1364ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1365ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
13668c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13678c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1368ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1369ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1370d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1371ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1372259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1373ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
137424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
137524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
137624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
137724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
137871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
137971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
138071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
138171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
138271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
138371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
138471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
138546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
138646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
138746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
13880c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
138971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
139071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
139171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
139271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
13930c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
139471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
13951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
139674d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
13972d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
13982d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
139946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
140046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
140146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
140246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
140346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
140446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
14051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
140674d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
14072d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
140874d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
140946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
141046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
141146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
141246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
141346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
141471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
141571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
141746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
14180c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
141971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
1420b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
14215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                dstSlices,
142271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
142371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
142471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1425a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
14266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
14276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
14286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
14296e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1430a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1431a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1432a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1433a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
143549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1436b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
14381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
143944c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1443f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1444f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
144617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1447d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
14485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1457b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
14598c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14608c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
146160909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
146260909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1463d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
14753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
14763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
14773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
14783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
14793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
14803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
14813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
14823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
14833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1484167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
14853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1486167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
14873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
14883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
14893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
14903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
14913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
14923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
14933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
14945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
14953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
14963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
14973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
14996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
15006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
15016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
15026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
150849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1509b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1510a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
15111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
151244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1513a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1514a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1515a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1516f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1517f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1518a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
151917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1520d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
15215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1522a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1523a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1524a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1525a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1526a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1527a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1528a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1529a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1530a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1531a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
15328c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
15338c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
153460909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
153560909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1536d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1537a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1538a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1541a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1542a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1543a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1545a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1546a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1547a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
15483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
15493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
15503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
15513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
15523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
15543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
15563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1557167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
15583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1559167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
15603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
15613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
15633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
15643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
15653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
15663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
15675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
15683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
15693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
15703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
15726e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
15736e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
15746e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
15756e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1576a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1577a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1578a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1579a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1580a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
158149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1582b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
15841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
15851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
158644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1590f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1591f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
159317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1594d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
15955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
16006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16036e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1607a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
160849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1609dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1610dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
16111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
161244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1613a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1614dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1615dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1616453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1617453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1618dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1619dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
1620d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1622dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1623dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1624dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1625dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
16266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16296e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1630dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1631dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1632dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1633defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
163449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1635b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
16371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
16381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
163944c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1643453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1644453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
164617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1647d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
16536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16566e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1657a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1658a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1659a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1660a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1662621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean
1663621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
1664621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{
1665621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1666621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1667621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
166844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1669621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1670621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   if (!ctx->_ImageTransferState &&
1671453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       baseInternalFormat == GL_RGBA &&
1672453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1673453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1674621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* simple memcpy path */
1675621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      memcpy_texture(ctx, dims,
1676d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16775253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1678621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1679621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcAddr, srcPacking);
1680621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
1681621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   else {
1682621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* general path */
1683e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
1684621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseInternalFormat,
1685621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseFormat,
1686621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
1687621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcFormat, srcType, srcAddr,
168850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 srcPacking,
168950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 ctx->_ImageTransferState);
169050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák      const GLfloat *src = tempImage;
1691621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      GLint img, row, col;
1692621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      if (!tempImage)
1693621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         return GL_FALSE;
1694621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      for (img = 0; img < srcDepth; img++) {
1695d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1696621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         if (baseInternalFormat == GL_RGBA) {
1697621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
169850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
1699621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
170050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort a,r,g,b;
170150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
170250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
170350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
170450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
170550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
170650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
1707621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
1708621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
1709621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
1710621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
1711621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else if (baseInternalFormat == GL_RGB) {
1712621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
171350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
1714621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
171550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort r,g,b;
171650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
171750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
171850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
171950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
172050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
1721621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
1722621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
1723621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
1724621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
1725621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else {
1726621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            ASSERT(0);
1727621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         }
1728621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      }
1729621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      free((void *) tempImage);
1730621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
1731621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   return GL_TRUE;
1732621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák}
1733621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1734621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
173539de9251c4770fdcce3395643003aa626178446dBrian Paul/**
1736bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
1737bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */
1738bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean
1739bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS)
1740bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{
1741bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1742bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1743bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_AL44);
174444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
1745bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1746bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   {
1747bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      /* general path */
1748663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1749bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseInternalFormat,
1750bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseFormat,
1751bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
1752bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcFormat, srcType, srcAddr,
1753bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcPacking);
1754663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1755bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      GLint img, row, col;
1756bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      if (!tempImage)
1757bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         return GL_FALSE;
1758bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      for (img = 0; img < srcDepth; img++) {
1759d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1760bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         for (row = 0; row < srcHeight; row++) {
1761bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            GLubyte *dstUS = (GLubyte *) dstRow;
1762bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            for (col = 0; col < srcWidth; col++) {
1763bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               /* src[0] is luminance, src[1] is alpha */
1764663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstUS[col] = PACK_COLOR_44( src[1],
1765663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                           src[0] );
1766bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               src += 2;
1767bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            }
1768bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            dstRow += dstRowStride;
1769bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         }
1770bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      }
1771bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      free((void *) tempImage);
1772bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   }
1773bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   return GL_TRUE;
1774bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák}
1775bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1776bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1777bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/**
177839de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
177939de9251c4770fdcce3395643003aa626178446dBrian Paul */
178049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
17815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS)
1782f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1783184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
17841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1785f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
17861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
17875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL88_REV ||
17880a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul          dstFormat == MESA_FORMAT_GR88 ||
1789b4aecc4e1861e60e40e14868719219084967e46dBrian Paul          dstFormat == MESA_FORMAT_RG88);
179044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1791f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1792f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1793f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1794e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL88 &&
1795e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1796e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
17970a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul        (dstFormat == MESA_FORMAT_GR88 &&
1798e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
1799f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1800f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1801f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
180217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1803d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
18045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1805f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1806f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
1809bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
18123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
18133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
18143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
18163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
18175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
18185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
18195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
18205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
18215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 3;
18225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
18245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 3;
18255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
18265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
18283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
18290a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul	 if ((littleEndian && dstFormat == MESA_FORMAT_GR88) ||
1830b4aecc4e1861e60e40e14868719219084967e46dBrian Paul	     (!littleEndian && dstFormat == MESA_FORMAT_RG88)) {
18315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
18325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 1;
18335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
18355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 1;
18365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
18375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
18393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
18403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
18413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
18433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
18443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
18453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
18463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
18475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
18483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
18493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
18503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1853663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
185522108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1858f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1859663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1862f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1864d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1865f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
18675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL88 ||
18680a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul		dstFormat == MESA_FORMAT_GR88) {
1869f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1870ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1871663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88( src[1],
1872663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[0] );
1873f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
1874f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1876f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1877f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1878ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1879663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( src[1],
1880663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                 src[0] );
1881f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
1882f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1883a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1884a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1885a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1886a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
188732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1888a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1889a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1890a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1891a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1892a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
189339de9251c4770fdcce3395643003aa626178446dBrian Paul/**
189439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
189539de9251c4770fdcce3395643003aa626178446dBrian Paul */
189649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
18975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
18983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{
18993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLboolean littleEndian = _mesa_little_endian();
19003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
19013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
19035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL1616_REV ||
19045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	  dstFormat == MESA_FORMAT_RG1616 ||
19055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG1616_REV);
190644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
19073325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19083325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   if (!ctx->_ImageTransferState &&
19093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       !srcPacking->SwapBytes &&
1910e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL1616 &&
1911e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1912e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
1913e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede        (dstFormat == MESA_FORMAT_RG1616 &&
1914e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
19153325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       srcType == GL_UNSIGNED_SHORT &&
19163325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       littleEndian) {
19173325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* simple memcpy path */
19183325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      memcpy_texture(ctx, dims,
1919d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
19205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
19213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
19223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcAddr, srcPacking);
19233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
19243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   else {
19253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* general path */
1926e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
19273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseInternalFormat,
19283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseFormat,
19293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcWidth, srcHeight, srcDepth,
19303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcFormat, srcType, srcAddr,
1931bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
1932bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
19333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *src = tempImage;
19343325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      GLint img, row, col;
19353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      if (!tempImage)
19363325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         return GL_FALSE;
19373325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      for (img = 0; img < srcDepth; img++) {
1938d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
19393325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         for (row = 0; row < srcHeight; row++) {
19403325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            GLuint *dstUI = (GLuint *) dstRow;
19415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL1616 ||
19425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG1616) {
19433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
1944db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
1945db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
1946db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1947db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1948db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616(a, l);
1949db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
19503325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
19513325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
19523325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            else {
19533325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
1954db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
1955db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
1956db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1957db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1958db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
1959db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
19603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
19613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
19623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            dstRow += dstRowStride;
19633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         }
19643325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      }
196532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
19663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
19673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   return GL_TRUE;
19683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick}
19693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
1971fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */
19723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean
1973eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS)
19745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{
19755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLboolean littleEndian = _mesa_little_endian();
19765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
19775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
1978eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_R16 ||
1979bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák          dstFormat == MESA_FORMAT_A16 ||
1980fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_L16 ||
1981fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_I16);
198244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
19835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
19845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   if (!ctx->_ImageTransferState &&
19855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       !srcPacking->SwapBytes &&
1986eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák       baseInternalFormat == srcFormat &&
19875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcType == GL_UNSIGNED_SHORT &&
19885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       littleEndian) {
19895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* simple memcpy path */
19905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      memcpy_texture(ctx, dims,
1991d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
19925253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
19935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
19945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcAddr, srcPacking);
19955d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
19965d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   else {
19975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* general path */
1998e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
19995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseInternalFormat,
20005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseFormat,
20015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcWidth, srcHeight, srcDepth,
20025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcFormat, srcType, srcAddr,
2003bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2004bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
20055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *src = tempImage;
20065d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      GLint img, row, col;
20075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (!tempImage)
20085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         return GL_FALSE;
20095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      for (img = 0; img < srcDepth; img++) {
2010d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
20115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         for (row = 0; row < srcHeight; row++) {
20125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            GLushort *dstUS = (GLushort *) dstRow;
20135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    for (col = 0; col < srcWidth; col++) {
20145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       GLushort r;
20155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
20175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       dstUS[col] = r;
20185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       src += 1;
20195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    }
20205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            dstRow += dstRowStride;
20215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
20225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      }
20235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      free((void *) tempImage);
20245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   return GL_TRUE;
20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick}
20275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20295d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean
203017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
203117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{
203217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
203317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
203417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
203544c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 8);
203617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
203717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   if (!ctx->_ImageTransferState &&
203817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       !srcPacking->SwapBytes &&
203917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       baseInternalFormat == GL_RGBA &&
204017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcFormat == GL_RGBA &&
204117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcType == GL_UNSIGNED_SHORT) {
204217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* simple memcpy path */
204317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      memcpy_texture(ctx, dims,
2044d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
20455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
204617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
204717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcAddr, srcPacking);
204817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
204917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   else {
205017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* general path */
2051e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
205217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseInternalFormat,
205317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseFormat,
205417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcWidth, srcHeight, srcDepth,
205517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcFormat, srcType, srcAddr,
2056bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2057bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
205817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *src = tempImage;
205917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      GLint img, row, col;
206017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      if (!tempImage)
206117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         return GL_FALSE;
206217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      for (img = 0; img < srcDepth; img++) {
2063d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
206417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         for (row = 0; row < srcHeight; row++) {
206517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
206617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            for (col = 0; col < srcWidth; col++) {
206717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               GLushort r, g, b, a;
206817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
206917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
207017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
207117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
207217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
207317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+0] = r;
207417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+1] = g;
207517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+2] = b;
207617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+3] = a;
207717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               src += 4;
207817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            }
207917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            dstRow += dstRowStride;
208017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         }
208117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      }
208217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      free((void *) tempImage);
208317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
208417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   return GL_TRUE;
208517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul}
208617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
208717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
208817e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean
2089279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2090279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{
2091279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2092279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2093daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2094279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2095279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2096279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   if (!ctx->_ImageTransferState &&
2097279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       !srcPacking->SwapBytes &&
2098279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       baseInternalFormat == GL_RGBA &&
2099279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2100279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcFormat == GL_RGBA &&
2101279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcType == GL_SHORT) {
2102279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* simple memcpy path */
2103279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      memcpy_texture(ctx, dims,
2104d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
21055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2106279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2107279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcAddr, srcPacking);
2108279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2109279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   else {
2110279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* general path */
2111e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2112279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseInternalFormat,
2113279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseFormat,
2114279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2115279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcFormat, srcType, srcAddr,
2116bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2117bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2118279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *src = tempImage;
2119279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2120279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      GLint img, row, col;
2121279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2122279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      if (!tempImage)
2123279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         return GL_FALSE;
2124279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2125279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2126279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       * 3 or 4 components/pixel here.
2127279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       */
2128279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      for (img = 0; img < srcDepth; img++) {
2129d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2130279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         for (row = 0; row < srcHeight; row++) {
2131279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            GLshort *dstRowS = (GLshort *) dstRow;
2132daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
2133daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2134daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2135daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2136daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2137daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2138daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2139daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2140daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               }
2141daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2142daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 4 * srcWidth;
2143daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            } else {
2144daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2145daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2146daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2147daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2148daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
2149daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2150daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2151279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               }
2152daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2153daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 3 * srcWidth;
2154279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            }
2155279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         }
2156279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      }
2157279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      free((void *) tempImage);
2158279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2159279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   return GL_TRUE;
2160279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul}
2161279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2162279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2163279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean
2164b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
21661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
216744c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
21716f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
21726f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul                                            srcPacking->SwapBytes)) {
2173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
217417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
2175d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
21765253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
21816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
21826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
21836e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
21846e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
2185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
219349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2194bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS)
2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
21961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
219722108bb571808542b89677752d62d3901698265fBrian Paul
21981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
21991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
22005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_I8 ||
22015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_R8);
220244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2207f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
220917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
2210d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
22115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
22153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
22163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
22173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
22183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
22193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
22203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
22223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
22231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
22243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
22253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
22273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
22283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
22303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
22313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
22323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
22343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
22385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
224622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2247f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2250663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2255d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2258663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = src[col];
2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
226432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
22721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
227449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2275b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2277184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
227822108bb571808542b89677752d62d3901698265fBrian Paul
2279a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
22811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
22821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
228344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
229117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
2292d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                  dstFormat,
22935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                  dstRowStride, dstSlices,
2294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
23011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2305d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2307b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2308b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
231549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2316114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2317114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2318114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
23191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2320114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
23211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
232222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2323114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2324114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2325114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2326114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2327114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2328114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2329114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2330114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2331114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
2332d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
23335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2334114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2335114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2336114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2337114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2338114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2339114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2340114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2341114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2342114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2343114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2344114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2345114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2346114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2347114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2348114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2349114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2350114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2351114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2352114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2353114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2354114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2355114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2356114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2357114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
23585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
2359114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2360114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2361114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2362114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2363114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2364114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
23658c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
23668c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2367114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2368114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2369114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
237032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2371114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2372114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2373114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2374114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2375114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2376114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2377114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2378114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2379114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2380114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2381114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2382114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2383114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2384114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2388114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
2390d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      dst = (GLbyte *) dstSlices[0];
2391114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
239222108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
239422108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
239632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
240184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
240284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2403daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format.
240484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
240584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2406daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS)
240784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
240884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
240984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2410daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
2411daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L8 ||
2412daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I8 ||
2413daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_R8);
241444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
241584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2416daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2417daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2418daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2419daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE) {
2420daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2421daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2422d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
24235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2424daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2425daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2426daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2427daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
242884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2429e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
243084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
243184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
243284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
243384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2434bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2435bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
243784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
243884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
243984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
244084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2441d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
244284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
244384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2444daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
244584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
244684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
2447daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            src += srcWidth;
244884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
244984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
245084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
245184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
245284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
245384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
245484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
245584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
245684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2457daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format.
245884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
245984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2460daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS)
246184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
2462daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
246384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
246484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2465daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
2466daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
246744c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
246884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2469daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2470daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2471daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2472daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE &&
2473daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2474daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2475daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2476d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
24775253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2478daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2479daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2480daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2481daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
248284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2483e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
248484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
248584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
248684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
248784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2488bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2489bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2490daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
249184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
249284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
249384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
249484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2495d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
249684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2497daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
249884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2499daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
2500daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
2501daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2502daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
250384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
250484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
250584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
250684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
250784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
250884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
250984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
251084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
251184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2512daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */
2513daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2514daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS)
2515daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2517daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2518daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2519daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
2520daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_A16 ||
2521daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L16 ||
2522daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I16);
252344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2524daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2526daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2527daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2528daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
2529daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2530daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2531daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2532d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
25335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2534daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2535daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2536daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2537daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
2538daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
2539daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2540daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
2541daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
2542daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2543daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
2544daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
2545daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
2546daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
2547daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
2548daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
2549daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
2550daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
2551d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2552daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dstUS = (GLshort *) dstRow;
2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    for (col = 0; col < srcWidth; col++) {
2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       GLushort r;
2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
2558daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       dstUS[col] = r;
2559daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       src += 1;
2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    }
2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/**
2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */
2572daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2575daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2576daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2577daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2578daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
2579daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_GR1616);
258044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2581daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2582daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2583daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2584daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2585daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
2586daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2587daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2588daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2589d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
25905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2591daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2592daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2593daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2594daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
2595daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
2596daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2597daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
2598daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
2599daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2600daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
2601daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
2602daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
2603daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
2604daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
2605daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
2606daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
2607daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
2608d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2609daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
2610daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dst = (GLshort *) dstRow;
2611daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            for (col = 0; col < srcWidth; col++) {
2612daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               GLushort l, a;
2613daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2614daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
2615daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
2616daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = l;
2617daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = a;
2618daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2619daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
2620daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            }
2621daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
2622daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
2623daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
2624daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
2625daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2626daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
2627daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
262884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
262984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
263084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
263184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
263284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
263384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
263484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
263584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
263684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
263784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
263844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
263984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
264084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
264184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2642e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
264384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
264484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
264584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
264684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2647bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2648bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
264984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
265084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
265184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
265284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
265384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2654d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2656daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2658daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2659daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2660daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
26618778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul               dst[0] = 127;
2662daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               srcRow += 3;
2663daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 4;
266484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
266884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
267384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
267484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2675c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
267639de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
267739de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
2678c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
267949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2680c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
2681c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
26821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2683c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
26841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
26851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
268644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2687c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2688c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
2689c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
26906f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
26916f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul                                            srcPacking->SwapBytes)) {
2692c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
2693c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
2694d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
26955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2696c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2697c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
2698c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2699c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
2700c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
2701e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2702c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
270322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2704c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
2705c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
2706bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2707bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2708c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
2709c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
2710c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
2711c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
2712c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
2713d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2714c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
2715daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
27161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
2717c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2718daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2719daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2720daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2721daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2722c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
2723daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
2724c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
2725c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
2726bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
2727bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2728daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2729daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2730daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2731daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2732bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
2733daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
2734bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
2735bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
2736c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
2737c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
2738c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
273932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2740c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2741c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
2742c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
2743f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
274484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2745184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
2746184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
2747184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
274849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2749b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
2750184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
275192098438784887fd6005918794476cfbbeac5035Karl Schultz   const GLuint depthScale = 0xffffff;
2752c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
2753b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2754c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
275525cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
27561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
2757e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
2758e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
2759e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_STENCIL_INDEX);
2760c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2761184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2762e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f &&
2763966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
2764184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
2765ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
2766184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
2767d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
27685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2769184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2770184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
277139de9251c4770fdcce3395643003aa626178446dBrian Paul   }
2772e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
2773e41a91cea764cc1ba95906251cd907d837225293Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
2774c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      /* In case we only upload depth we need to preserve the stencil */
2775ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
2776d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul	 GLuint *dstRow = (GLuint *) dstSlices[img];
2777b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
2778b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2779c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcWidth, srcHeight,
2780c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcFormat, srcType,
2781c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  img, 0, 0);
2782ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
2783c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie            GLuint depth[MAX_WIDTH];
2784c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLubyte stencil[MAX_WIDTH];
2785ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
2786c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2787c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2788c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2789c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepstencil = GL_TRUE;
279039de9251c4770fdcce3395643003aa626178446dBrian Paul	    }
279139de9251c4770fdcce3395643003aa626178446dBrian Paul            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2792c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepdepth = GL_TRUE;
2793c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2794c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2795c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepdepth == GL_FALSE)
2796c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* the 24 depth bits will be in the low position: */
2797c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_depth_span(ctx, srcWidth,
2798c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       GL_UNSIGNED_INT, /* dst type */
2799c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       keepstencil ? depth : dstRow, /* dst addr */
2800c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       depthScale,
2801c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       srcType, src, srcPacking);
2802c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2803c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil == GL_FALSE)
2804c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* get the 8-bit stencil values */
2805c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_stencil_span(ctx, srcWidth,
2806c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 GL_UNSIGNED_BYTE, /* dst type */
2807c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 stencil, /* dst addr */
2808c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 srcType, src, srcPacking,
2809c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 ctx->_ImageTransferState);
2810c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2811c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    for (i = 0; i < srcWidth; i++) {
2812c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       if (keepstencil)
2813c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
2814c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       else
2815c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
2816c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2817ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
2818ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
2819b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
2820ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
2821ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
2822184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
2823184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
2824184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
2825184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2826184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2827a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
2828a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
2829a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
283049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2831a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
2832a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
2833a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
2834a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
2835b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2836a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
2837a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
28381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
283939de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
284039de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_DEPTH_COMPONENT ||
284139de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_STENCIL_INDEX);
284239de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
284339de9251c4770fdcce3395643003aa626178446dBrian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT);
2844c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
2845c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   for (img = 0; img < srcDepth; img++) {
2846d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLuint *dstRow = (GLuint *) dstSlices[img];
2847b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      const GLubyte *src
2848b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2849c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcWidth, srcHeight,
2850c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcFormat, srcType,
2851c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						img, 0, 0);
2852c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      for (row = 0; row < srcHeight; row++) {
2853c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint depth[MAX_WIDTH];
2854c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLubyte stencil[MAX_WIDTH];
2855c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLint i;
2856c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2857c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2858c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2859c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepstencil = GL_TRUE;
286039de9251c4770fdcce3395643003aa626178446dBrian Paul	 }
286139de9251c4770fdcce3395643003aa626178446dBrian Paul         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2862c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepdepth = GL_TRUE;
2863c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
2864666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2865c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepdepth == GL_FALSE)
2866c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* the 24 depth bits will be in the low position: */
2867c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_depth_span(ctx, srcWidth,
2868c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    GL_UNSIGNED_INT, /* dst type */
2869c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    keepstencil ? depth : dstRow, /* dst addr */
2870c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    depthScale,
2871c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    srcType, src, srcPacking);
2872c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2873c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepstencil == GL_FALSE)
2874c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* get the 8-bit stencil values */
2875c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_stencil_span(ctx, srcWidth,
2876c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      GL_UNSIGNED_BYTE, /* dst type */
2877c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      stencil, /* dst addr */
2878c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      srcType, src, srcPacking,
2879c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      ctx->_ImageTransferState);
2880c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2881c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 /* merge stencil values into depth values */
2882c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 for (i = 0; i < srcWidth; i++) {
2883c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil)
2884c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
2885c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    else
2886c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
2887666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2888c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
2889c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 src += srcRowStride;
2890c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 dstRow += dstRowStride / sizeof(GLuint);
2891a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
2892a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
2893a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
2894a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
2895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
289639de9251c4770fdcce3395643003aa626178446dBrian Paul
289739de9251c4770fdcce3395643003aa626178446dBrian Paul/**
289839de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data.
289939de9251c4770fdcce3395643003aa626178446dBrian Paul */
290039de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean
290139de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS)
290239de9251c4770fdcce3395643003aa626178446dBrian Paul{
290339de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8);
290439de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_STENCIL_INDEX);
290539de9251c4770fdcce3395643003aa626178446dBrian Paul
290639de9251c4770fdcce3395643003aa626178446dBrian Paul   if (!ctx->_ImageTransferState &&
290739de9251c4770fdcce3395643003aa626178446dBrian Paul       !srcPacking->SwapBytes &&
290839de9251c4770fdcce3395643003aa626178446dBrian Paul       baseInternalFormat == srcFormat &&
290939de9251c4770fdcce3395643003aa626178446dBrian Paul       srcType == GL_UNSIGNED_BYTE) {
291039de9251c4770fdcce3395643003aa626178446dBrian Paul      /* simple memcpy path */
291139de9251c4770fdcce3395643003aa626178446dBrian Paul      memcpy_texture(ctx, dims,
2912d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
29135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
291439de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
291539de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcAddr, srcPacking);
291639de9251c4770fdcce3395643003aa626178446dBrian Paul   }
291739de9251c4770fdcce3395643003aa626178446dBrian Paul   else {
291839de9251c4770fdcce3395643003aa626178446dBrian Paul      const GLint srcRowStride
2919b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
292039de9251c4770fdcce3395643003aa626178446dBrian Paul      GLint img, row;
292139de9251c4770fdcce3395643003aa626178446dBrian Paul
292239de9251c4770fdcce3395643003aa626178446dBrian Paul      for (img = 0; img < srcDepth; img++) {
2923d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2924b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
2925b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
292639de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcWidth, srcHeight,
292739de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcFormat, srcType,
292839de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   img, 0, 0);
292939de9251c4770fdcce3395643003aa626178446dBrian Paul         for (row = 0; row < srcHeight; row++) {
293039de9251c4770fdcce3395643003aa626178446dBrian Paul            GLubyte stencil[MAX_WIDTH];
293139de9251c4770fdcce3395643003aa626178446dBrian Paul            GLint i;
293239de9251c4770fdcce3395643003aa626178446dBrian Paul
293339de9251c4770fdcce3395643003aa626178446dBrian Paul            /* get the 8-bit stencil values */
293439de9251c4770fdcce3395643003aa626178446dBrian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
293539de9251c4770fdcce3395643003aa626178446dBrian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
293639de9251c4770fdcce3395643003aa626178446dBrian Paul                                      stencil, /* dst addr */
293739de9251c4770fdcce3395643003aa626178446dBrian Paul                                      srcType, src, srcPacking,
293839de9251c4770fdcce3395643003aa626178446dBrian Paul                                      ctx->_ImageTransferState);
293939de9251c4770fdcce3395643003aa626178446dBrian Paul            /* merge stencil values into depth values */
294039de9251c4770fdcce3395643003aa626178446dBrian Paul            for (i = 0; i < srcWidth; i++)
294139de9251c4770fdcce3395643003aa626178446dBrian Paul               dstRow[i] = stencil[i];
294239de9251c4770fdcce3395643003aa626178446dBrian Paul
294339de9251c4770fdcce3395643003aa626178446dBrian Paul            src += srcRowStride;
294439de9251c4770fdcce3395643003aa626178446dBrian Paul            dstRow += dstRowStride / sizeof(GLubyte);
294539de9251c4770fdcce3395643003aa626178446dBrian Paul         }
294639de9251c4770fdcce3395643003aa626178446dBrian Paul      }
294739de9251c4770fdcce3395643003aa626178446dBrian Paul
294839de9251c4770fdcce3395643003aa626178446dBrian Paul   }
294939de9251c4770fdcce3395643003aa626178446dBrian Paul
295039de9251c4770fdcce3395643003aa626178446dBrian Paul   return GL_TRUE;
295139de9251c4770fdcce3395643003aa626178446dBrian Paul}
295239de9251c4770fdcce3395643003aa626178446dBrian Paul
295339de9251c4770fdcce3395643003aa626178446dBrian Paul
2954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
2956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
2957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
2958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
2959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
2960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
2961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
2962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
296349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2964b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
2965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
29661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
296722108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
2968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
29691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
29701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
29711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
29721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
29731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
29740ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
29750ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT32 ||
29760ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT32);
2977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
2978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
2979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
2980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
2981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
29820ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
29830ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
29840ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
298544c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat));
2986f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2988f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2989f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
29909e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
2991f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
2992f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
299317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
2994d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
29955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3001e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3002f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
300322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3006bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3007bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3008b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
30099c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
3010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
30139c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3015d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3017c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dstRow, srcRow, bytesPerRow);
3018b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
3019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
3020f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
302332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3028c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
3032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
303349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3034b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
30361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
303722108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
30391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
30401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
30411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
30421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
30431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
30440ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
30450ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT16 ||
30460ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT16);
3047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
30520ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
30530ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
30540ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
305544c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB));
3056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
30609e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
3062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
306317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
3064d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
30655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3071e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
307322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3076bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3077bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
3079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
3082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3083d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3086f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
3087f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
3089f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
3090f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
3091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
3092f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3093f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3094f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
309532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3096f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3097f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3098f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3099f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3100f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3101abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */
3102abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3103abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3104abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3105abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3106abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3107abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
310838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT8 ||
310938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT8 ||
311038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT8 ||
311138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT8 ||
311238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT8 ||
311338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT8 ||
311438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT8 ||
311538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8);
3116abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3117abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3118f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3119f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3120abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3121abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3122abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3123abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
312444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte));
3125abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3126bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3127bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3128bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3129bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3130abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3131abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_BYTE) {
3132abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3133abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3134d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
31355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3136abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3137abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3138abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3139abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3140abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
31415f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
31425f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
31435f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
31445f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
31455f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
31465f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
31475f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
31485f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3149abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3150abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3151abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3152abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3153d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3154abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3155abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLbyte *dstTexel = (GLbyte *) dstRow;
3156abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3157abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3158abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLbyte) src[i];
3159abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3160abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3161abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3162abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3163abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3164abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3165abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3166abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3167abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3168abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3169abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3170abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3171abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */
3172abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3173abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3174abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3175abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3176abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3177abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
317838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT16 ||
317938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT16 ||
318038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT16 ||
318138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT16 ||
318238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT16 ||
318338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT16 ||
318438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT16 ||
318538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16);
3186abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3187abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3188f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3189f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3190abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3191abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3192abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3193abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
319444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort));
3195abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3196bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3197bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3198bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3199bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3200abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
32019fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul       srcType == GL_SHORT) {
3202abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3203abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3204d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
32055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3206abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3207abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3208abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3209abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3210abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
32115f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
32125f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
32135f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
32145f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
32155f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
32165f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
32175f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
32185f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3219abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3220abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3221abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3223d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3225abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLshort *dstTexel = (GLshort *) dstRow;
3226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3227abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3229abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3231abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3232abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3233abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3234abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3236abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3237abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3238abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3239abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3240abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3241abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */
3242abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3243abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3244abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3245abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3246abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3247abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
324838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT32 ||
324938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT32 ||
325038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT32 ||
325138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT32 ||
325238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT32 ||
325338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT32 ||
325438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT32 ||
325538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32);
3256abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3257abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3258f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3259f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3260abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3261abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3262abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3263abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
326444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint));
3265abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3266bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3267bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3268bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3269bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3271abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_INT) {
3272abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3273abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3274d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
32755253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3276abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3277abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3278abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3280abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
32815f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
32825f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
32835f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
32845f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
32855f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
32865f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
32875f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
32885f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3289abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3290abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3291abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3292abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3293d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3294abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3295abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint *dstTexel = (GLint *) dstRow;
3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */
3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3315abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3316abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3317abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
331838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT8 ||
331938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT8 ||
332038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT8 ||
332138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT8 ||
332238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT8 ||
332338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT8 ||
332438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT8 ||
332538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
3326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3328f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3329f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
333444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte));
3335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3336bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3337bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3338bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3339bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_BYTE) {
3342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3344d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
33455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3351dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3352dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3353dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3354dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3355dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3360d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLubyte *dstTexel = (GLubyte *) dstRow;
3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3365dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
3366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */
3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
338538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT16 ||
338638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT16 ||
338738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT16 ||
338838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT16 ||
338938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT16 ||
339038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT16 ||
339138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT16 ||
339238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
3393abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3394abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3395f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3396f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
340144c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort));
3402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3403bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3404bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3405bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3406bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3408abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_SHORT) {
3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3410abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3411d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
34125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3413abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3418dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3419dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3420dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3421dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3422dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3425abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3426abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3427d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3428abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3429abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLushort *dstTexel = (GLushort *) dstRow;
3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3431abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3435abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3439abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3440abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3441abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3442abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3443abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3444abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3445abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */
3446abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
345238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT32 ||
345338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT32 ||
345438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT32 ||
345538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT32 ||
345638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT32 ||
345738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT32 ||
345838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT32 ||
345938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3462f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3463f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3466abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3467abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
346844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint));
3469abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3470bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3471bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3472bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3473bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_INT) {
3476abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3477abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3478d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
34795253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3482abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3484abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3492abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3493abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3494d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLuint *dstTexel = (GLuint *) dstRow;
3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = src[i];
3500abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3501abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3502abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3503abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3505abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3509abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3513abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
35148d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
351549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
35168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
35178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
35181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
351946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
352046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
35211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
352246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
352346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
35241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
352546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
35260f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
35275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
35285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
352939de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcWidth, srcHeight, srcDepth,
353039de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcFormat, srcType,
353139de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcAddr, srcPacking);
353246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
35338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
35348d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
353554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
353649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
35378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
35388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
35391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
354046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
354146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
35421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
354346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
354446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
35451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
354646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
35475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
35485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
354946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
355046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
355146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
355246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
35538d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
35548d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
355554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
355649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
35575bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
35585bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
35591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
35605bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
35615bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
35621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
35635bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
35645bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
35651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
35665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
35675bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
35685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
35695253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
35705bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
35715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
35725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
35735bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
35745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
35755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
35765bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
357749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
35788d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
35798d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
35801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
358146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
358246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
35831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
358446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
35851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
358646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
358754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
3588bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
35895253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
35905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
35915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcWidth, srcHeight, srcDepth,
35925253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcFormat, srcType,
35935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcAddr, srcPacking);
359446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
35958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
35968d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
359754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
359849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
35998d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
36008d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
360246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
360346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36041f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
360546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
360646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
36071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
360846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
36105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      newDstFormat,
36115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      dstRowStride, dstSlices,
36125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcWidth, srcHeight, srcDepth,
36135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcFormat, srcType,
36145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcAddr, srcPacking);
361546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
36189927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
36199927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
36209927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
36219927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
36229927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
36239927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
36249927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
36259927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
36269927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
36278d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
36288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
36299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean
36309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
36319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{
36329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
36339d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
36349d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
36359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(baseInternalFormat == GL_RGB);
36369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
36379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   if (!ctx->_ImageTransferState &&
363807ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
363907ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
36409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* simple memcpy path */
36419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      memcpy_texture(ctx, dims,
3642d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
36435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
36449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
36459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcAddr, srcPacking);
36469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
36479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   else {
36489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* general path */
36499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
36509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseInternalFormat,
36519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseFormat,
36529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
36539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcFormat, srcType, srcAddr,
36549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcPacking,
36559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 ctx->_ImageTransferState);
36569d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *srcRow = tempImage;
36579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      GLint img, row, col;
36589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      if (!tempImage)
36599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         return GL_FALSE;
36609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      for (img = 0; img < srcDepth; img++) {
3661d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
36629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         for (row = 0; row < srcHeight; row++) {
36639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint *dstUI = (GLuint*)dstRow;
36649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (col = 0; col < srcWidth; col++) {
36659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]);
36669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
36679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            dstRow += dstRowStride;
36689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            srcRow += srcWidth * 3;
36699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
36709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      }
36719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
36729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      free((void *) tempImage);
36739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
36749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   return GL_TRUE;
36759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák}
3676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3677631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean
3678631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
3679631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{
3680631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3681631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3682631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
3683631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(baseInternalFormat == GL_RGB);
3684631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3685631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   if (!ctx->_ImageTransferState &&
368607ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
368707ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
3688631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* simple memcpy path */
3689631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      memcpy_texture(ctx, dims,
3690d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
36915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3692631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3693631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcAddr, srcPacking);
3694631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
3695631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   else {
3696631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* general path */
3697631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3698631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseInternalFormat,
3699631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseFormat,
3700631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
3701631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcFormat, srcType, srcAddr,
3702631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcPacking,
3703631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 ctx->_ImageTransferState);
3704631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *srcRow = tempImage;
3705631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      GLint img, row, col;
3706631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      if (!tempImage)
3707631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         return GL_FALSE;
3708631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      for (img = 0; img < srcDepth; img++) {
3709d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3710631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         for (row = 0; row < srcHeight; row++) {
3711631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint *dstUI = (GLuint*)dstRow;
3712631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (col = 0; col < srcWidth; col++) {
3713631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]);
3714631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
3715631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            dstRow += dstRowStride;
3716631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            srcRow += srcWidth * 3;
3717631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
3718631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      }
3719631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3720631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      free((void *) tempImage);
3721631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
3722631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   return GL_TRUE;
3723631d23daa91c569bf268a2191bd466df73a64263Marek Olšák}
3724631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3725485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3726b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean
3727b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
3728b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{
3729b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
3730b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL ||
3731b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
3732b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_STENCIL_INDEX);
3733b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat != GL_DEPTH_STENCIL ||
3734b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
3735b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3736b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL &&
3737b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthScale == 1.0f &&
3738b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthBias == 0.0f &&
3739b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       !srcPacking->SwapBytes) {
3740b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* simple path */
3741b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      memcpy_texture(ctx, dims,
3742d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
37435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3744b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3745b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcAddr, srcPacking);
3746b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
3747b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
3748b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
3749b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      GLint img, row;
3750b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      const GLint srcRowStride
3751b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
3752b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         / sizeof(uint64_t);
3753b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3754b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* In case we only upload depth we need to preserve the stencil */
3755b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      for (img = 0; img < srcDepth; img++) {
3756d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         uint64_t *dstRow = (uint64_t *) dstSlices[img];
3757b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         const uint64_t *src
3758b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
3759b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcWidth, srcHeight,
3760b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcFormat, srcType,
3761b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  img, 0, 0);
3762b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         for (row = 0; row < srcHeight; row++) {
3763b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            /* The unpack functions with:
3764b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
3765b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * only write their own dword, so the other dword (stencil
3766b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * or depth) is preserved. */
3767b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_STENCIL_INDEX)
3768b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_depth_span(ctx, srcWidth,
3769b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3770b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       dstRow, /* dst addr */
3771a240c998ac649d79f423bb0c445993132cd56f97Brian Paul                                       ~0U, srcType, src, srcPacking);
3772b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3773b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_DEPTH_COMPONENT)
3774b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_stencil_span(ctx, srcWidth,
3775b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3776b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         dstRow, /* dst addr */
3777b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         srcType, src, srcPacking,
3778b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         ctx->_ImageTransferState);
3779b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3780b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            src += srcRowStride;
3781b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            dstRow += dstRowStride / sizeof(uint64_t);
3782b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         }
3783b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      }
3784b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
3785b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   return GL_TRUE;
3786b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák}
3787b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3788920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
3789f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
3790f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{
3791f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3792f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3793f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT);
379444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
3795f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
379607ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul   if (baseInternalFormat == GL_RGBA &&
379707ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
379807ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
3799f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* simple memcpy path */
3800f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      memcpy_texture(ctx, dims,
3801d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
3802f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     dstRowStride, dstSlices,
3803f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3804f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcAddr, srcPacking);
3805f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
3806f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   else {
3807f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* general path */
3808f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3809f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseInternalFormat,
3810f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseFormat,
3811f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcWidth, srcHeight,
3812f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcDepth, srcFormat,
3813f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcType, srcAddr,
3814f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcPacking);
3815f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *src = tempImage;
3816f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      GLint img, row, col;
3817f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      if (!tempImage)
3818f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         return GL_FALSE;
3819f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      for (img = 0; img < srcDepth; img++) {
3820d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3821f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3822f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         for (row = 0; row < srcHeight; row++) {
3823f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            GLuint *dstUI = (GLuint *) dstRow;
3824f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            for (col = 0; col < srcWidth; col++) {
3825f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               GLushort a,r,g,b;
3826f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               r = src[RCOMP];
3827f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               g = src[GCOMP];
3828f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               b = src[BCOMP];
3829f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               a = src[ACOMP];
3830f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
3831f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               src += 4;
3832f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            }
3833f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            dstRow += dstRowStride;
3834f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         }
3835f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      }
3836f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      free((void *) tempImage);
3837f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
3838f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   return GL_TRUE;
3839f449be660e70aac2aefd2ce84581e137de25520bDave Airlie}
3840f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3841f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean
3842920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
3843920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
3844920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
3845920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
3846920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
38475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   (void) dstRowStride; (void) dstSlices,
3848920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
3849920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
3850920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
3851920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
3852920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3853920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
3854920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
3855920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
3856920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
3857920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3858920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3859485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
3860485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
3861485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
3862e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
3863485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
3864485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
38656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static StoreTexImageFunc table[MESA_FORMAT_COUNT];
38666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static GLboolean initialized = GL_FALSE;
38676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
38686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   if (!initialized) {
38696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_NONE] = _mesa_texstore_null;
38706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
38716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888;
38726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888;
38736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888;
38746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888;
3875d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888;
3876d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888;
38776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888;
38786e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888;
38796e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888;
38806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888;
38816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565;
38826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565;
38836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444;
38846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444;
38856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551;
38866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555;
38876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555;
38886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44;
38896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88;
38906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88;
38916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616;
38926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616;
38936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332;
38946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A8] = _mesa_texstore_unorm8;
38956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A16] = _mesa_texstore_unorm16;
38966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L8] = _mesa_texstore_unorm8;
38976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L16] = _mesa_texstore_unorm16;
38986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I8] = _mesa_texstore_unorm8;
38996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I16] = _mesa_texstore_unorm16;
39006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
39016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
39026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R8] = _mesa_texstore_unorm8;
39030a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul      table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88;
3904b4aecc4e1861e60e40e14868719219084967e46dBrian Paul      table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88;
39056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R16] = _mesa_texstore_unorm16;
39066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616;
39076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616;
39086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010;
39096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8;
39106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24;
39116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z16] = _mesa_texstore_z16;
39126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24;
39136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8;
39146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32] = _mesa_texstore_z32;
39156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8] = _mesa_texstore_s8;
39166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8;
39176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8;
39186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8;
39196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SL8] = _mesa_texstore_sl8;
39206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8;
39216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1;
39226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1;
39236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3;
39246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5;
39256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1;
39266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1;
39276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1;
39286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1;
39296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3;
39306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5;
39316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32;
39326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16;
39336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32;
39346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16;
39356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
39366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
39376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32;
39386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16;
39396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
39406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
39416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32;
39426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16;
39436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32;
39446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16;
39456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32;
39466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16;
39476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8;
39486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8;
39496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88;
39506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888;
39516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888;
39526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888;
39536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16;
39546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616;
39556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16;
39566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16;
39576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16;
39586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1;
39596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1;
39606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2;
39616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2;
39626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1;
39636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1;
39646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2;
39656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2;
3966d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8;
39676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8;
39686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8;
39696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88;
39706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8;
39716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16;
39726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16;
39736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616;
39746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16;
39756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5;
39766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
39776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32;
39786e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8;
397938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
398038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
398138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
398238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
398338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8;
398438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16;
398538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32;
398638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
398738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8;
398838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16;
398938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32;
399038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8;
399138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16;
399238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32;
399338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
399438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8;
399538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16;
399638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32;
399738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8;
399838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16;
399938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32;
400038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
400138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
400238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
400338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
400438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8;
400538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16;
400638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32;
400738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
400838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8;
400938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8;
401038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8;
401138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8;
401238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16;
401338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16;
401438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16;
401538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16;
401638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32;
401738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32;
401838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32;
401938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32;
402038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
402138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8;
402238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8;
402338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8;
402438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8;
402538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16;
402638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16;
402738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16;
402838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16;
402938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32;
403038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32;
403138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32;
403238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32;
403338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
4034f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint;
40356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      initialized = GL_TRUE;
4036485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
4037920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
40386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   ASSERT(table[format]);
40396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   return table[format];
4040485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
4041485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4042485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4043660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
4044660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
4045660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
4046660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
4047660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
4048660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
4049660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
4050660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
4051660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
4052660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
40531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
4054660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4055660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
4056d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                        dstFormat,
40575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                        dstRowStride, dstSlices,
4058660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
4059660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
4060660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
4061660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
4062660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4063485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
406481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/**
406581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it.
406681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture
406781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from
406881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values.
406981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat  the user-provided image format
407081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat  the destination texture format
407181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */
407281430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield
407381430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat)
40745999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
407581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT)
407681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul       && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL)
407781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
407881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   else
407964fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul      return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
40805999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
40815999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
40825c818c6277247468ccf69abda00f5bc220b59644Brian Paul
4083ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
40845c818c6277247468ccf69abda00f5bc220b59644Brian Paul * Helper function for storing 1D, 2D, 3D whole and subimages into texture
40855c818c6277247468ccf69abda00f5bc220b59644Brian Paul * memory.
40865c818c6277247468ccf69abda00f5bc220b59644Brian Paul * The source of the image data may be user memory or a PBO.  In the later
40875c818c6277247468ccf69abda00f5bc220b59644Brian Paul * case, we'll map the PBO, copy from it, then unmap it.
40885c818c6277247468ccf69abda00f5bc220b59644Brian Paul */
40895c818c6277247468ccf69abda00f5bc220b59644Brian Paulstatic void
40905c818c6277247468ccf69abda00f5bc220b59644Brian Paulstore_texsubimage(struct gl_context *ctx,
40915c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  struct gl_texture_image *texImage,
40925c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLint xoffset, GLint yoffset, GLint zoffset,
40935c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLint width, GLint height, GLint depth,
40945c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLenum format, GLenum type, const GLvoid *pixels,
40955c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  const struct gl_pixelstore_attrib *packing,
40965c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  const char *caller)
40975c818c6277247468ccf69abda00f5bc220b59644Brian Paul
40985c818c6277247468ccf69abda00f5bc220b59644Brian Paul{
40995c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat);
41005c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLenum target = texImage->TexObject->Target;
41015c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLboolean success = GL_FALSE;
41025c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLuint dims, slice, numSlices = 1, sliceOffset = 0;
41035c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLint srcImageStride = 0;
41045c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLubyte *src;
41055c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41065c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(xoffset + width <= texImage->Width);
41075c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(yoffset + height <= texImage->Height);
41085c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(zoffset + depth <= texImage->Depth);
41095c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41105c818c6277247468ccf69abda00f5bc220b59644Brian Paul   switch (target) {
41115c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D:
41125c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 1;
41135c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41145c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D_ARRAY:
41155c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_3D:
41165c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 3;
41175c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41185c818c6277247468ccf69abda00f5bc220b59644Brian Paul   default:
41195c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 2;
41205c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
41215c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41225c818c6277247468ccf69abda00f5bc220b59644Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
41235c818c6277247468ccf69abda00f5bc220b59644Brian Paul   src = (const GLubyte *)
41245c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
41255c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  format, type, pixels, packing, caller);
41265c818c6277247468ccf69abda00f5bc220b59644Brian Paul   if (!src)
41275c818c6277247468ccf69abda00f5bc220b59644Brian Paul      return;
41285c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41295c818c6277247468ccf69abda00f5bc220b59644Brian Paul   /* compute slice info (and do some sanity checks) */
41305c818c6277247468ccf69abda00f5bc220b59644Brian Paul   switch (target) {
41315c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D:
41325c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_RECTANGLE:
41335c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_CUBE_MAP:
41345c818c6277247468ccf69abda00f5bc220b59644Brian Paul      /* one image slice, nothing special needs to be done */
41355c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41365c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D:
41375c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(height == 1);
41385c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(depth == 1);
41395c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(yoffset == 0);
41405c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(zoffset == 0);
41415c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41425c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D_ARRAY:
41435c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(depth == 1);
41445c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(zoffset == 0);
41455c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = height;
41465c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = yoffset;
41475c818c6277247468ccf69abda00f5bc220b59644Brian Paul      height = 1;
41485c818c6277247468ccf69abda00f5bc220b59644Brian Paul      yoffset = 0;
41495c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_row_stride(packing, width, format, type);
41505c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41515c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D_ARRAY:
41525c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = depth;
41535c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = zoffset;
41545c818c6277247468ccf69abda00f5bc220b59644Brian Paul      depth = 1;
41555c818c6277247468ccf69abda00f5bc220b59644Brian Paul      zoffset = 0;
41565c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_image_stride(packing, width, height,
41575c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                                format, type);
41585c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41595c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_3D:
41605c818c6277247468ccf69abda00f5bc220b59644Brian Paul      /* we'll store 3D images as a series of slices */
41615c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = depth;
41625c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = zoffset;
41635c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_image_stride(packing, width, height,
41645c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                                format, type);
41655c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
41665c818c6277247468ccf69abda00f5bc220b59644Brian Paul   default:
41675c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target);
41685c818c6277247468ccf69abda00f5bc220b59644Brian Paul      return;
41695c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
41705c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41715c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(numSlices == 1 || srcImageStride != 0);
41725c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41735c818c6277247468ccf69abda00f5bc220b59644Brian Paul   for (slice = 0; slice < numSlices; slice++) {
41745c818c6277247468ccf69abda00f5bc220b59644Brian Paul      GLubyte *dstMap;
41755c818c6277247468ccf69abda00f5bc220b59644Brian Paul      GLint dstRowStride;
41765c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41775c818c6277247468ccf69abda00f5bc220b59644Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage,
41785c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  slice + sliceOffset,
41795c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  xoffset, yoffset, width, height,
41805c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  mapMode, &dstMap, &dstRowStride);
41815c818c6277247468ccf69abda00f5bc220b59644Brian Paul      if (dstMap) {
41825c818c6277247468ccf69abda00f5bc220b59644Brian Paul         /* Note: we're only storing a 2D (or 1D) slice at a time but we need
41835c818c6277247468ccf69abda00f5bc220b59644Brian Paul          * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is
41845c818c6277247468ccf69abda00f5bc220b59644Brian Paul          * used for 3D images.
41855c818c6277247468ccf69abda00f5bc220b59644Brian Paul          */
41865c818c6277247468ccf69abda00f5bc220b59644Brian Paul         success = _mesa_texstore(ctx, dims, texImage->_BaseFormat,
41875c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  texImage->TexFormat,
41885c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  dstRowStride,
41895c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  &dstMap,
41905c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  width, height, 1,  /* w, h, d */
41915c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  format, type, src, packing);
41925c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41935c818c6277247468ccf69abda00f5bc220b59644Brian Paul         ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset);
41945c818c6277247468ccf69abda00f5bc220b59644Brian Paul      }
41955c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41965c818c6277247468ccf69abda00f5bc220b59644Brian Paul      src += srcImageStride;
41975c818c6277247468ccf69abda00f5bc220b59644Brian Paul
41985c818c6277247468ccf69abda00f5bc220b59644Brian Paul      if (!success)
41995c818c6277247468ccf69abda00f5bc220b59644Brian Paul         break;
42005c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
42015c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42025c818c6277247468ccf69abda00f5bc220b59644Brian Paul   if (!success)
42035c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
42045c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42055c818c6277247468ccf69abda00f5bc220b59644Brian Paul   _mesa_unmap_teximage_pbo(ctx, packing);
42065c818c6277247468ccf69abda00f5bc220b59644Brian Paul}
42075c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42085c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42095c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42105c818c6277247468ccf69abda00f5bc220b59644Brian Paul/**
42115c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage1D().
42128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
421492c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage1d(struct gl_context *ctx,
421592c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       struct gl_texture_image *texImage,
42168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
42178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint border,
42188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const GLvoid *pixels,
421992c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       const struct gl_pixelstore_attrib *packing)
42208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4221b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0)
4222b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4223b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
422478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
422578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
422678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, 1, 1)) {
42277d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
42287d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
42297d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
42308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42315c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
42325c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     0, 0, 0, width, 1, 1,
42335c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexImage1D");
42348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42376b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
42385c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage2D().
42398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
424192c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage2d(struct gl_context *ctx,
424292c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       struct gl_texture_image *texImage,
42438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
42448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint border,
42458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
424692c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       const struct gl_pixelstore_attrib *packing)
42478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4248b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0 || height == 0)
4249b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4250b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
425178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
425278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
425378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
42547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
42557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
42567d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
42578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42585c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
42595c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     0, 0, 0, width, height, 1,
42605c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexImage2D");
42618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42656b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
42665c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage3D().
42678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
426992c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage3d(struct gl_context *ctx,
427092c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       struct gl_texture_image *texImage,
42718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
42728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint depth, GLint border,
42738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
427492c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul                       const struct gl_pixelstore_attrib *packing)
42758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4276b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0 || height == 0 || depth == 0)
4277b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4278b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
427978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
428078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
428178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, depth)) {
428278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
42837d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
42847d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
42858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42865c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
42875c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     0, 0, 0, width, height, depth,
42885c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexImage3D");
42898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
42955c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage1D().
42968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4298da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage1d(struct gl_context *ctx,
4299da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          struct gl_texture_image *texImage,
43008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint width,
43018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
4302da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          const struct gl_pixelstore_attrib *packing)
43038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
43045c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
43055c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     xoffset, 0, 0, width, 1, 1,
43065c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexSubImage1D");
43078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
431089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
43125c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage2D().
43138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4315da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage2d(struct gl_context *ctx,
4316da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          struct gl_texture_image *texImage,
43178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset,
43188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height,
43198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
4320da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          const struct gl_pixelstore_attrib *packing)
43218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
43225c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
43235c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     xoffset, yoffset, 0, width, height, 1,
43245c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexSubImage2D");
43258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
43295c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage3D().
43308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4332da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage3d(struct gl_context *ctx,
4333da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          struct gl_texture_image *texImage,
43348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset, GLint zoffset,
43358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height, GLint depth,
43368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
4337da0cc82a093eb97212e989648da638a262ed3e84Brian Paul                          const struct gl_pixelstore_attrib *packing)
43388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
43395c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
43405c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     xoffset, yoffset, zoffset, width, height, depth,
43415c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     format, type, pixels, packing, "glTexSubImage3D");
43428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43452aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/*
43468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D()
43478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
434978527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx,
435094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  struct gl_texture_image *texImage,
43518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
43528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint border,
435394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  GLsizei imageSize, const GLvoid *data)
43548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
435594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul   /* no compressed 1D image formats at this time */
4356a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4357a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
4358a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) border;
4359a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4360a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
43618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4365b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
43668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D()
43678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
436978527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx,
437094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  struct gl_texture_image *texImage,
43718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
43728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint border,
437394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  GLsizei imageSize, const GLvoid *data)
43748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4375bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt   /* This is pretty simple, because unlike the general texstore path we don't
4376bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * have to worry about the usual image unpacking or image transfer
4377bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * operations.
43788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
437989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
438089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
438189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
438289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
438389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
438478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
438578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
438678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
438778026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
438889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
438989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
439089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
439194a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul   _mesa_store_compressed_texsubimage2d(ctx, texImage,
4392bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					0, 0,
4393bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					width, height,
4394bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					texImage->TexFormat,
439594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul					imageSize, data);
43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
44018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D()
44028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
44038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
440478527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx,
440594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  struct gl_texture_image *texImage,
44068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
44078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint depth,
44088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint border,
440994a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                  GLsizei imageSize, const GLvoid *data)
44108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
441189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
4412a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4413a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
4414a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
4415a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
4416a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4417a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
44188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
44198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
442289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
442389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D()
4424e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
4425e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
442694a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage1d(struct gl_context *ctx,
442794a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     struct gl_texture_image *texImage,
442889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLsizei width,
442989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
443094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLsizei imageSize, const GLvoid *data)
4431e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{
44325999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 1D texture formats yet */
4433a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4434a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) width;
4435a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
4436a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4437a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
4438e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul}
4439e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
4440e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
444189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
444289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D()
444389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
444489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
444594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage2d(struct gl_context *ctx,
444694a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     struct gl_texture_image *texImage,
444789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLint yoffset,
444889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei width, GLsizei height,
444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
445094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLsizei imageSize, const GLvoid *data)
445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
445281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint bytesPerRow, dstRowStride, srcRowStride;
445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
445481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
445589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
44561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
4457d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
44585999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4459d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
44605999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
446189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* these should have been caught sooner */
4462079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt   ASSERT((width % bw) == 0 || width < bw);
4463079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt   ASSERT((height % bh) == 0 || height < bh);
4464d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((xoffset % bw) == 0);
4465d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((yoffset % bh) == 0);
446689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4467b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
4470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
44717a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
44727a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
44737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
44742594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
447589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
447689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
447706913497d6b17f454bf4c5b8601d391980eb8265Brian Paul   /* Map dest texture buffer */
447881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
447981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
448064fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul                               GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
448181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
448289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
44831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
44841ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      bytesPerRow = srcRowStride;  /* bytes per row of blocks */
44851e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt      rows = (height + bh - 1) / bh;  /* rows in blocks */
448689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
44871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      /* copy rows of blocks */
44881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      for (i = 0; i < rows; i++) {
44891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         memcpy(dstMap, src, bytesPerRow);
44901ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         dstMap += dstRowStride;
44911ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         src += srcRowStride;
44921ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
44938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
44941ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
44951ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
44961ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
44971ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
44981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
449981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
450071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
450289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
450389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
450489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
450589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D()
450689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
450789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
450894a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage3d(struct gl_context *ctx,
450994a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     struct gl_texture_image *texImage,
451094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLint xoffset, GLint yoffset, GLint zoffset,
451194a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLsizei width, GLsizei height, GLsizei depth,
451294a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLenum format,
451394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul                                     GLsizei imageSize, const GLvoid *data)
451489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
45155999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 3D texture formats yet */
4516a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4517a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) yoffset; (void) zoffset;
4518a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
4519a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
4520a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4521a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
452289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
4523