texstore.c revision 229ebf511dcd9b501d9299cfc06d029d1d50079d
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"
588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h"
598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h"
6024edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h"
61db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
620117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
64b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h"
653c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
6689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
67da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h"
688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h"
69da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h"
708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h"
718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
722e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h"
731271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
74631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
76248200737398a7d6403a23930a6c9d93db06b942Brian Paul
77fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
78fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
8171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
82248200737398a7d6403a23930a6c9d93db06b942Brian Paul
83248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
85e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
90248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
91248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
92248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
93248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
94248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
1043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
1095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG:
11071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
11171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
1315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   IDX_RG,
132fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
139fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1412e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
151fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
157fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
163fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
169fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
175fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
176fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   {
2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      IDX_RG,
2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP4(0, 1, ZERO, ONE),
2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP2(0, 1)
2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   },
224fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
228248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
229248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
230248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
231248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
232248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
233fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
2475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG: return IDX_RG;
248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
249fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
259fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
260fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
267248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
268248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
269248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
270248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2722e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2796b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0
280298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[0],
284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[1],
285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[2],
286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[3],
287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[4],
288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[5]);
2896b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif
290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
29839de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
316e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat *
317e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
318e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum logicalBaseFormat,
319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum textureBaseFormat,
320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum srcFormat, GLenum srcType,
322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const GLvoid *srcAddr,
323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const struct gl_pixelstore_attrib *srcPacking,
324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLbitfield transferOps)
325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
327a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint components = _mesa_components_in_format(logicalBaseFormat);
328a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint srcStride =
329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLfloat *dst;
331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLint img, row;
332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
3375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
3385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
3475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
3485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
355a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
356a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				  * components * sizeof(GLfloat));
357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   if (!tempImage)
358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      return NULL;
359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   dst = tempImage;
361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   for (img = 0; img < srcDepth; img++) {
362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      const GLubyte *src
363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcWidth, srcHeight,
365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcFormat, srcType,
366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 img, 0, 0);
367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      for (row = 0; row < srcHeight; row++) {
368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       dst, srcFormat, srcType, src,
370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       srcPacking, transferOps);
371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 dst += srcWidth * components;
372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 src += srcStride;
373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
3823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
38413ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
38513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
39332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
39632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
41632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
425dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values.  Used for unsigned
426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures.
427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */
428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint *
429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims,
430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum logicalBaseFormat,
431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum textureBaseFormat,
432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum srcFormat, GLenum srcType,
434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const GLvoid *srcAddr,
435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const struct gl_pixelstore_attrib *srcPacking)
436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{
437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *tempImage;
438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint srcStride =
440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *dst;
442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLint img, row;
443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(dims >= 1 && dims <= 3);
445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RGB ||
448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RG ||
449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RED ||
450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_INTENSITY ||
453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_ALPHA);
454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RGB ||
457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RG ||
458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RED ||
459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE ||
461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_ALPHA);
462dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
463dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                 * components * sizeof(GLuint));
465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (!tempImage)
466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      return NULL;
467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   dst = tempImage;
469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   for (img = 0; img < srcDepth; img++) {
470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLubyte *src
471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcWidth, srcHeight,
473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcFormat, srcType,
474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 img, 0, 0);
475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (row = 0; row < srcHeight; row++) {
476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      dst, srcFormat, srcType, src,
478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      srcPacking);
479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 dst += srcWidth * components;
480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 src += srcStride;
481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* more work */
486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLuint *newImage;
489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint i, n;
490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLubyte map[6];
491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* The actual texture format should have at least as many components
497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       * as the logical texture format.
498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       */
499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(texComponents >= logComponents);
500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                   * texComponents * sizeof(GLuint));
503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      if (!newImage) {
504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         free(tempImage);
505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         return NULL;
506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      n = srcWidth * srcHeight * srcDepth;
511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (i = 0; i < n; i++) {
512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         GLint k;
513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         for (k = 0; k < texComponents; k++) {
514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            GLint j = map[k];
515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            if (j == ZERO)
516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = 0.0F;
517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else if (j == ONE)
518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = 1.0F;
519dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else
520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
521dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         }
522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      free(tempImage);
525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      tempImage = newImage;
526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   return tempImage;
529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul}
530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/**
534663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components.
535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
53839de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
554663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte.
555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
556663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte *
557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
558663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum logicalBaseFormat,
559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum textureBaseFormat,
560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLint srcWidth, GLint srcHeight, GLint srcDepth,
561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum srcFormat, GLenum srcType,
562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const GLvoid *srcAddr,
563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const struct gl_pixelstore_attrib *srcPacking)
564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
568663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   GLubyte *tempImage, *dst;
569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
5745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
5755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
5835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
5845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
591663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
592663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                       * components * sizeof(GLubyte));
59396128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
59596128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
5998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
6008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
607e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
608e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       srcFormat, srcType, src, srcPacking,
609e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       transferOps);
610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
619663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      GLubyte *newImage;
620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
6213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
62313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
62413ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
632663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
633663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                         * texComponents * sizeof(GLubyte));
634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
63532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
6393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
649663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               newImage[i * texComponents + k] = 255;
650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
65532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
663c039af165d5919008c6df599795951f85dea164dBrian Paul/**
664c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
665c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
666c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
669248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
670248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
671248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
672c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
673c039af165d5919008c6df599795951f85dea164dBrian Paul */
674c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
675c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
676c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
67771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
678501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
679501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
699248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
70071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
70171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
704501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
705501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
70771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
70871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
709501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
710501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
72471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
72571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
727501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
728501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
74271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
74371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
745501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
746501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
76071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
76171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
7623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
763501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
764501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
7783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
7793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
780501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
781501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
78271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
78571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
78646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
787501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
788bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
789bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
79046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
79139de9251c4770fdcce3395643003aa626178446dBrian Paul
79239de9251c4770fdcce3395643003aa626178446dBrian Paul/**
79339de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
79439de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness.
795bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
79646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
797bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
79946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
800c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
80246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
803bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
804df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
805bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
806df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
80746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
80846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
81239de9251c4770fdcce3395643003aa626178446dBrian Paul
81339de9251c4770fdcce3395643003aa626178446dBrian Paul/**
81439de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
81539de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state.
81646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
81746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
818bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
819bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
822bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
823bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
82446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
825c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
838c039af165d5919008c6df599795951f85dea164dBrian Paul/**
839c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
840c039af165d5919008c6df599795951f85dea164dBrian Paul */
84171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
842f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx,
84371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
84471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
84546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
84646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
8470c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
8480c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
84946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
85171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLvoid *dstAddr,
85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
854b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                          const GLuint *dstImageOffsets,
85671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
862bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
8633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
86471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
865c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
866c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
867c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
868c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
869c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
870c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
871c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
872c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
873c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
874c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
87571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
876edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
8780c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
8823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
884bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
88646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
88771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
889bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
89071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
891298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
8922e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
893b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
8959c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
896b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstImage = (GLubyte *) dstAddr
899b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
900b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstXoffset * dstComponents;
90171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
902b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
90771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
908b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
909b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img] * dstComponents
910b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
911b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset * dstComponents;
91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         srcImage += srcImageStride;
91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
91971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
92071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
92171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
92271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do.
925f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed.
926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported.
927f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
928f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void
929f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx,
93017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
9311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLvoid *dstAddr,
933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
934b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
935b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               const GLuint *dstImageOffsets,
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
94560909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
94660909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
9471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
94822108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
949b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
950b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0
951b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* XXX update/re-enable for dstImageOffsets array */
952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerImage = srcHeight * bytesPerRow;
953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerTexture = srcDepth * bytesPerImage;
954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLubyte *dstImage = (GLubyte *) dstAddr
955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstZoffset * dstImageStride
956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstYoffset * dstRowStride
95722108bb571808542b89677752d62d3901698265fBrian Paul                     + dstXoffset * texelBytes;
958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       dstRowStride == bytesPerRow &&
961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((dstImageStride == srcImageStride &&
962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImageStride == bytesPerImage) ||
963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul        (srcDepth == 1))) {
964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one big memcpy */
96517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture);
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
967b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   else
968b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   {
969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLubyte *dstRow = dstImage;
973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
97417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImage += dstImageStride;
980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
982b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif
983b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
984b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   GLint img, row;
985b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   for (img = 0; img < srcDepth; img++) {
986b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLubyte *srcRow = srcImage;
987b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstRow = (GLubyte *) dstAddr
98822108bb571808542b89677752d62d3901698265fBrian Paul         + dstImageOffsets[dstZoffset + img] * texelBytes
989b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
99022108bb571808542b89677752d62d3901698265fBrian Paul         + dstXoffset * texelBytes;
991b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      for (row = 0; row < srcHeight; row++) {
992b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         dstRow += dstRowStride;
994b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         srcRow += srcRowStride;
995b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      }
996b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      srcImage += srcImageStride;
997b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   }
998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1002f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1003bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image.
1004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
100549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1006b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
100825cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
10091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1010bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   const GLenum dstType = _mesa_get_format_datatype(dstFormat);
1011a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1012bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32 ||
1013bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák          dstFormat == MESA_FORMAT_Z32_FLOAT);
101422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLuint));
1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1016966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1017966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1019a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1020a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1021bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák       srcType == dstType) {
1022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
102317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
102460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1025b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1026b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1034b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
103522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1036b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
103722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
103960909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10411ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1042bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák                                    dstType, dstRow,
1043a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
1055e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
1056e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
1059e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint texelBytes = 4;
1060e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1062e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1064e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
1065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1068b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
1069e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1070b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
1071e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstXoffset * texelBytes;
1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
107360909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10751ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1076a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1077a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1085e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1086f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint texelBytes = 4;
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++) {
1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         GLubyte *dstRow = (GLubyte *) dstAddr
1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstImageOffsets[dstZoffset + img] * texelBytes
1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstYoffset * dstRowStride
1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstXoffset * texelBytes;
1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1119c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1120c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1121c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1122c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1123c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1124c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1125a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
112749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1128b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
113025cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
11311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1132a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
11331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
113422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLushort));
1135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1136966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1137966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1141a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
114317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
114460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1145b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1146b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
11521ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1153f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1154b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
115522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1156b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
115722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
115960909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1161a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
11621ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1163a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1174defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
117649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1177b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
11791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
11801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
118122108bb571808542b89677752d62d3901698265fBrian Paul
11821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
11831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
118422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
11881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGB565 &&
1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1190a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT_5_6_5) {
1192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
119317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
119460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1195b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1196b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1201a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1202a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1203a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1204a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1205a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1206a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
12078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
12088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1209a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
121060909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLubyte *dst = (GLubyte *) dstAddr
1213a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                   + dstYoffset * dstRowStride
121422108bb571808542b89677752d62d3901698265fBrian Paul                   + dstXoffset * texelBytes;
1215a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1216a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1218a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1219defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
12201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1221f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1222f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1223f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1224f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1225f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1226f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1227f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1228f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1229f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1230f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1231defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1232a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1233a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1234a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1235a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1238663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1239a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
124022108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1241a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1242a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1243a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1246a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1247a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1249b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
125022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1251b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
125222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1254a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dstUS = (GLushort *) dstRow;
1255defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            /* check for byteswapped format */
12561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGB565) {
1257f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1258663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_565( src[RCOMP],
1259663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                               src[GCOMP],
1260663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                               src[BCOMP] );
1261f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1262f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1263f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1264f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1265f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1266663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_565_REV( src[RCOMP],
1267663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                   src[GCOMP],
1268663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                   src[BCOMP] );
1269f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1272f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
127532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1281248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1282248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1283248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
128449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1285b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1287184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
12881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
12891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
129071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
12911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
12921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGBA8888_REV);
129322108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
12971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888 &&
1298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1299defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
13002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
13012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
13022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
13032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       /* simple memcpy path */
13042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      memcpy_texture(ctx, dims,
13052e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
13062e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstRowStride,
13072e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstImageOffsets,
13082e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
13092e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcAddr, srcPacking);
13102e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   }
13112e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   else if (!ctx->_ImageTransferState &&
13122e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       !srcPacking->SwapBytes &&
13131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888_REV &&
13142e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
13152e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
13162e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
13172e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
13182e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
1319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
132017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
132160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1322b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1323b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
132946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
133046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1331528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
133346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
133471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
133571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1336528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
133771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
13381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
13391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
134046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
134146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
134246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
134346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
134446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
134546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
134646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
134746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
134846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
134946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
135046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
135371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
135446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1355528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
135671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
135771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1358528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				dstRowStride, dstImageOffsets,
135971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
136071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
136171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1364663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
136622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1370663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1375b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
137622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
137822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint *dstUI = (GLuint *) dstRow;
13811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGBA8888) {
1382f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1383663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888( src[RCOMP],
1384663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1385663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP],
1386663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[ACOMP] );
1387f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1390f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1391f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1392663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( src[RCOMP],
1393663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1394663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP],
1395663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[ACOMP] );
1396f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1397f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1398a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1399a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1400a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1401a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
140232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1403a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1404a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1405a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1406a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1407a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
140849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1409b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1411184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
14121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1413f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul   const GLenum baseFormat = GL_RGBA;
1414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
14151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
141674d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
14172d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888 ||
14182d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888_REV );
141922108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
142374d61d03b54d72217d463c248468cdcd09320efcBrian Paul       (dstFormat == MESA_FORMAT_ARGB8888 ||
142474d61d03b54d72217d463c248468cdcd09320efcBrian Paul        dstFormat == MESA_FORMAT_XRGB8888) &&
1425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
1428defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
1429defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (little endian) */
143017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
143160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1432b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1433b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1437defb035b6cf03c555318d9dd48864242ed036f39Brian Paul   else if (!ctx->_ImageTransferState &&
1438a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
14392d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer       (dstFormat == MESA_FORMAT_ARGB8888_REV ||
14402d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer        dstFormat == MESA_FORMAT_XRGB8888_REV) &&
1441a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1442a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_BGRA &&
1443a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
1444defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
1445defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
144617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
144760909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1448b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1449b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1450a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1452a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
145371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
145471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
145574d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
145674d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
145771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
14580c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
14590c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
146171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
146271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
14638c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14648c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
146671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1467b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
146822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
147022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
147171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1472259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
147371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
147424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
147524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
147624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
147724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
147871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
147971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
148071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
148171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
148271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
148371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
148471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
148571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
14861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
148771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
14880c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
148924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1490259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1491b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1493ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1494ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1497ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1498ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
14998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
15008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1502ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1503b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
150422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1505b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
150622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1507ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1508259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1509ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
151024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
151124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
151224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
151324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
151471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
151571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
151671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
151771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
151871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
151971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
152071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
152146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
152246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
152346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
15240c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
152571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
152671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
152771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
152871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
15290c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
153071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
15311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
153274d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
15332d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
15342d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
153546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
153646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
153746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
153846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
153946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
154046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
15411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
154274d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
15432d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
154474d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
154546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
154646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
154746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
154846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
154946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
155071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
155171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
155271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
155346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
15540c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
155571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
155671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1557b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
1558b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                                dstImageOffsets,
155971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
156071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
156171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1562a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
156622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1569a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1572a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1574a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1575b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
157622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1577b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
157822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1579a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1580a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLuint *dstUI = (GLuint *) dstRow;
15811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB8888) {
1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1583663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888( src[ACOMP],
1584663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1585663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1586663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
1587f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1588f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1589a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
159074d61d03b54d72217d463c248468cdcd09320efcBrian Paul            else if (dstFormat == MESA_FORMAT_XRGB8888) {
159174d61d03b54d72217d463c248468cdcd09320efcBrian Paul               for (col = 0; col < srcWidth; col++) {
159274d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  dstUI[col] = PACK_COLOR_8888( 0xff,
1593663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1595663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
159674d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  src += 4;
159774d61d03b54d72217d463c248468cdcd09320efcBrian Paul               }
159874d61d03b54d72217d463c248468cdcd09320efcBrian Paul            }
1599f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1600f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1601663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( src[ACOMP],
1602663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
1603663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1604663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
1605f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1606f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1607defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            }
1608a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1609a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1610a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
161132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1612a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1613a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1614a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1615a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
161749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1618b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1620184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
16211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
16221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
16241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
162522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGR &&
1631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
163417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
163560909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1636b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1637b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1645a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1646b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
16488c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
16498c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
165060909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
165160909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1652b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
165322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1654b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
165522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
16673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
16683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
16693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
16703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
16713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
16733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
16753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1676167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
16773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1678167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
16853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
16863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
16873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
16883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
16893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
16903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1693663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
169522108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1699663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = (const GLubyte *) tempImage;
1700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1701f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1704b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
170522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1706b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
170722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0
1710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (littleEndian) {
1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1712663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 0] = src[RCOMP];
1713663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 1] = src[GCOMP];
1714663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 2] = src[BCOMP];
1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else {
1719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = srcUB[BCOMP];
1721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = srcUB[GCOMP];
1722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = srcUB[RCOMP];
1723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1726f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else
1727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1728663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 0] = src[BCOMP];
1729663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 1] = src[GCOMP];
1730663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 2] = src[RCOMP];
1731f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
1732f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1733f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif
1734f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1736f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
173732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1738f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1739f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1740f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1741f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1742f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
174349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1744b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1745a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
1746184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
17471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
17481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1749a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
17501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
175122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1752a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
1755a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1756a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1757a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_BYTE &&
1758a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       littleEndian) {
1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
176017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
176160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1762b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1763b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1764a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1765a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1766a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1767a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1768a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1769a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1770a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1771a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1772a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1773a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
17748c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
17758c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
177660909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
177760909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1778b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
177922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1780b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
178122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1782a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1783a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1784a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1785a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1786a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1787a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1788a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1789a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1790a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1791a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1792a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
17933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
17943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
17953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
17963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
17973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
17993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
18013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1802167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
18033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1804167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
18053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
18063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
18093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
18123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
18133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
18143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
18153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
18163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1819663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1820a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
182122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1822a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1823a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1824a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1825663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = (const GLubyte *) tempImage;
1826a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1827a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1828a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1829a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1830b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
183122108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1832b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
183322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1834a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1835a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1836663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 0] = src[RCOMP];
1837663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 1] = src[GCOMP];
1838663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 2] = src[BCOMP];
1839a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               src += 3;
1840a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1841a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1842a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1843a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
184432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1845a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1846a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1847a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1848a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1849a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
185049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1851b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
18531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
185522108bb571808542b89677752d62d3901698265fBrian Paul
18561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
18571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
185822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
18621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB4444 &&
1863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1865defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
1866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
186717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
186860909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1869b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1870b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1874f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1876663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
187822108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1882663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1885f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1887b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
188822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1889b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
189022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
18931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB4444) {
1894f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1895663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_4444( src[ACOMP],
1896663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1897663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1898663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1904663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_4444_REV( src[ACOMP],
1905663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
1906663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1907663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1909f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1913a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
191432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1916a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1917a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1918a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
191949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1920dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1921dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
19221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
192422108bb571808542b89677752d62d3901698265fBrian Paul
19251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
192622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1927a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1928dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1929dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       !srcPacking->SwapBytes &&
19301f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA5551 &&
1931dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcFormat == GL_RGBA &&
1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1937dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstRowStride,
1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstImageOffsets,
1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1941dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1942dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
1943dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* general path */
1944663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1945dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 baseInternalFormat,
194622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1947dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcWidth, srcHeight, srcDepth,
1948dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcFormat, srcType, srcAddr,
1949dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcPacking);
1950663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src =tempImage;
1951dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      GLint img, row, col;
1952dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      if (!tempImage)
1953dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         return GL_FALSE;
1954dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      for (img = 0; img < srcDepth; img++) {
1955dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         GLubyte *dstRow = (GLubyte *) dstAddr
195622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1957dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            + dstYoffset * dstRowStride
195822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1959dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         for (row = 0; row < srcHeight; row++) {
1960dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            GLushort *dstUS = (GLushort *) dstRow;
1961dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    for (col = 0; col < srcWidth; col++) {
1962663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul	       dstUS[col] = PACK_COLOR_5551( src[RCOMP],
1963663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[GCOMP],
1964663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[BCOMP],
1965663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[ACOMP] );
1966dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	      src += 4;
1967dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    }
1968dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            dstRow += dstRowStride;
1969dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         }
1970dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      }
197132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1972dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1973dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1974dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1975defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
197649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1977b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
19791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
198122108bb571808542b89677752d62d3901698265fBrian Paul
19821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
19831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
198422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1985f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1986f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
19881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB1555 &&
1989f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1990f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1991defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
1992f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
199317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
199460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1995b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1996b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2002663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
200422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2008663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src =tempImage;
2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2013b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
201422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2015b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
201622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
20191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB1555) {
2020f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2021663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_1555( src[ACOMP],
2022663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
2023663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
2024663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
2025f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
2026f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2030663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_1555_REV( src[ACOMP],
2031663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
2032663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
2033663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
2035f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2036a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2037a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2038a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2039a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
204032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2044a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2046621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean
2047621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
2048621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{
2049621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2050621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2051621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2052621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
2053621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(texelBytes == 4);
2054621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2055621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   if (!ctx->_ImageTransferState &&
2056621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       !srcPacking->SwapBytes &&
2057621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       dstFormat == MESA_FORMAT_ARGB2101010 &&
2058621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       srcFormat == GL_BGRA &&
2059621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       srcType == GL_UNSIGNED_INT_2_10_10_10_REV &&
2060621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       baseInternalFormat == GL_RGBA) {
2061621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* simple memcpy path */
2062621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      memcpy_texture(ctx, dims,
2063621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2064621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     dstRowStride,
2065621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     dstImageOffsets,
2066621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2067621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcAddr, srcPacking);
2068621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
2069621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   else {
2070621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* general path */
2071e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2072621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseInternalFormat,
2073621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseFormat,
2074621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
2075621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcFormat, srcType, srcAddr,
207650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 srcPacking,
207750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 ctx->_ImageTransferState);
207850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák      const GLfloat *src = tempImage;
2079621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      GLint img, row, col;
2080621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      if (!tempImage)
2081621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         return GL_FALSE;
2082621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      for (img = 0; img < srcDepth; img++) {
2083621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
2084621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            + dstImageOffsets[dstZoffset + img] * texelBytes
2085621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            + dstYoffset * dstRowStride
2086621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            + dstXoffset * texelBytes;
2087621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         if (baseInternalFormat == GL_RGBA) {
2088621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
208950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
2090621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
209150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort a,r,g,b;
209250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
209350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
209450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
209550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
209650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
209750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
2098621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
2099621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
2100621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
2101621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
2102621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else if (baseInternalFormat == GL_RGB) {
2103621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
210450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
2105621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
210650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort r,g,b;
210750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
210850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
210950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
211050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
211150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
2112621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
2113621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
2114621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
2115621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
2116621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else {
2117621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            ASSERT(0);
2118621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         }
2119621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      }
2120621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      free((void *) tempImage);
2121621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
2122621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   return GL_TRUE;
2123621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák}
2124621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2125621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
212639de9251c4770fdcce3395643003aa626178446dBrian Paul/**
2127bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
2128bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */
2129bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean
2130bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS)
2131bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{
2132bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2133bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2134bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2135bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_AL44);
2136bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(texelBytes == 1);
2137bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2138bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   {
2139bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      /* general path */
2140663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2141bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseInternalFormat,
2142bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseFormat,
2143bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2144bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcFormat, srcType, srcAddr,
2145bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcPacking);
2146663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2147bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      GLint img, row, col;
2148bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      if (!tempImage)
2149bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         return GL_FALSE;
2150bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      for (img = 0; img < srcDepth; img++) {
2151bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
2152bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            + dstImageOffsets[dstZoffset + img] * texelBytes
2153bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            + dstYoffset * dstRowStride
2154bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            + dstXoffset * texelBytes;
2155bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         for (row = 0; row < srcHeight; row++) {
2156bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            GLubyte *dstUS = (GLubyte *) dstRow;
2157bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            for (col = 0; col < srcWidth; col++) {
2158bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               /* src[0] is luminance, src[1] is alpha */
2159663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstUS[col] = PACK_COLOR_44( src[1],
2160663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                           src[0] );
2161bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               src += 2;
2162bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            }
2163bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            dstRow += dstRowStride;
2164bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         }
2165bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      }
2166bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      free((void *) tempImage);
2167bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   }
2168bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   return GL_TRUE;
2169bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák}
2170bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2171bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2172bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/**
217339de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
217439de9251c4770fdcce3395643003aa626178446dBrian Paul */
217549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS)
2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2178184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
21791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
21801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
21821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL88_REV ||
21845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG88 ||
21855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG88_REV);
218622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2190e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL88 &&
2191e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
2192e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
2193e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede        (dstFormat == MESA_FORMAT_RG88 &&
2194e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
2197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
219817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
219960909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2200b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2201b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
22053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
2206bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
22073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
22083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
22093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
22103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
22113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
22133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
22145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
22155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
22165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
22175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
22185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 3;
22195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
22205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
22215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 3;
22225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
22235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
22243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
22265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_RG88) ||
22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) {
22285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
22295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 1;
22305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
22315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
22325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 1;
22335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
22345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
22383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2251663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
225322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2257663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
226322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2264b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
226522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
22685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL88 ||
22695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG88) {
2270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2271f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2272663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88( src[1],
2273663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[0] );
2274f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2275f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2277f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2278f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2279f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2280663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( src[1],
2281663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                 src[0] );
2282f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2283f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2284a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2285a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2286a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2287a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
228832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2289a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2290a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2291a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2292a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2293a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
229439de9251c4770fdcce3395643003aa626178446dBrian Paul/**
229539de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
229639de9251c4770fdcce3395643003aa626178446dBrian Paul */
229749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
22985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
22993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{
23003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLboolean littleEndian = _mesa_little_endian();
23013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
23023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
23033325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
23043325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
23055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL1616_REV ||
23065d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	  dstFormat == MESA_FORMAT_RG1616 ||
23075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG1616_REV);
23083325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(texelBytes == 4);
23093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
23103325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   if (!ctx->_ImageTransferState &&
23113325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       !srcPacking->SwapBytes &&
2312e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL1616 &&
2313e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
2314e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
2315e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede        (dstFormat == MESA_FORMAT_RG1616 &&
2316e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
23173325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       srcType == GL_UNSIGNED_SHORT &&
23183325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       littleEndian) {
23193325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* simple memcpy path */
23203325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      memcpy_texture(ctx, dims,
23213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
23223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstRowStride,
23233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstImageOffsets,
23243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
23253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcAddr, srcPacking);
23263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
23273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   else {
23283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* general path */
2329e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
23303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseInternalFormat,
23313325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseFormat,
23323325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcWidth, srcHeight, srcDepth,
23333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcFormat, srcType, srcAddr,
2334bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2335bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
23363325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *src = tempImage;
23373325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      GLint img, row, col;
23383325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      if (!tempImage)
23393325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         return GL_FALSE;
23403325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      for (img = 0; img < srcDepth; img++) {
23413325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         GLubyte *dstRow = (GLubyte *) dstAddr
23423325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstImageOffsets[dstZoffset + img] * texelBytes
23433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstYoffset * dstRowStride
23443325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstXoffset * texelBytes;
23453325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         for (row = 0; row < srcHeight; row++) {
23463325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            GLuint *dstUI = (GLuint *) dstRow;
23475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL1616 ||
23485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG1616) {
23493325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2350db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2351db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2352db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2353db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2354db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616(a, l);
2355db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
23563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
23573325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
23583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            else {
23593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2360db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2361db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2362db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2363db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2364db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
2365db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
23663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
23673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
23683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            dstRow += dstRowStride;
23693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         }
23703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      }
237132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
23723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
23733325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   return GL_TRUE;
23743325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick}
23753325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
23763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
2377fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */
23783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean
2379eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS)
23805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{
23815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLboolean littleEndian = _mesa_little_endian();
23825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
23835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
23845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2385eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_R16 ||
2386bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák          dstFormat == MESA_FORMAT_A16 ||
2387fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_L16 ||
2388fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_I16);
23895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   ASSERT(texelBytes == 2);
23905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
23915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   if (!ctx->_ImageTransferState &&
23925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       !srcPacking->SwapBytes &&
2393eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák       baseInternalFormat == srcFormat &&
23945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcType == GL_UNSIGNED_SHORT &&
23955d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       littleEndian) {
23965d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* simple memcpy path */
23975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      memcpy_texture(ctx, dims,
23985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
23995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstRowStride,
24005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstImageOffsets,
24015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
24025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcAddr, srcPacking);
24035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
24045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   else {
24055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* general path */
2406e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
24075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseInternalFormat,
24085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseFormat,
24095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcWidth, srcHeight, srcDepth,
24105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcFormat, srcType, srcAddr,
2411bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2412bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
24135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *src = tempImage;
24145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      GLint img, row, col;
24155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (!tempImage)
24165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         return GL_FALSE;
24175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      for (img = 0; img < srcDepth; img++) {
24185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         GLubyte *dstRow = (GLubyte *) dstAddr
24195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstImageOffsets[dstZoffset + img] * texelBytes
24205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstYoffset * dstRowStride
24215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstXoffset * texelBytes;
24225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         for (row = 0; row < srcHeight; row++) {
24235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            GLushort *dstUS = (GLushort *) dstRow;
24245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    for (col = 0; col < srcWidth; col++) {
24255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       GLushort r;
24265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
24275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
24285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       dstUS[col] = r;
24295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       src += 1;
24305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    }
24315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            dstRow += dstRowStride;
24325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
24335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      }
24345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      free((void *) tempImage);
24355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
24365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   return GL_TRUE;
24375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick}
24385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
24395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
24405d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean
244117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
244217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{
244317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
244417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
244517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
244617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
244717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(texelBytes == 8);
244817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
244917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   if (!ctx->_ImageTransferState &&
245017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       !srcPacking->SwapBytes &&
245117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       baseInternalFormat == GL_RGBA &&
245217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcFormat == GL_RGBA &&
245317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcType == GL_UNSIGNED_SHORT) {
245417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* simple memcpy path */
245517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      memcpy_texture(ctx, dims,
245617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
245717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstRowStride,
245817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstImageOffsets,
245917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
246017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcAddr, srcPacking);
246117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
246217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   else {
246317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* general path */
2464e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
246517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseInternalFormat,
246617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseFormat,
246717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcWidth, srcHeight, srcDepth,
246817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcFormat, srcType, srcAddr,
2469bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2470bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
247117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *src = tempImage;
247217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      GLint img, row, col;
247317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      if (!tempImage)
247417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         return GL_FALSE;
247517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      for (img = 0; img < srcDepth; img++) {
247617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
247717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
247817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstYoffset * dstRowStride
247917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstXoffset * texelBytes;
248017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         for (row = 0; row < srcHeight; row++) {
248117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
248217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            for (col = 0; col < srcWidth; col++) {
248317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               GLushort r, g, b, a;
248417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
248517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
248617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
248717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
248817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
248917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+0] = r;
249017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+1] = g;
249117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+2] = b;
249217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+3] = a;
249317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               src += 4;
249417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            }
249517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            dstRow += dstRowStride;
249617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         }
249717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      }
249817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      free((void *) tempImage);
249917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
250017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   return GL_TRUE;
250117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul}
250217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
250317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
250417e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean
2505279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2506279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{
2507279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2508279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2509279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2510daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2511279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2512279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2513279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   if (!ctx->_ImageTransferState &&
2514279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       !srcPacking->SwapBytes &&
2515279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       baseInternalFormat == GL_RGBA &&
2516279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2517279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcFormat == GL_RGBA &&
2518279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcType == GL_SHORT) {
2519279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* simple memcpy path */
2520279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      memcpy_texture(ctx, dims,
2521279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2522279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstRowStride,
2523279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstImageOffsets,
2524279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2525279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcAddr, srcPacking);
2526279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2527279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   else {
2528279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* general path */
2529e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2530279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseInternalFormat,
2531279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseFormat,
2532279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2533279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcFormat, srcType, srcAddr,
2534bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2535bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2536279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *src = tempImage;
2537279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2538279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      GLint img, row, col;
2539279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2540279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      if (!tempImage)
2541279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         return GL_FALSE;
2542279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2543279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2544279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       * 3 or 4 components/pixel here.
2545279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       */
2546279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      for (img = 0; img < srcDepth; img++) {
2547279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
2548279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2549279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstYoffset * dstRowStride
2550279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstXoffset * texelBytes;
2551279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         for (row = 0; row < srcHeight; row++) {
2552279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            GLshort *dstRowS = (GLshort *) dstRow;
2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2558daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2559daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               }
2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 4 * srcWidth;
2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            } else {
2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2572279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               }
2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 3 * srcWidth;
2575279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            }
2576279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         }
2577279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      }
2578279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      free((void *) tempImage);
2579279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2580279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   return GL_TRUE;
2581279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul}
2582279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2583279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2584279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean
2585b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
25871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
25881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
258922108bb571808542b89677752d62d3901698265fBrian Paul
25901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
259122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
2596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
2597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
259817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
259960909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2601b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2607663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
260922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2613663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2618b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
261922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2620b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
262122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2624663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = PACK_COLOR_332( src[RCOMP],
2625663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[GCOMP],
2626663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[BCOMP] );
2627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
2628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
263232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
264149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2642bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS)
2643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
26441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
26451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
264622108bb571808542b89677752d62d3901698265fBrian Paul
26471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
26481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
26495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_I8 ||
26505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_R8);
265122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
265817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
265960909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2660b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
26653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
26663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
26673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
26683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
26693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
26703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
26713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
26723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
26731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
26743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
26753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
26763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
26773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
26783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
26793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
26803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
26813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
26823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
26833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
26843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
26853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
26863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
26873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
26883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
26893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
26903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
26913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
26923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2693f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2695663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
269722108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2701663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2706b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
270722108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2708b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
270922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2712663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = src[col];
2713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
271832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
27261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
272849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2729b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2730f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2731184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
27321f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
273322108bb571808542b89677752d62d3901698265fBrian Paul
2734a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
27361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
27371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
273822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2739f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2740f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2741f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2742f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2743f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2744f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2745f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
274617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
274760909388ab136d849d99eab49e782a53772a618fBrian Paul                  dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2748b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstRowStride,
2749b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstImageOffsets,
2750f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2751f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2752f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2753f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2754f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2755f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2756f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
27571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2758f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2759f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2761b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
276222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2763b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
276422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2765f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2766b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2767b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2768f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2772f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2773f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
277449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2775114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2776114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2777114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
27781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2779114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
27801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
278122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2782114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2783114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2784114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2785114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2786114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2787114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2788114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2789114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2790114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
2791114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2792114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstRowStride,
2793114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstImageOffsets,
2794114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2795114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2796114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2797114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2798114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2799114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2800114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2801114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2802114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2803114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2804114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2805114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2806114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2807114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2808114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2809114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2810114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2811114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2812114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2813114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2814114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2815114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2816114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2817114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
2818114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstAddr, dstXoffset, dstYoffset, dstZoffset,
2819114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstRowStride, dstImageOffsets,
2820114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2821114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2822114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2823114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2824114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2825114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
28268c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
28278c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2828114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2829114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2830114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
283132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2832114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2833114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2834114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2835114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2836114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2837114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2838114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2839114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2840114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2841114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2842114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2843114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2844114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2845114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2846114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2847114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2848114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2849114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2850114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
2851114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = (GLbyte *) dstAddr
2852114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            + dstYoffset * dstRowStride
285322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2854114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
285522108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2856114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
285722108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2858114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
285932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2860114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2861114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2862114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
286484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
286584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2866daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format.
286784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
286884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2869daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS)
287084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
287184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
287284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
287384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2874daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
2875daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L8 ||
2876daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I8 ||
2877daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_R8);
287884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 1);
287984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2880daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2881daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2882daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2883daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE) {
2884daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2885daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2886daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2887daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowStride,
2888daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstImageOffsets,
2889daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2890daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2891daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2892daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
289384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2894e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
289584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
289684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
289784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
289884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2899bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2900bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2901daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
290284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
290384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
290484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
290584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2906daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLbyte *dstRow = (GLbyte *) dstAddr
290784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
290884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
290984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
291084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
291184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2912daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
291384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
291484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
2915daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            src += srcWidth;
291684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
291784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
291884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
291984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
292084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
292184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
292284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
292384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
292484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2925daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format.
292684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
292784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2928daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS)
292984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
2930daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
293184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
293284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
293384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2934daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
2935daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
2936daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 2);
293784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2938daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2939daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2940daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2941daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE &&
2942daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2943daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2944daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2945daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2946daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowStride,
2947daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstImageOffsets,
2948daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2949daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2950daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2951daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
295284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2953e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
295484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
295584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
295684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
295784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2958bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2959bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2960daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
296184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
296284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
296384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
296484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2965daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLbyte *dstRow = (GLbyte *) dstAddr
296684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
296784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
296884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
296984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2970daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
297184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2972daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
2973daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
2974daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2975daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
297684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
297784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
297884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
297984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
298084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
298184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
298284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
298384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
298484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2985daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */
2986daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2987daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS)
2988daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2989daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2990daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2991daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2992daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2993daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
2994daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_A16 ||
2995daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L16 ||
2996daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I16);
2997daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 2);
2998daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2999daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
3000daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
3001daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
3002daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
3003daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
3004daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
3005daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
3006daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3007daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowStride,
3008daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstImageOffsets,
3009daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3010daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
3011daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3012daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
3013daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
3014daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3015daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
3016daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
3017daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
3018daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
3019daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
3020daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
3021daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
3022daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
3023daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
3024daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
3025daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
3026daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
3027daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstImageOffsets[dstZoffset + img] * texelBytes
3028daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstYoffset * dstRowStride
3029daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstXoffset * texelBytes;
3030daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
3031daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dstUS = (GLshort *) dstRow;
3032daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    for (col = 0; col < srcWidth; col++) {
3033daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       GLushort r;
3034daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3035daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
3036daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       dstUS[col] = r;
3037daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       src += 1;
3038daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    }
3039daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
3040daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
3041daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
3042daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
3043daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3044daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
3045daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
3046daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3047daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/**
3048daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
3049daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */
3050daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
3051daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
3052daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
3053daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
3054daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3055daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3056daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3057daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
3058daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_GR1616);
3059daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 4);
3060daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3061daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
3062daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
3063daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
3064daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
3065daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
3066daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
3067daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
3068daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3069daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowStride,
3070daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstImageOffsets,
3071daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3072daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
3073daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3074daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
3075daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
3076daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3077daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
3078daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
3079daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
3080daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
3081daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
3082daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
3083daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
3084daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
3085daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
3086daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
3087daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
3088daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
3089daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstImageOffsets[dstZoffset + img] * texelBytes
3090daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstYoffset * dstRowStride
3091daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstXoffset * texelBytes;
3092daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
3093daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dst = (GLshort *) dstRow;
3094daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            for (col = 0; col < srcWidth; col++) {
3095daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               GLushort l, a;
3096daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3097daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
3098daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
3099daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = l;
3100daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = a;
3101daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
3102daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
3103daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            }
3104daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
3105daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
3106daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
3107daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
3108daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3109daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
3110daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
311184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
311284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
311384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
311484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
311584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
311684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
311784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
311884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
311984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
312084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
312184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
312284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 4);
312384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
312484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
312584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
3126e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
312784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
312884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
312984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
313084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
3131bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3132bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
313384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
313484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
313584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
313684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
313784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
3138daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLbyte *dstRow = (GLbyte *) dstAddr
313984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
314084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
314184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
314284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
3143daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
314484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
3145daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3146daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3147daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
31488778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul               dst[0] = 127;
3149daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               srcRow += 3;
3150daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 4;
315184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
315284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
315384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
315484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
315584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
315684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
315784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
315884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
315984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
316084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
316184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3162c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
316339de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
316439de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
3165c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
316649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3167c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
3168c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
3169c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
31701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
31711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3172c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
31731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
31741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
317522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
3176c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
3177c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
3178c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       !srcPacking->SwapBytes &&
31791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
3180c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
3181c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
3182c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
3183c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
3184c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
3185c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3186c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstRowStride,
3187c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstImageOffsets,
3188c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3189c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
3190c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
3191c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else if (!ctx->_ImageTransferState &&
3192bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       !srcPacking->SwapBytes &&
31931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
3194bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       baseInternalFormat == GL_RGBA &&
3195bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
3196bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
3197bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      /* simple memcpy path */
3198bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      memcpy_texture(ctx, dims,
3199bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3200bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstRowStride,
3201bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstImageOffsets,
3202bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3203bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcAddr, srcPacking);
3204bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   }
3205c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
3206c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
3207e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3208c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
320922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3210c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
3211c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
3212bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3213bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3214c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
3215c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
3216c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
3217c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
3218c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
3219daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         GLbyte *dstRow = (GLbyte *) dstAddr
322022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3221c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            + dstYoffset * dstRowStride
322222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3223c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
3224daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
32251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
3226c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
3227daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3228daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3229daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
3230daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
3231c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
3232daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
3233c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
3234c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
3235bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
3236bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
3237daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3238daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3239daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
3240daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
3241bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
3242daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
3243bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
3244bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
3245c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
3246c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
3247c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
324832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3249c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
3250c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
3251c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
3252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
325384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3254184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
3255184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
3256184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
325749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3258b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
3259184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
326092098438784887fd6005918794476cfbbeac5035Karl Schultz   const GLuint depthScale = 0xffffff;
3261c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
3262b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
3263c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
326425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
32651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
3266e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
3267e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
3268e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_STENCIL_INDEX);
3269c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
3270184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3271e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f &&
3272966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
3273184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
3274ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
3275184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
3276184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3277b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
3278b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
3279184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3280184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
328139de9251c4770fdcce3395643003aa626178446dBrian Paul   }
3282e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
3283e41a91cea764cc1ba95906251cd907d837225293Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
3284c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      /* In case we only upload depth we need to preserve the stencil */
3285ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
3286c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint *dstRow = (GLuint *) dstAddr
3287b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img]
3288b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
3289b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset;
3290b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
3291b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
3292c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcWidth, srcHeight,
3293c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcFormat, srcType,
3294c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  img, 0, 0);
3295ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
3296c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie            GLuint depth[MAX_WIDTH];
3297c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLubyte stencil[MAX_WIDTH];
3298ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
3299c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
3300c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3301c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
3302c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepstencil = GL_TRUE;
330339de9251c4770fdcce3395643003aa626178446dBrian Paul	    }
330439de9251c4770fdcce3395643003aa626178446dBrian Paul            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
3305c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepdepth = GL_TRUE;
3306c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
3307c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3308c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepdepth == GL_FALSE)
3309c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* the 24 depth bits will be in the low position: */
3310c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_depth_span(ctx, srcWidth,
3311c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       GL_UNSIGNED_INT, /* dst type */
3312c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       keepstencil ? depth : dstRow, /* dst addr */
3313c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       depthScale,
3314c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       srcType, src, srcPacking);
3315c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3316c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil == GL_FALSE)
3317c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* get the 8-bit stencil values */
3318c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_stencil_span(ctx, srcWidth,
3319c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 GL_UNSIGNED_BYTE, /* dst type */
3320c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 stencil, /* dst addr */
3321c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 srcType, src, srcPacking,
3322c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 ctx->_ImageTransferState);
3323c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3324c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    for (i = 0; i < srcWidth; i++) {
3325c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       if (keepstencil)
3326c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
3327c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       else
3328c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
3329c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
3330ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
3331ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
3332b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
3333ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
3334ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
3335184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
3336184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
3337184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
3338184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3339184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3340a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
3341a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
3342a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
334349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3344a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
3345a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
3346a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
3347a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
3348b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
3349a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
3350a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
33511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
335239de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
335339de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_DEPTH_COMPONENT ||
335439de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_STENCIL_INDEX);
335539de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
335639de9251c4770fdcce3395643003aa626178446dBrian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT);
3357c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
3358c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   for (img = 0; img < srcDepth; img++) {
3359c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      GLuint *dstRow = (GLuint *) dstAddr
3360c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstImageOffsets[dstZoffset + img]
3361c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstYoffset * dstRowStride / sizeof(GLuint)
3362c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstXoffset;
3363b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      const GLubyte *src
3364b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
3365c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcWidth, srcHeight,
3366c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcFormat, srcType,
3367c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						img, 0, 0);
3368c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      for (row = 0; row < srcHeight; row++) {
3369c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint depth[MAX_WIDTH];
3370c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLubyte stencil[MAX_WIDTH];
3371c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLint i;
3372c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
3373c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3374c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
3375c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepstencil = GL_TRUE;
337639de9251c4770fdcce3395643003aa626178446dBrian Paul	 }
337739de9251c4770fdcce3395643003aa626178446dBrian Paul         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
3378c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepdepth = GL_TRUE;
3379c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3380666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3381c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepdepth == GL_FALSE)
3382c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* the 24 depth bits will be in the low position: */
3383c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_depth_span(ctx, srcWidth,
3384c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    GL_UNSIGNED_INT, /* dst type */
3385c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    keepstencil ? depth : dstRow, /* dst addr */
3386c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    depthScale,
3387c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    srcType, src, srcPacking);
3388c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3389c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepstencil == GL_FALSE)
3390c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* get the 8-bit stencil values */
3391c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_stencil_span(ctx, srcWidth,
3392c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      GL_UNSIGNED_BYTE, /* dst type */
3393c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      stencil, /* dst addr */
3394c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      srcType, src, srcPacking,
3395c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      ctx->_ImageTransferState);
3396c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3397c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 /* merge stencil values into depth values */
3398c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 for (i = 0; i < srcWidth; i++) {
3399c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil)
3400c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
3401c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    else
3402c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
3403666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3404c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3405c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 src += srcRowStride;
3406c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 dstRow += dstRowStride / sizeof(GLuint);
3407a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
3408a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
3409a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
3410a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
3411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
341239de9251c4770fdcce3395643003aa626178446dBrian Paul
341339de9251c4770fdcce3395643003aa626178446dBrian Paul/**
341439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data.
341539de9251c4770fdcce3395643003aa626178446dBrian Paul */
341639de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean
341739de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS)
341839de9251c4770fdcce3395643003aa626178446dBrian Paul{
341939de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8);
342039de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_STENCIL_INDEX);
342139de9251c4770fdcce3395643003aa626178446dBrian Paul
342239de9251c4770fdcce3395643003aa626178446dBrian Paul   if (!ctx->_ImageTransferState &&
342339de9251c4770fdcce3395643003aa626178446dBrian Paul       !srcPacking->SwapBytes &&
342439de9251c4770fdcce3395643003aa626178446dBrian Paul       baseInternalFormat == srcFormat &&
342539de9251c4770fdcce3395643003aa626178446dBrian Paul       srcType == GL_UNSIGNED_BYTE) {
342639de9251c4770fdcce3395643003aa626178446dBrian Paul      /* simple memcpy path */
342739de9251c4770fdcce3395643003aa626178446dBrian Paul      memcpy_texture(ctx, dims,
342839de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
342939de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstRowStride,
343039de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstImageOffsets,
343139de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
343239de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcAddr, srcPacking);
343339de9251c4770fdcce3395643003aa626178446dBrian Paul   }
343439de9251c4770fdcce3395643003aa626178446dBrian Paul   else {
343539de9251c4770fdcce3395643003aa626178446dBrian Paul      const GLint srcRowStride
3436b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
343739de9251c4770fdcce3395643003aa626178446dBrian Paul      GLint img, row;
343839de9251c4770fdcce3395643003aa626178446dBrian Paul
343939de9251c4770fdcce3395643003aa626178446dBrian Paul      for (img = 0; img < srcDepth; img++) {
344039de9251c4770fdcce3395643003aa626178446dBrian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
344139de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstImageOffsets[dstZoffset + img]
344239de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
344339de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstXoffset;
3444b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
3445b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
344639de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcWidth, srcHeight,
344739de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcFormat, srcType,
344839de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   img, 0, 0);
344939de9251c4770fdcce3395643003aa626178446dBrian Paul         for (row = 0; row < srcHeight; row++) {
345039de9251c4770fdcce3395643003aa626178446dBrian Paul            GLubyte stencil[MAX_WIDTH];
345139de9251c4770fdcce3395643003aa626178446dBrian Paul            GLint i;
345239de9251c4770fdcce3395643003aa626178446dBrian Paul
345339de9251c4770fdcce3395643003aa626178446dBrian Paul            /* get the 8-bit stencil values */
345439de9251c4770fdcce3395643003aa626178446dBrian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
345539de9251c4770fdcce3395643003aa626178446dBrian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
345639de9251c4770fdcce3395643003aa626178446dBrian Paul                                      stencil, /* dst addr */
345739de9251c4770fdcce3395643003aa626178446dBrian Paul                                      srcType, src, srcPacking,
345839de9251c4770fdcce3395643003aa626178446dBrian Paul                                      ctx->_ImageTransferState);
345939de9251c4770fdcce3395643003aa626178446dBrian Paul            /* merge stencil values into depth values */
346039de9251c4770fdcce3395643003aa626178446dBrian Paul            for (i = 0; i < srcWidth; i++)
346139de9251c4770fdcce3395643003aa626178446dBrian Paul               dstRow[i] = stencil[i];
346239de9251c4770fdcce3395643003aa626178446dBrian Paul
346339de9251c4770fdcce3395643003aa626178446dBrian Paul            src += srcRowStride;
346439de9251c4770fdcce3395643003aa626178446dBrian Paul            dstRow += dstRowStride / sizeof(GLubyte);
346539de9251c4770fdcce3395643003aa626178446dBrian Paul         }
346639de9251c4770fdcce3395643003aa626178446dBrian Paul      }
346739de9251c4770fdcce3395643003aa626178446dBrian Paul
346839de9251c4770fdcce3395643003aa626178446dBrian Paul   }
346939de9251c4770fdcce3395643003aa626178446dBrian Paul
347039de9251c4770fdcce3395643003aa626178446dBrian Paul   return GL_TRUE;
347139de9251c4770fdcce3395643003aa626178446dBrian Paul}
347239de9251c4770fdcce3395643003aa626178446dBrian Paul
347339de9251c4770fdcce3395643003aa626178446dBrian Paul
3474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
3476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
3477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
3478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
3479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
3481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
3482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
348349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3484b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
3485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
34861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
34871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
348822108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3489f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
34901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
34911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
34921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
34931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
34941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
34950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
34960ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT32 ||
34970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT32);
3498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
35030ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
35040ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
35050ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
350622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLfloat));
3507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
35119e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
3513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
351417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
351560909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3516b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
3517b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
3518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3523e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
352522108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3528bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3529bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3530b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
35319c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
35359c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3537b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
353822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3539b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
354022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3542c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dstRow, srcRow, bytesPerRow);
3543b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
3544b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
3545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
354832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3553c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
3557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
355849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3559b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3560f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
35611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
35621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
356322108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
35651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
35661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
35671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
35681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
35691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
35700ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
35710ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT16 ||
35720ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT16);
3573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
35780ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
35790ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
35800ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
358122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLhalfARB));
3582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
35869e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
3588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
358917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
359060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3591b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
3592b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
3593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3598e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
360022108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3603bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3604bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
3606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
3609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3610b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
361122108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3612b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
361322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
3617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
3619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
3620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
3621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
3622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
362532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */
3632abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3633abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3634abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3635abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3636abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3637abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3638abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3639abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8);
3640abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3641abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3642abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3643abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3644abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3645abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3646abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLbyte));
3647abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3648bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3649bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3650bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3651bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3652abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3653abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_BYTE) {
3654abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3655abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3656abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3657abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3658abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3659abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3660abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3661abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3662abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3663abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3664e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3665abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3666abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3667abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3668abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3669bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3670abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3671abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3672abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3673abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3674abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3675abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3676abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3677abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3678abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3679abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3680abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLbyte *dstTexel = (GLbyte *) dstRow;
3681abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3682abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3683abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLbyte) src[i];
3684abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3685abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3686abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3687abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3688abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3689abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3690abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3691abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3692abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3693abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3694abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3695abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3696abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */
3697abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3698abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3699abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3700abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3701abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3702abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3703abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3704abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16);
3705abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3706abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3707abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3708abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3709abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3710abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3711abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLshort));
3712abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3713bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3714bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3715bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3716bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3717abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
37189fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul       srcType == GL_SHORT) {
3719abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3720abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3721abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3722abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3723abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3724abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3725abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3726abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3727abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3728abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3729e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3730abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3731abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3732abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3733abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3734bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3735abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3736abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3737abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3738abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3739abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3740abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3741abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3742abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3743abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3744abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3745abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLshort *dstTexel = (GLshort *) dstRow;
3746abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3747abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3748abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3749abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3750abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3751abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3752abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3753abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3754abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3755abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3756abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3757abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3758abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3759abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3760abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3761abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */
3762abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3763abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3764abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3765abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3766abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3767abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3768abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3769abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32);
3770abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3771abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3772abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3773abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3774abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3775abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3776abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLint));
3777abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3778bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3779bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3780bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3781bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3782abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3783abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_INT) {
3784abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3785abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3786abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3787abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3788abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3789abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3790abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3791abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3792abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3793abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3794e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3795abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3796abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3797abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3798abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3799bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3800abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3801abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3802abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3803abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3804abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3805abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3806abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3807abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3808abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3809abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3810abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint *dstTexel = (GLint *) dstRow;
3811abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3812abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3813abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3814abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3815abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3816abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3817abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3818abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3819abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3820abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3821abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3822abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3823abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3824abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3825abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3826abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */
3827abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3828abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3829abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3830abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3831abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3832abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3833abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3834abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8);
3835abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3836abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3837abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3838abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3839abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3840abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3841abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLubyte));
3842abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3843bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3844bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3845bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3846bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3847abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3848abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_BYTE) {
3849abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3856abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3857abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3858abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3859dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3860dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3861dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3862dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3863dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3864abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3865abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3866abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3867abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3868abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3869abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3870abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3871abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3872abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3873abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLubyte *dstTexel = (GLubyte *) dstRow;
3874abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3875abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3876dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
3877abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3878abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3879abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3880abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3881abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3882abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3883abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3884abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3885abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3886abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3887abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3888abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3889abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */
3890abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3891abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3892abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3893abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3894abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3895abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3896abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3897abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16);
3898abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3899abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3900abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3901abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3902abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3903abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3904abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLushort));
3905abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3906bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3907bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3908bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3909bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3910abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3911abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_SHORT) {
3912abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3913abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3914abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3915abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3916abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3917abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3918abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3919abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3920abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3921abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3922dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3923dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3924dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3925dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3926dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3927abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3928abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3929abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3930abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3931abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3932abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3933abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3934abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3935abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3936abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLushort *dstTexel = (GLushort *) dstRow;
3937abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3938abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3939dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
3940abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3941abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3942abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3943abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3946abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3948abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */
3953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3955abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3957abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3958abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3959abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3960abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32);
3961abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3962abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3963abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3964abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3965abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3966abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3967abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLuint));
3968abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3969bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3970bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3971bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3972bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3973abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3974abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_INT) {
3975abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3976abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3977abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3978abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3979abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3980abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3981abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3982abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3983abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3984abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3985dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3986dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3987dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3988dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3989dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3990abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3991abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3992abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3993abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3994abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3995abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3996abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3997abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3998abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3999abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLuint *dstTexel = (GLuint *) dstRow;
4000abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
4001abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
4002dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = src[i];
4003abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
4004abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
4005abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
4006abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
4007abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
4008abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4009abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
4010abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
4011abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
4012abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
4013abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4014abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4015abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4016abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
40178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
401849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40198d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
40208d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
40211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
402246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
402346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
402546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
402646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
40271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
402846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40290f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
403039de9251c4770fdcce3395643003aa626178446dBrian Paul                             newDstFormat, dstAddr,
403139de9251c4770fdcce3395643003aa626178446dBrian Paul                             dstXoffset, dstYoffset, dstZoffset,
403239de9251c4770fdcce3395643003aa626178446dBrian Paul                             dstRowStride, dstImageOffsets,
403339de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcWidth, srcHeight, srcDepth,
403439de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcFormat, srcType,
403539de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcAddr, srcPacking);
403646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
40378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
40388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
403954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
404049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40418d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
40428d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
40431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
404446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
404546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
404746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
404846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
40491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
405046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
405146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               newDstFormat, dstAddr,
405246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstXoffset, dstYoffset, dstZoffset,
405346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstRowStride, dstImageOffsets,
405446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
405546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
405646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
405746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
40588d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
40598d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
406054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
406149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40625bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
40635bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
40641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
40655bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
40665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
40685bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40695bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
40701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
40715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
40735bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               newDstFormat, dstAddr,
40745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstXoffset, dstYoffset, dstZoffset,
40755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstRowStride, dstImageOffsets,
40765bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
40775bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
40785bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
40795bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
40805bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
40815bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40825bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
408349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40848d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
40858d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
40861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
408746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
408846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
409046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
409246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
409354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
4094bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
409554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         newDstFormat, dstAddr,
409654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstXoffset, dstYoffset, dstZoffset,
409754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstRowStride, dstImageOffsets,
409854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcWidth, srcHeight, srcDepth,
409954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcFormat, srcType,
410054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcAddr, srcPacking);
410146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
41028d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
41038d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
410454e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
410549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
41068d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
41078d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
41081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
410946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
411046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
41111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
411246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
411346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
41141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
411546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
41165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
41175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      newDstFormat, dstAddr,
41185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      dstXoffset, dstYoffset, dstZoffset,
41195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      dstRowStride, dstImageOffsets,
41205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcWidth, srcHeight, srcDepth,
41215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcFormat, srcType,
41225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcAddr, srcPacking);
412346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
41248d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
41258d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
41269927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
41279927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
41289927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
41299927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
41309927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
41319927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
41329927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
41339927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
41349927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
41358d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
41368d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
41379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean
41389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
41399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{
41409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
41419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
41429d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
41439d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(baseInternalFormat == GL_RGB);
41449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
41459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   if (!ctx->_ImageTransferState &&
41469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       !srcPacking->SwapBytes &&
41479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       srcFormat == GL_RGB &&
41489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       srcType == GL_UNSIGNED_INT_5_9_9_9_REV) {
41499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* simple memcpy path */
41509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      memcpy_texture(ctx, dims,
41519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
41529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     dstRowStride,
41539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     dstImageOffsets,
41549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
41559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcAddr, srcPacking);
41569d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
41579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   else {
41589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* general path */
41599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
41609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseInternalFormat,
41619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseFormat,
41629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
41639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcFormat, srcType, srcAddr,
41649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcPacking,
41659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 ctx->_ImageTransferState);
41669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *srcRow = tempImage;
41679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      GLint img, row, col;
41689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      if (!tempImage)
41699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         return GL_FALSE;
41709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      for (img = 0; img < srcDepth; img++) {
41719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
41729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            + dstImageOffsets[dstZoffset + img] * 4
41739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            + dstYoffset * dstRowStride
41749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            + dstXoffset * 4;
41759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         for (row = 0; row < srcHeight; row++) {
41769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint *dstUI = (GLuint*)dstRow;
41779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (col = 0; col < srcWidth; col++) {
41789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]);
41799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
41809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            dstRow += dstRowStride;
41819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            srcRow += srcWidth * 3;
41829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
41839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      }
41849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
41859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      free((void *) tempImage);
41869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
41879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   return GL_TRUE;
41889d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák}
4189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean
4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
4192631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{
4193631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
4194631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4195631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
4196631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(baseInternalFormat == GL_RGB);
4197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   if (!ctx->_ImageTransferState &&
4199631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       !srcPacking->SwapBytes &&
4200631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       srcFormat == GL_RGB &&
4201631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       srcType == GL_UNSIGNED_INT_10F_11F_11F_REV) {
4202631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* simple memcpy path */
4203631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      memcpy_texture(ctx, dims,
4204631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
4205631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     dstRowStride,
4206631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     dstImageOffsets,
4207631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
4208631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcAddr, srcPacking);
4209631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
4210631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   else {
4211631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* general path */
4212631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
4213631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseInternalFormat,
4214631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseFormat,
4215631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
4216631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcFormat, srcType, srcAddr,
4217631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcPacking,
4218631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 ctx->_ImageTransferState);
4219631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *srcRow = tempImage;
4220631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      GLint img, row, col;
4221631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      if (!tempImage)
4222631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         return GL_FALSE;
4223631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      for (img = 0; img < srcDepth; img++) {
4224631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         GLubyte *dstRow = (GLubyte *) dstAddr
4225631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            + dstImageOffsets[dstZoffset + img] * 4
4226631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            + dstYoffset * dstRowStride
4227631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            + dstXoffset * 4;
4228631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         for (row = 0; row < srcHeight; row++) {
4229631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint *dstUI = (GLuint*)dstRow;
4230631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (col = 0; col < srcWidth; col++) {
4231631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]);
4232631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
4233631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            dstRow += dstRowStride;
4234631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            srcRow += srcWidth * 3;
4235631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
4236631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      }
4237631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4238631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      free((void *) tempImage);
4239631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
4240631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   return GL_TRUE;
4241631d23daa91c569bf268a2191bd466df73a64263Marek Olšák}
4242631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4243485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4244b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean
4245b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
4246b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{
4247b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
4248b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL ||
4249b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
4250b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_STENCIL_INDEX);
4251b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat != GL_DEPTH_STENCIL ||
4252b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4253b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4254b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL &&
4255b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthScale == 1.0f &&
4256b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthBias == 0.0f &&
4257b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       !srcPacking->SwapBytes) {
4258b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* simple path */
4259b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      memcpy_texture(ctx, dims,
4260b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
4261b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     dstRowStride,
4262b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     dstImageOffsets,
4263b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
4264b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcAddr, srcPacking);
4265b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
4266b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
4267b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
4268b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      GLint img, row;
4269b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      const GLint srcRowStride
4270b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
4271b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         / sizeof(uint64_t);
4272b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4273b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* In case we only upload depth we need to preserve the stencil */
4274b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      for (img = 0; img < srcDepth; img++) {
4275b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         uint64_t *dstRow = (uint64_t *) dstAddr
4276b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            + dstImageOffsets[dstZoffset + img]
4277b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            + dstYoffset * dstRowStride / sizeof(uint64_t)
4278b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            + dstXoffset;
4279b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         const uint64_t *src
4280b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
4281b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcWidth, srcHeight,
4282b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcFormat, srcType,
4283b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  img, 0, 0);
4284b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         for (row = 0; row < srcHeight; row++) {
4285b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            /* The unpack functions with:
4286b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
4287b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * only write their own dword, so the other dword (stencil
4288b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * or depth) is preserved. */
4289b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_STENCIL_INDEX)
4290b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_depth_span(ctx, srcWidth,
4291b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
4292b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       dstRow, /* dst addr */
4293b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       1.0f, srcType, src, srcPacking);
4294b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4295b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_DEPTH_COMPONENT)
4296b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_stencil_span(ctx, srcWidth,
4297b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
4298b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         dstRow, /* dst addr */
4299b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         srcType, src, srcPacking,
4300b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         ctx->_ImageTransferState);
4301b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4302b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            src += srcRowStride;
4303b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            dstRow += dstRowStride / sizeof(uint64_t);
4304b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         }
4305b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      }
4306b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
4307b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   return GL_TRUE;
4308b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák}
4309b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4310485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4311485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
431239de9251c4770fdcce3395643003aa626178446dBrian Paul * Table mapping MESA_FORMAT_* to _mesa_texstore_*()
4313485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary.
4314485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
4315b1616b2a811b9a161d1ee2a8251e0efe32a8c192Ian Romanickstatic const struct {
4316485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   gl_format Name;
4317485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   StoreTexImageFunc Store;
4318485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
4319485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] =
4320485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
4321bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_NONE, NULL },
4322485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 },
4323485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 },
4324485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 },
4325485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 },
432674d61d03b54d72217d463c248468cdcd09320efcBrian Paul   { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 },
43272d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer   { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 },
4328485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 },
4329485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 },
4330485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 },
4331485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 },
4332485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 },
4333485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 },
4334485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 },
4335485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 },
4336485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 },
4337bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   { MESA_FORMAT_AL44, _mesa_texstore_unorm44 },
43385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL88, _mesa_texstore_unorm88 },
43395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 },
43405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 },
43415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 },
4342485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 },
4343bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   { MESA_FORMAT_A8, _mesa_texstore_unorm8 },
4344eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   { MESA_FORMAT_A16, _mesa_texstore_unorm16 },
4345bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   { MESA_FORMAT_L8, _mesa_texstore_unorm8 },
4346bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák   { MESA_FORMAT_L16, _mesa_texstore_unorm16 },
4347bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   { MESA_FORMAT_I8, _mesa_texstore_unorm8 },
4348fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák   { MESA_FORMAT_I16, _mesa_texstore_unorm16 },
4349485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr },
4350485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr },
4351bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   { MESA_FORMAT_R8, _mesa_texstore_unorm8 },
43525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG88, _mesa_texstore_unorm88 },
43535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 },
4354eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   { MESA_FORMAT_R16, _mesa_texstore_unorm16 },
43555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 },
43565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 },
4357621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   { MESA_FORMAT_ARGB2101010, _mesa_texstore_argb2101010 },
4358485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 },
4359485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 },
4360485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z16, _mesa_texstore_z16 },
4361e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 },
4362c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 },
4363485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z32, _mesa_texstore_z32 },
4364c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   { MESA_FORMAT_S8, _mesa_texstore_s8 },
4365bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 },
4366bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 },
4367bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 },
4368bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SL8, _mesa_texstore_sl8 },
4369bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SLA8, _mesa_texstore_sla8 },
4370bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 },
4371bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 },
4372bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 },
4373bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 },
4374bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 },
4375bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 },
4376bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 },
4377bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 },
4378bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 },
4379bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 },
4380bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 },
4381bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 },
4382bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 },
4383bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 },
4384bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
4385bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
4386bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 },
4387bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 },
4388bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
4389bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
4390bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
4391bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
43920ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák   { MESA_FORMAT_R_FLOAT32, _mesa_texstore_rgba_float32 },
43930ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák   { MESA_FORMAT_R_FLOAT16, _mesa_texstore_rgba_float16 },
43940ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák   { MESA_FORMAT_RG_FLOAT32, _mesa_texstore_rgba_float32 },
43950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák   { MESA_FORMAT_RG_FLOAT16, _mesa_texstore_rgba_float16 },
4396abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
4398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
4399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 },
4400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 },
4401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 },
4402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 },
4403abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
4404bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
440584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
4406daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_R8, _mesa_texstore_snorm8 },
4407daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_RG88_REV, _mesa_texstore_snorm88 },
440884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 },
440984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
4410bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
4411bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
441284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
4413daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_R16, _mesa_texstore_snorm16 },
4414daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_GR1616, _mesa_texstore_snorm1616 },
4415279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 },
441617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 },
44178d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie   { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 },
44188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie
44198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie   { MESA_FORMAT_RED_RGTC1, _mesa_texstore_red_rgtc1 },
44208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie   { MESA_FORMAT_SIGNED_RED_RGTC1, _mesa_texstore_signed_red_rgtc1 },
44218d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie   { MESA_FORMAT_RG_RGTC2, _mesa_texstore_rg_rgtc2 },
44227d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   { MESA_FORMAT_SIGNED_RG_RGTC2, _mesa_texstore_signed_rg_rgtc2 },
44237d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák
44247d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   /* Re-use the R/RG texstore functions.
44257d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák    * The code is generic enough to handle LATC too. */
44267d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   { MESA_FORMAT_L_LATC1, _mesa_texstore_red_rgtc1 },
44277d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   { MESA_FORMAT_SIGNED_L_LATC1, _mesa_texstore_signed_red_rgtc1 },
44287d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   { MESA_FORMAT_LA_LATC2, _mesa_texstore_rg_rgtc2 },
4429daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 },
4430daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
4431daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_A8, _mesa_texstore_snorm8 },
4432daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_L8, _mesa_texstore_snorm8 },
4433daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_AL88, _mesa_texstore_snorm88 },
4434daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_I8, _mesa_texstore_snorm8 },
4435daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
4436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_A16, _mesa_texstore_snorm16 },
4437daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_L16, _mesa_texstore_snorm16 },
4438daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_AL1616, _mesa_texstore_snorm1616 },
4439daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   { MESA_FORMAT_SIGNED_I16, _mesa_texstore_snorm16 },
44409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
44419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   { MESA_FORMAT_RGB9_E5_FLOAT, _mesa_texstore_rgb9_e5 },
4442631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   { MESA_FORMAT_R11_G11_B10_FLOAT, _mesa_texstore_r11_g11_b10f },
44431165280cbd37dee1e499358633478ab869de21dfMarek Olšák
4444bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   { MESA_FORMAT_Z32_FLOAT, _mesa_texstore_z32 },
4445b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   { MESA_FORMAT_Z32_FLOAT_X24S8, _mesa_texstore_z32f_x24s8 },
4446485105ed182e2e997b084f047e72d5a2c3460057Brian Paul};
4447485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4448485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4449920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
4450920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
4451920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
4452920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
4453920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
4454920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
4455920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstAddr;
4456920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
4457920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstRowStride; (void) dstImageOffsets;
4458920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
4459920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
4460920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
4461920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
4462920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4463920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
4464920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
4465920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
4466920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
4467920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4468920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4469485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
4470485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
4471485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
4472e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
4473485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
4474485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
4475bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG
44761f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul   GLuint i;
4477485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
4478bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul      ASSERT(texstore_funcs[i].Name == i);
4479485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
4480bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif
4481bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   ASSERT(texstore_funcs[format].Name == format);
4482920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4483920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   if (texstore_funcs[format].Store)
4484920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return texstore_funcs[format].Store;
4485920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   else
4486920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return _mesa_texstore_null;
4487485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
4488485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4489485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4490660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
4491660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
4492660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
4493660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
4494660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
4495660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
4496660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
4497660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
4498660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
4499660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
45001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
4501660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4502660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
4503660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
4504660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstRowStride, dstImageOffsets,
4505660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
4506660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
4507660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
4508660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
4509660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4510485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
451181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/**
451281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it.
451381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture
451481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from
451581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values.
451681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat  the user-provided image format
451781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat  the destination texture format
451881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */
451981430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield
452081430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat)
45215999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
452281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT)
452381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul       && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL)
452481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
452581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   else
452681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_WRITE_BIT;
45275999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
45285999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4529ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
45301da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage1D().
45316b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
45328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
45338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4534f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
45358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
45368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint border,
45378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const GLvoid *pixels,
45388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
45398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
45408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
45418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
454281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
454381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLuint zeroImageOffset = 0;
454481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
454581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
454681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
454781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4548a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
45498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
455078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
455178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
455278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, 1, 1)) {
45537d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
45547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
45557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
45568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4557e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4558e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage1D");
45596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
45606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
45616b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
45626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
456389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
45646b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
456581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
456681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
456781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
456881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               0, 0, width, 1,
456981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
457081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
457181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
457281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
457381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            texImage->TexFormat,
457481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstMap,
457581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, 0, 0,  /* dstX/Y/Zoffset */
457681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, /* dstRowStride */
457781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            &zeroImageOffset,
457881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            width, 1, 1,
457981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            format, type, pixels, packing);
458081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
458181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
458281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
458381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
458481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
4585f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
458671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
45878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
45888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
45898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
45906b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
45911da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage2D().
45926b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul *
4593b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather
4594b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM.  Device driver's can easily plug in their own replacement.
45958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
45968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4597f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
45988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
45998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint border,
46008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
46018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
46028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
46038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
46048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
460581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
460681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLuint zeroImageOffset = 0;
460781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
460881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
460981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
461081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4611a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
46128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
461378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
461478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
461578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
46167d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
46177d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
46187d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
46198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
462071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4621e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage2D");
46226b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
46236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
46246b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
46256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
462689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
46276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
462881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4629229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   if (target == GL_TEXTURE_1D_ARRAY) {
4630229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      const GLint srcStride =
4631229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         _mesa_image_row_stride(packing, width, format, type);
4632229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      int y;
4633229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4634229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      success = GL_TRUE;
4635229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4636229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      for (y = 0; y < height; y++) {
4637229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         /* Map dest texture buffer (write to whole region) */
4638229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         ctx->Driver.MapTextureImage(ctx, texImage, y,
4639229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     0, 0, width, 1,
4640229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     rwMode,
4641229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     &dstMap, &dstRowStride);
4642229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         assert(dstMap);
4643229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
4644229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  texImage->TexFormat,
4645229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  dstMap,
4646229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  0, 0, 0,  /* dstX/Y/Zoffset */
4647229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  dstRowStride,
4648229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  &zeroImageOffset,
4649229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  width, 1, 1,
4650229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  format, type, pixels, packing);
4651229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         ctx->Driver.UnmapTextureImage(ctx, texImage, y);
4652229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4653229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         if (!success)
4654229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt            break;
4655229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4656229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         pixels += srcStride;
4657229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      }
4658229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   } else {
4659229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      /* Map dest texture buffer (write to whole region) */
4660229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      ctx->Driver.MapTextureImage(ctx, texImage, 0,
4661229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  0, 0, width, height,
4662229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  rwMode,
4663229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  &dstMap, &dstRowStride);
4664229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      assert(dstMap);
4665229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
4666229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               texImage->TexFormat,
4667229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               dstMap,
4668229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               0, 0, 0,  /* dstX/Y/Zoffset */
4669229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               dstRowStride,
4670229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               &zeroImageOffset,
4671229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               width, height, 1,
4672229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                               format, type, pixels, packing);
4673229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4674229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
4675229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   }
467681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
467781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
467881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
4679f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
468071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
46818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
46828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
46838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
46848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
46856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
46861da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage3D().
46876b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
46888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
46898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4690f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
46918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
46928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint depth, GLint border,
46938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
46948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
46958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
46968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
46978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
469881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
469981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
470081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint slice;
470181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte **sliceMaps;
470281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLuint *dstImageOffsets;
470381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
470481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLuint texelSize = _mesa_get_format_bytes(texImage->TexFormat);
470581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4706a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
47078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
470878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
470978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
471078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, depth)) {
471178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
47127d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
47137d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
47148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
471581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth,
471681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                        format, type,
471781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                        pixels, packing, "glTexImage3D");
47186b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
47196b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
47206b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
47216b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
472289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
47236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
472481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4725229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   if (target == GL_TEXTURE_1D_ARRAY) {
4726229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      depth = height;
4727229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      height = 1;
4728229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   }
4729229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
473081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   sliceMaps = (GLubyte **) malloc(depth * sizeof(GLubyte *));
473181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   dstImageOffsets = (GLuint *) malloc(depth * sizeof(GLuint));
473281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
473381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer slices */
473481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
473581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage, slice,
473681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  0, 0, width, height,
473781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  rwMode,
473881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  &sliceMaps[slice], &dstRowStride);
473981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
474081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Compute image slice offsets */
474181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
474281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      dstImageOffsets[slice] = (sliceMaps[slice] - sliceMaps[0]) / texelSize;
474381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
474481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
474581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
474681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            texImage->TexFormat,
474781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            sliceMaps[0],
474881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, 0, 0,  /* dstX/Y/Zoffset */
474981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstRowStride,
475081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstImageOffsets,
475181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            width, height, depth,
475281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            format, type, pixels, packing);
475381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
475481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Unmap dest texture buffer slices */
475581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
475681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, slice);
4757f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
4758f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
475981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
476081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
476181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
476271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
476381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
476481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(sliceMaps);
476581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(dstImageOffsets);
47668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
47678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
477289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D()
477389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D().
47748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
47758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4776f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level,
47778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint width,
47788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
47798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
47808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
47818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
47828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
478381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
478481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLuint zeroImageOffset = 0;
478581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
478681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
478781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
478881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4789b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4790e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4791e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage1D");
47927a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
47937a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
47947a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
479581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
479681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
479781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, 0, width, 1,
479881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
479981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
480081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
480181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
480281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            texImage->TexFormat,
480381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstMap,
480481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, 0, 0,  /* dstX/Y/Zoffset */
480581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstRowStride,
480681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            &zeroImageOffset,
480781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            width, 1, 1,
480881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            format, type, pixels, packing);
480981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
481081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
481181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
481281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
481381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
48143893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
481571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
48168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
48178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
481989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
482189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D()
482289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D().
48238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
48248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4825f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level,
48268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset,
48278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height,
48288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
48298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
48308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
48318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
48328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
483381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
483481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLuint zeroImageOffset = 0;
483581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
483681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
483781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
483881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4839b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
484071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4841e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage2D");
48427a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
48437a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
48447a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
484581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
484681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
484781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
484881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
484981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
485081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
485181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
485281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            texImage->TexFormat,
485381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstMap,
485481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, 0, 0,  /* dstX/Y/Zoffset */
485581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstRowStride,
485681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            &zeroImageOffset,
485781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            width, height, 1,
485881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            format, type, pixels, packing);
485981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
486081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
486181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
486281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
486381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
48643893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
486571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
48668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
48678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
48708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D().
487189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D().
48728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
48738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4874f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level,
48758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset, GLint zoffset,
48768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height, GLint depth,
48778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
48788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
48798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
48808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
48818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
488281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
488381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
488481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint slice;
488581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte **sliceMaps;
488681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLuint *dstImageOffsets;
488781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
488881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLuint texelSize = _mesa_get_format_bytes(texImage->TexFormat);
488981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4890b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4891e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
4892e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing,
4893e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        "glTexSubImage3D");
4894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!pixels)
4895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return;
4896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
489781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   sliceMaps = (GLubyte **) malloc((zoffset + depth) * sizeof(GLubyte *));
489881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   dstImageOffsets = (GLuint *) malloc((zoffset + depth) * sizeof(GLuint));
489981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
490081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer slices */
490181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
490281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice,
490381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  xoffset, yoffset, width, height,
490481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  rwMode,
490581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  &sliceMaps[zoffset + slice], &dstRowStride);
490681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
490781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
490881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Compute image slice offsets */
490981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
491081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      dstImageOffsets[slice] =
491181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul         (sliceMaps[zoffset + slice] - sliceMaps[zoffset]) / texelSize;
491281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
491381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
491481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
491581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            texImage->TexFormat,
491681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            sliceMaps[zoffset],
491781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            0, 0, 0,  /* dstX/Y/Zoffset */
491881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstRowStride,
491981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            dstImageOffsets,
492081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            width, height, depth,
492181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                            format, type, pixels, packing);
492281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
492381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Unmap dest texture buffer slices */
492481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
492581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + slice);
4926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
49278f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
492881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
492981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
493081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
493171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
493281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
493381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(sliceMaps);
493481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(dstImageOffsets);
49358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
49368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49382aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/*
49398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D()
49408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
49418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
494278527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx,
494378527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
49448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
49458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint border,
49468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
49478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
49488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
49498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
495089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
4951a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4952a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4953a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
4954a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) border;
4955a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4956a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
4957a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
49588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
49598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4962b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
49638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D()
49648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
49658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
496678527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx,
496778527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
49688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
49698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint border,
49708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
49718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
49728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
49738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
497481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
497581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
4976a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul
497789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* This is pretty simple, basically just do a memcpy without worrying
497889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul    * about the usual image unpacking or image transfer operations.
49798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
498089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texObj);
498189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
498289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
498389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
498489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
498589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
498689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
498778026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
498878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
498978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
499078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
499189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
499289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
499389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4994e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4995e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
4996e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexImage2D");
49977a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
49987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
49997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
500081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
500181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
500281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
500381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               0, 0, width, height,
500481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               GL_MAP_WRITE_BIT,
500581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
500681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
500789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* copy the data */
500881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   memcpy(dstMap, data, imageSize);
500981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
501081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
50118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
501271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
50138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
50148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
50188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D()
50198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
50208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
502178527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx,
502278527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
50238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
50248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint depth,
50258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint border,
50268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
50278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
50288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
50298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
503089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
5031a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5032a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5033a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
5034a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
5035a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
5036a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5037a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5038a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
50398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
50408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
504389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
504489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D()
5045e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
5046e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
5047f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target,
504889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
504989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLsizei width,
505089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
505189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
505289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
505389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
5054e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{
50555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 1D texture formats yet */
5056a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5057a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5058a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) width;
5059a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
5060a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5062a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
5063e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul}
5064e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
5065e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
506689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
506789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D()
506889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
506989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
5070f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target,
507189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
507289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLint yoffset,
507389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei width, GLsizei height,
507489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
507589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
507689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
507789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
507889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
507981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint bytesPerRow, dstRowStride, srcRowStride;
508089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
508181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
508289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
50831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
5084d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
50855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
5086d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
50875999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
508889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* these should have been caught sooner */
5089d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((width % bw) == 0 || width == 2 || width == 1);
5090d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((height % bh) == 0 || height == 2 || height == 1);
5091d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((xoffset % bw) == 0);
5092d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((yoffset % bh) == 0);
509389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5094b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
5095e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
5096e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
5097e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
50987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
50997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
51007a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
51012594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
510289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
510389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
510481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
510581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
510681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
510781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               GL_MAP_WRITE_BIT,
510881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
510989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5110bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   bytesPerRow = srcRowStride;  /* bytes per row of blocks */
5111d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   rows = height / bh;  /* rows in blocks */
511289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5113bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   /* copy rows of blocks */
511489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   for (i = 0; i < rows; i++) {
511581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      memcpy(dstMap, src, bytesPerRow);
511681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      dstMap += dstRowStride;
511789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      src += srcRowStride;
511889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
51198f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
512081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
512181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
512271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
512389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
512489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
512589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
512689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
512789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D()
512889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
512989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
5130f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target,
513189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint level,
513289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint xoffset, GLint yoffset, GLint zoffset,
513389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei width, GLsizei height, GLsizei depth,
513489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLenum format,
513589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei imageSize, const GLvoid *data,
513689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_object *texObj,
513789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_image *texImage)
513889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
51395999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 3D texture formats yet */
5140a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5141a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5142a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) yoffset; (void) zoffset;
5143a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
5144a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
5145a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5146a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5147a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
514889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
5149