texstore.c revision 9fc7fa0a4cbe9dc8faa124744f623491fa754bd7
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"
611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
623c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
6489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
65da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h"
66da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h"
678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h"
688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
692e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h"
708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
71248200737398a7d6403a23930a6c9d93db06b942Brian Paul
72fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
73fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
74fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
75fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
7671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
77248200737398a7d6403a23930a6c9d93db06b942Brian Paul
78248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
79e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
80e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
81e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
82e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
83e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
85248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
86248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
87248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
88248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
89248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
9371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
9471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
1045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG:
10571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
10671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
10771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
10871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
10971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
11071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
113fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
114fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
115fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
116fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
117fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
1265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   IDX_RG,
127fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
128fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
129fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1362e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
142fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   {
2155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      IDX_RG,
2165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP4(0, 1, ZERO, ONE),
2175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP2(0, 1)
2185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   },
219fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
220fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
221fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
222fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
223248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
224248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
225248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
226248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
227248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
229fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
230fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
231fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
232fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
233fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
2425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG: return IDX_RG;
243fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
244fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
245fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
246fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
247fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
255fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
256fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
262248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
263248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
264248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
265248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2672e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2746b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0
275298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
276298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
277298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
278298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[0],
279298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[1],
280298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[2],
281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[3],
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[4],
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[5]);
2846b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif
285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
29339de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic GLfloat *
312f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmake_temp_float_image(struct gl_context *ctx, GLuint dims,
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum logicalBaseFormat,
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum textureBaseFormat,
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLint srcWidth, GLint srcHeight, GLint srcDepth,
316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum srcFormat, GLenum srcType,
317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      const GLvoid *srcAddr,
318f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      const struct gl_pixelstore_attrib *srcPacking)
319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
322a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint components = _mesa_components_in_format(logicalBaseFormat);
323a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint srcStride =
324a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
325a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLfloat *dst;
326a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLint img, row;
327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
3325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
3335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_COLOR_INDEX ||
339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
3435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
3445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_COLOR_INDEX ||
350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
352a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
353a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				  * components * sizeof(GLfloat));
354a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   if (!tempImage)
355a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      return NULL;
356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   dst = tempImage;
358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   for (img = 0; img < srcDepth; img++) {
359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      const GLubyte *src
360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcWidth, srcHeight,
362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcFormat, srcType,
363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 img, 0, 0);
364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      for (row = 0; row < srcHeight; row++) {
365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       dst, srcFormat, srcType, src,
367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       srcPacking, transferOps);
368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 dst += srcWidth * components;
369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 src += srcStride;
370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
3793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
38113ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
38213ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
38313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
386f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
39032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
39332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
41332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLchan components.
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
42639de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
432f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLchan.
443f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
4448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian PaulGLchan *
445f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_make_temp_chan_image(struct gl_context *ctx, GLuint dims,
4468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum logicalBaseFormat,
4478f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum textureBaseFormat,
4488f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLint srcWidth, GLint srcHeight, GLint srcDepth,
4498f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum srcFormat, GLenum srcType,
4508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           const GLvoid *srcAddr,
4518f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           const struct gl_pixelstore_attrib *srcPacking)
452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLchan *tempImage, *dst;
457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
4625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
4635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
4715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
4725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
47932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   tempImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                       * components * sizeof(GLchan));
48196128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
48396128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
4878c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
4888c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
4898c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
4908c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
4918c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
4928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
4938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
4959c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul         _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst,
4969c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul                                      srcFormat, srcType, src, srcPacking,
4979c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul                                      transferOps);
498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLchan *newImage;
508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
5093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
51113ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
51213ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
51313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
52032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
5212dbffb30f05fcf67658c64b8101e9efaf07ca388Brian Paul                                         * texComponents * sizeof(GLchan));
522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
52332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
5273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = CHAN_MAX;
538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
54332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
551c039af165d5919008c6df599795951f85dea164dBrian Paul/**
552c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
553c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
554c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
555c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
556c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
557248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
558248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
559248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
560c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
561c039af165d5919008c6df599795951f85dea164dBrian Paul */
562c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
563c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
564c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
56571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
566501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
567501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
568501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
569501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
570501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
571501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
572501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
573501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
574501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
575501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
576501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
577501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
578501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
579501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
580501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
581501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
582501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
583501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
584501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
585501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
586501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
587248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
58871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
58971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
59071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
59171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
592501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
593501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
594501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
59571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
59671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
597501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
598501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
599501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
600501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
601501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
602501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
603501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
604501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
605501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
606501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
607501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
608501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
609501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
610501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
611501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
61271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
61371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
61471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
615501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
616501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
617501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
618501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
619501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
620501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
621501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
622501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
623501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
624501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
625501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
626501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
627501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
628501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
629501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
63071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
63171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
63271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
633501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
634501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
635501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
636501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
637501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
638501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
639501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
640501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
641501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
642501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
643501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
644501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
645501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
646501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
647501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
64871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
64971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
6503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
651501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
652501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
653501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
654501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
655501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
656501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
657501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
658501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
659501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
660501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
661501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
662501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
663501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
664501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
665501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
6663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
6673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
668501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
669501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
67071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
671501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
67271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
67371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
67446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
675501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
676bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
677bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
67846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
67939de9251c4770fdcce3395643003aa626178446dBrian Paul
68039de9251c4770fdcce3395643003aa626178446dBrian Paul/**
68139de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
68239de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness.
683bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
68446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
685bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
68646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
68746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
688c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
68946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
69046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
691bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
692df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
693bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
694df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
69546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
69646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
69746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
69846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
69946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
70039de9251c4770fdcce3395643003aa626178446dBrian Paul
70139de9251c4770fdcce3395643003aa626178446dBrian Paul/**
70239de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
70339de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state.
70446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
70546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
706bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
707bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
70846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
709bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
710bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
711bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
71246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
713c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
71446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
71546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
71646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
71746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
71846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
71946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
72046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
72146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
72246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
72346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
72446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
72546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
726c039af165d5919008c6df599795951f85dea164dBrian Paul/**
727c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
728c039af165d5919008c6df599795951f85dea164dBrian Paul */
72971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
730f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx,
73171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
73271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
73346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
73446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
7350c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
7360c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
73746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
7380c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
73971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
74071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLvoid *dstAddr,
74171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
742b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
743b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                          const GLuint *dstImageOffsets,
74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
74771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
74871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
74971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
750bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
7513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
75271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
753c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
754c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
755c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
756c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
757c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
758c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
759c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
760c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
761c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
762c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
764edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
765edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
7660c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
7670c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
7680c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
7690c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
7703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
7713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
772bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
773bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
77446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
77571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
77671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
777bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
77871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
779298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
7802e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
781b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
782b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
7839c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
784b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
785b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
786b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstImage = (GLubyte *) dstAddr
787b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
788b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstXoffset * dstComponents;
78971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
790b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
79171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
79271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
79371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
79471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
79571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
796b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
797b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img] * dstComponents
798b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
799b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset * dstComponents;
80071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
80171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
80271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
80371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
80471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
80571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         srcImage += srcImageStride;
80671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
80771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
80871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
80971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
81071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
812f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do.
813f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed.
814f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported.
815f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
816f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void
817f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx,
81817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
8191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLvoid *dstAddr,
821f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
822b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
823b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               const GLuint *dstImageOffsets,
824f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
826f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
828f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
830f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
83360909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
83460909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
8351f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
83622108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
837b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
838b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0
839b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* XXX update/re-enable for dstImageOffsets array */
840f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerImage = srcHeight * bytesPerRow;
841f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerTexture = srcDepth * bytesPerImage;
842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLubyte *dstImage = (GLubyte *) dstAddr
843f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstZoffset * dstImageStride
844f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstYoffset * dstRowStride
84522108bb571808542b89677752d62d3901698265fBrian Paul                     + dstXoffset * texelBytes;
846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
847f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       dstRowStride == bytesPerRow &&
849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((dstImageStride == srcImageStride &&
850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImageStride == bytesPerImage) ||
851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul        (srcDepth == 1))) {
852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one big memcpy */
85317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture);
854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   else
856b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   {
857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
858f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLubyte *dstRow = dstImage;
861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
86217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
865f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
867f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImage += dstImageStride;
868f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
870b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif
871b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
872b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   GLint img, row;
873b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   for (img = 0; img < srcDepth; img++) {
874b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLubyte *srcRow = srcImage;
875b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstRow = (GLubyte *) dstAddr
87622108bb571808542b89677752d62d3901698265fBrian Paul         + dstImageOffsets[dstZoffset + img] * texelBytes
877b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
87822108bb571808542b89677752d62d3901698265fBrian Paul         + dstXoffset * texelBytes;
879b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      for (row = 0; row < srcHeight; row++) {
880b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
881b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         dstRow += dstRowStride;
882b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         srcRow += srcRowStride;
883b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      }
884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      srcImage += srcImageStride;
885b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   }
886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
890f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
891a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul * Store a 32-bit integer depth component texture image.
892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
89349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
894b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
89625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
8971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
898a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
8991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z32);
90022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLuint));
901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
902966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
903966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
905a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
906a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
907a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul       srcType == GL_UNSIGNED_INT) {
908f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
90917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
91060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
911b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
912b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
914f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
915f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
916f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
917f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
918f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
920b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
92122108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
922b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
92322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
92560909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
9271ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
928a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
929a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
930f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
939e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
941e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
942e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
944e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
945e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint texelBytes = 4;
946e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
947a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
948e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
950e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
954b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
955e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
956b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
957e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstXoffset * texelBytes;
958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
95960909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
9611ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
962a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
963a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
971e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
973c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
974c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
975c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
976c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
977c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
978c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
979c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint texelBytes = 4;
980c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
981c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   (void) dims;
982c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
983c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
984c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   {
985c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      /* general path */
986c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      GLint img, row;
987c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      for (img = 0; img < srcDepth; img++) {
988c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         GLubyte *dstRow = (GLubyte *) dstAddr
989c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstImageOffsets[dstZoffset + img] * texelBytes
990c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstYoffset * dstRowStride
991c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstXoffset * texelBytes;
992c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
993c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
994c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
995c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
996c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
997c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
998c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
999c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1000c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1001c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1002c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1003c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1004c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1005c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1006c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1007c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1008c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1009c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1010c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1011a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
101349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1014b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
101625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
10171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1018a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
10191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
102022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLushort));
1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1022966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1023966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1027a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
102917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
103060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1031b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1032b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1036f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
10381ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1040b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
104122108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1042b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
104322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
104560909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1047a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
10481ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1049a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1060defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
106249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1063b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
10651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
10661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
106722108bb571808542b89677752d62d3901698265fBrian Paul
10681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
10691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
107022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1071f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
10741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGB565 &&
1075a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1076a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1077a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT_5_6_5) {
1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
107917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
108060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1081b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1082b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1086a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1087a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1088a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1089a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1090a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1091a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1092a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
10938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
10948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1095a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
109660909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1097a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
1098a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLubyte *dst = (GLubyte *) dstAddr
1099a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                   + dstYoffset * dstRowStride
110022108bb571808542b89677752d62d3901698265fBrian Paul                   + dstXoffset * texelBytes;
1101a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1102a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1103a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1104a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1105defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
11061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1107f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1108f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1109f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1110f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1111f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1112f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1113f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1114f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1115f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1116f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1117defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1118a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1119a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1120a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1121a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1124a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1125a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
112622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1127a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1128a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1129a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1130a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *src = tempImage;
1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1132a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1133a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
113622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1137b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
113822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dstUS = (GLushort *) dstRow;
1141defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            /* check for byteswapped format */
11421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGB565) {
1143f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1144f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
1145f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                               CHAN_TO_UBYTE(src[GCOMP]),
1146f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                               CHAN_TO_UBYTE(src[BCOMP]) );
1147f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1148f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1149f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1150f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1151f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1152f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]),
1153f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                   CHAN_TO_UBYTE(src[GCOMP]),
1154f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                   CHAN_TO_UBYTE(src[BCOMP]) );
1155f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1156f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
116132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1167248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1168248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1169248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
117049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1171b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1173184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
11741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
11751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
117671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
11771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
11781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGBA8888_REV);
117922108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
11831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888 &&
1184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1185defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
11862e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
11872e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
11882e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
11892e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       /* simple memcpy path */
11902e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      memcpy_texture(ctx, dims,
11912e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
11922e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstRowStride,
11932e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstImageOffsets,
11942e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
11952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcAddr, srcPacking);
11962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   }
11972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   else if (!ctx->_ImageTransferState &&
11982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       !srcPacking->SwapBytes &&
11991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888_REV &&
12002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
12012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
12022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
12032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
12042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
1205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
120617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
120760909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1208b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1209b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
121371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
121446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
121546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
121646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1217528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
121871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
121946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
122071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
122171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1222528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
122371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
12241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
12251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
122646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
122746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
122846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
122946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
123046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
123146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
123246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
123346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
123446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
123546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
123646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
123771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
123871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
123971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
124046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1241528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
124271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
124371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1244528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				dstRowStride, dstImageOffsets,
124571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
124671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
124771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
12508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
125222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
1257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1261b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
126222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1263b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
126422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint *dstUI = (GLuint *) dstRow;
12671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGBA8888) {
1268f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1269f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
1270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1271f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]),
1272f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[ACOMP]) );
1273f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1274f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1276f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1277f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1278f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]),
1279f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1280f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]),
1281f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[ACOMP]) );
1282f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1283f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1284a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1285a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1286a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1287a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
128832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1289a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1290a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1291a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1292a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1293a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
129449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1295b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1297184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
12981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1299f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul   const GLenum baseFormat = GL_RGBA;
1300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
13011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
130274d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
13032d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888 ||
13042d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888_REV );
130522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
130974d61d03b54d72217d463c248468cdcd09320efcBrian Paul       (dstFormat == MESA_FORMAT_ARGB8888 ||
131074d61d03b54d72217d463c248468cdcd09320efcBrian Paul        dstFormat == MESA_FORMAT_XRGB8888) &&
1311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
1314defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
1315defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (little endian) */
131617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
131760909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1318b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1319b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1323defb035b6cf03c555318d9dd48864242ed036f39Brian Paul   else if (!ctx->_ImageTransferState &&
1324a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
13252d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer       (dstFormat == MESA_FORMAT_ARGB8888_REV ||
13262d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer        dstFormat == MESA_FORMAT_XRGB8888_REV) &&
1327a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1328a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_BGRA &&
1329a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
1330defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
1331defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
133217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
133360909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1334b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1335b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1336a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1337a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1338a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
133971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
134174d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
134274d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
134371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
13440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
13450c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
13498c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13508c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1353b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
135422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
135622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
135771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1358259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
135971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
136024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
136124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
136224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
136324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
136471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
136571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
136671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
136771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
136871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
136971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
137071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
137171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
13721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
137371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
13740c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
137524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1376259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
13858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1389b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
139022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1391b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
139222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1394259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
139624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
139724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
139824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
139924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
140071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
140171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
140271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
140371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
140471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
140571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
140671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
140746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
140846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
140946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
14100c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
141171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
141271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
141371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
141471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
14150c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
14171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
141874d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
14192d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
14202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
142146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
142246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
142346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
142446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
142546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
142646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
14271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
142874d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
14292d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
143074d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
143146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
143246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
143346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
143446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
143546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
143671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
143771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
143871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
143946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
14400c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
144271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
1444b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                                dstImageOffsets,
144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
144671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
144771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1448a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1449a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1450a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
145222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1453a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1454a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1455a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *src = tempImage;
1457a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1458a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1459a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1460a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1461b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
146222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
146422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1465a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1466a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLuint *dstUI = (GLuint *) dstRow;
14671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB8888) {
1468f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1469f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
1470f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
1471f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1472f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
1473f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1474f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1475a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
147674d61d03b54d72217d463c248468cdcd09320efcBrian Paul            else if (dstFormat == MESA_FORMAT_XRGB8888) {
147774d61d03b54d72217d463c248468cdcd09320efcBrian Paul               for (col = 0; col < srcWidth; col++) {
147874d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  dstUI[col] = PACK_COLOR_8888( 0xff,
147974d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
148074d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
148174d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
148274d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  src += 4;
148374d61d03b54d72217d463c248468cdcd09320efcBrian Paul               }
148474d61d03b54d72217d463c248468cdcd09320efcBrian Paul            }
1485f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1486f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1487f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]),
1488f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
1489f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1490f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
1491f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1492f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1493defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            }
1494a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1495a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1496a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
149732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1498a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1499a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1500a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1501a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
150349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1504b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1506184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
15071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
15081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
15101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
151122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGR &&
1517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
152017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
152160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1522b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1523b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1531a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1532b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
15348c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
15358c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
153660909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
153760909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1538b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
153922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1540b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
154122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
15533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
15543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
15553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
15563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
15573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
15593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
15613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1562167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
15633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1564167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
15653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
15663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
15683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
15693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
15703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
15713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
15723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
15733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
15743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
15753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
15763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
15798f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
158122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
15857c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul      const GLchan *src = (const GLchan *) tempImage;
1586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1590b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
159122108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1592b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
159322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0
1596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (littleEndian) {
1597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
1601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else {
1605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = srcUB[BCOMP];
1607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = srcUB[GCOMP];
1608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = srcUB[RCOMP];
1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else
1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]);
1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]);
1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif
1620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
162332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
162949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1630b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1631a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
1632184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
16331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
16341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1635a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
16361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
163722108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1638a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1640a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
1641a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1642a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1643a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_BYTE &&
1644a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       littleEndian) {
1645a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
164617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
164760909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1649b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1650a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1651a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1652a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1653a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1654a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1655a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1656a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1657a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1658a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1659a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
16608c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
16618c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
166260909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
166360909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1664b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
166522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1666b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
166722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1668a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1669a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1670a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1671a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1672a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1673a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1674a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1675a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1676a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1677a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1678a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
16853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
16873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1688167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
16893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1690167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
16913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
16923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
16943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
16953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
16963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
16973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
16983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
16993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
17003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
17013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
17023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1703a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1704a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1705a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1706a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
170722108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1708a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1709a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1710a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
17117c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul      const GLchan *src = (const GLchan *) tempImage;
1712a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1713a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1714a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1715a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1716b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
171722108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1718b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
171922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1720a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1721a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1722a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
1723a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1724a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
1725a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               src += 3;
1726a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1727a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1728a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1729a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
173032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1731a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1732a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1733a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1734a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1735a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
173649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1737b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1738f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
17391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
17401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
174122108bb571808542b89677752d62d3901698265fBrian Paul
17421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
17431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
174422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1745f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1746f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1747f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
17481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB4444 &&
1749f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1750f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1751defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
1752f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
175317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
175460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1755b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1756b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1757f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1758f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1759f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1761f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
17628f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1763f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
176422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1765f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1766f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1767f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1768f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
1769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1772f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1773b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
177422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
177622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1777f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1778f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
17791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB4444) {
1780f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1781f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
1782f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
1783f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1784f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
1785f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1786f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1787f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1788f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1789f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1790f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]),
1791f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
1792f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1793f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
1794f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1795f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1796a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1797a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1798a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1799a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
180032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1801a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1802a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1803a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1804a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
180549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1806dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1807dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
18081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
181022108bb571808542b89677752d62d3901698265fBrian Paul
18111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
181222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1814dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1815dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       !srcPacking->SwapBytes &&
18161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA5551 &&
1817dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1818dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcFormat == GL_RGBA &&
1819dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
1820dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1821dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
1822dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1823dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstRowStride,
1824dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstImageOffsets,
1825dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1826dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1827dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1828dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
1829dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* general path */
1830dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1831dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 baseInternalFormat,
183222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1833dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcWidth, srcHeight, srcDepth,
1834dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcFormat, srcType, srcAddr,
1835dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcPacking);
1836dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      const GLchan *src =tempImage;
1837dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      GLint img, row, col;
1838dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      if (!tempImage)
1839dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         return GL_FALSE;
1840dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      for (img = 0; img < srcDepth; img++) {
1841dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         GLubyte *dstRow = (GLubyte *) dstAddr
184222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1843dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            + dstYoffset * dstRowStride
184422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1845dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         for (row = 0; row < srcHeight; row++) {
1846dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            GLushort *dstUS = (GLushort *) dstRow;
1847dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    for (col = 0; col < srcWidth; col++) {
1848dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	       dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
1849dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[GCOMP]),
1850dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[BCOMP]),
1851dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[ACOMP]) );
1852dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	      src += 4;
1853dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    }
1854dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            dstRow += dstRowStride;
1855dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         }
1856dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      }
185732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1858dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1859dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1860dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1861defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
186249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1863b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
18651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
186722108bb571808542b89677752d62d3901698265fBrian Paul
18681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
18691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
187022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
18741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB1555 &&
1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1877defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
187917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
188060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1881b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1882b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1885f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
18888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
189022108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1893f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src =tempImage;
1895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1897f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1899b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
190022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
190222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
19051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB1555) {
1906f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1907f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
1909f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1910f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
1911f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1912f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1914f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1915f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1916f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]),
1917f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
1918f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1919f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
1920f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1921f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1922a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1923a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1924a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1925a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
192632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1927a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1928a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1929a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1930a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
193239de9251c4770fdcce3395643003aa626178446dBrian Paul/**
193339de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
193439de9251c4770fdcce3395643003aa626178446dBrian Paul */
193549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
19365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS)
1937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1938184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
19391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
19421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
19435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL88_REV ||
19445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG88 ||
19455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG88_REV);
194622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1947f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1948f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
19505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_RG88) &&
19515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       baseInternalFormat == srcFormat &&
1952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
195517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
195660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1957b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1958b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
19623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
1963bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
19643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
19653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
19663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
19673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
19683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
19693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
19703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
19715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
19725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
19735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
19745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
19755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 3;
19765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
19775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
19785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 3;
19795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
19805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
19813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
19823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
19835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_RG88) ||
19845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) {
19855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
19865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 1;
19875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
19885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
19895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 1;
19905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
19915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
19923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
19933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
19943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
19953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
19963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
19973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
19983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
19993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
20003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
20013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
20023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
20033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
20043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
20053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
20088f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
201022108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
202022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2021b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
202222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL88 ||
20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG88) {
2027f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
2030f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                             CHAN_TO_UBYTE(src[0]) );
2031f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2032f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2035f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2036f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2037f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]),
2038f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                 CHAN_TO_UBYTE(src[0]) );
2039f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2040f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2044a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
204532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2046a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2047a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2048a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2049a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2050a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
205139de9251c4770fdcce3395643003aa626178446dBrian Paul/**
205239de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
205339de9251c4770fdcce3395643003aa626178446dBrian Paul */
205449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
20555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
20563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{
20573325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLboolean littleEndian = _mesa_little_endian();
20583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
20593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
20603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
20613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
20625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL1616_REV ||
20635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	  dstFormat == MESA_FORMAT_RG1616 ||
20645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG1616_REV);
20653325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(texelBytes == 4);
20663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
20673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   if (!ctx->_ImageTransferState &&
20683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       !srcPacking->SwapBytes &&
20695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       (dstFormat == MESA_FORMAT_AL1616 || dstFormat == MESA_FORMAT_RG1616) &&
20705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       baseInternalFormat == srcFormat &&
20713325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       srcType == GL_UNSIGNED_SHORT &&
20723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       littleEndian) {
20733325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* simple memcpy path */
20743325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      memcpy_texture(ctx, dims,
20753325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
20763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstRowStride,
20773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     dstImageOffsets,
20783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
20793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcAddr, srcPacking);
20803325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
20813325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   else {
20823325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* general path */
20833325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
20843325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseInternalFormat,
20853325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseFormat,
20863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcWidth, srcHeight, srcDepth,
20873325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcFormat, srcType, srcAddr,
20883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcPacking);
20893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *src = tempImage;
20903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      GLint img, row, col;
20913325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      if (!tempImage)
20923325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         return GL_FALSE;
20933325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      for (img = 0; img < srcDepth; img++) {
20943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         GLubyte *dstRow = (GLubyte *) dstAddr
20953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstImageOffsets[dstZoffset + img] * texelBytes
20963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstYoffset * dstRowStride
20973325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstXoffset * texelBytes;
20983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         for (row = 0; row < srcHeight; row++) {
20993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            GLuint *dstUI = (GLuint *) dstRow;
21005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL1616 ||
21015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG1616) {
21023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2103db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2104db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2105db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2106db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2107db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616(a, l);
2108db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
21093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
21103325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
21113325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            else {
21123325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2113db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2114db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2115db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2116db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2117db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
2118db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
21193325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
21203325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
21213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            dstRow += dstRowStride;
21223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         }
21233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      }
212432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
21253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
21263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   return GL_TRUE;
21273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick}
21283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
21293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
21303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean
21315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_r16(TEXSTORE_PARAMS)
21325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{
21335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLboolean littleEndian = _mesa_little_endian();
21345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
21355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
21365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
21375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   ASSERT(dstFormat == MESA_FORMAT_R16);
21385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   ASSERT(texelBytes == 2);
21395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
21405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   if (!ctx->_ImageTransferState &&
21415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       !srcPacking->SwapBytes &&
21425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       dstFormat == MESA_FORMAT_R16 &&
21435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       baseInternalFormat == GL_RED &&
21445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcFormat == GL_RED &&
21455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcType == GL_UNSIGNED_SHORT &&
21465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       littleEndian) {
21475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* simple memcpy path */
21485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      memcpy_texture(ctx, dims,
21495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
21505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstRowStride,
21515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     dstImageOffsets,
21525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
21535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcAddr, srcPacking);
21545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
21555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   else {
21565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* general path */
21575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
21585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseInternalFormat,
21595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseFormat,
21605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcWidth, srcHeight, srcDepth,
21615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcFormat, srcType, srcAddr,
21625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcPacking);
21635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *src = tempImage;
21645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      GLint img, row, col;
21655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (!tempImage)
21665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         return GL_FALSE;
21675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      for (img = 0; img < srcDepth; img++) {
21685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         GLubyte *dstRow = (GLubyte *) dstAddr
21695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstImageOffsets[dstZoffset + img] * texelBytes
21705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstYoffset * dstRowStride
21715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstXoffset * texelBytes;
21725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         for (row = 0; row < srcHeight; row++) {
21735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            GLushort *dstUS = (GLushort *) dstRow;
21745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    for (col = 0; col < srcWidth; col++) {
21755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       GLushort r;
21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
21775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
21785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       dstUS[col] = r;
21795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       src += 1;
21805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    }
21815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            dstRow += dstRowStride;
21825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      }
21845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      free((void *) tempImage);
21855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
21865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   return GL_TRUE;
21875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick}
21885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
21895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
21905d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean
219117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
219217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{
219317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
219417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
219517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
219617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
219717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(texelBytes == 8);
219817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
219917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   if (!ctx->_ImageTransferState &&
220017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       !srcPacking->SwapBytes &&
220117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       baseInternalFormat == GL_RGBA &&
220217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcFormat == GL_RGBA &&
220317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcType == GL_UNSIGNED_SHORT) {
220417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* simple memcpy path */
220517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      memcpy_texture(ctx, dims,
220617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
220717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstRowStride,
220817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     dstImageOffsets,
220917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
221017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcAddr, srcPacking);
221117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
221217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   else {
221317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* general path */
221417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
221517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseInternalFormat,
221617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseFormat,
221717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcWidth, srcHeight, srcDepth,
221817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcFormat, srcType, srcAddr,
221917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcPacking);
222017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *src = tempImage;
222117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      GLint img, row, col;
222217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      if (!tempImage)
222317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         return GL_FALSE;
222417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      for (img = 0; img < srcDepth; img++) {
222517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
222617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
222717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstYoffset * dstRowStride
222817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstXoffset * texelBytes;
222917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         for (row = 0; row < srcHeight; row++) {
223017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
223117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            for (col = 0; col < srcWidth; col++) {
223217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               GLushort r, g, b, a;
223317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
223417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
223517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
223617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
223717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
223817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+0] = r;
223917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+1] = g;
224017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+2] = b;
224117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+3] = a;
224217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               src += 4;
224317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            }
224417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            dstRow += dstRowStride;
224517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         }
224617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      }
224717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      free((void *) tempImage);
224817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
224917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   return GL_TRUE;
225017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul}
225117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
225217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
225317e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean
2254279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2255279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{
2256279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2257279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2258279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2259279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R_16 ||
2260279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RG_16 ||
2261279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2262279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2263279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2264279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   if (!ctx->_ImageTransferState &&
2265279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       !srcPacking->SwapBytes &&
2266279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       baseInternalFormat == GL_RGBA &&
2267279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2268279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcFormat == GL_RGBA &&
2269279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcType == GL_SHORT) {
2270279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* simple memcpy path */
2271279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      memcpy_texture(ctx, dims,
2272279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2273279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstRowStride,
2274279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     dstImageOffsets,
2275279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2276279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcAddr, srcPacking);
2277279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2278279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   else {
2279279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* general path */
2280279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
2281279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseInternalFormat,
2282279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseFormat,
2283279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2284279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcFormat, srcType, srcAddr,
2285279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcPacking);
2286279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *src = tempImage;
2287279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2288279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      GLint img, row, col;
2289279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2290279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      if (!tempImage)
2291279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         return GL_FALSE;
2292279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2293279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2294279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       * 3 or 4 components/pixel here.
2295279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       */
2296279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      for (img = 0; img < srcDepth; img++) {
2297279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
2298279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2299279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstYoffset * dstRowStride
2300279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstXoffset * texelBytes;
2301279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         for (row = 0; row < srcHeight; row++) {
2302279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            GLshort *dstRowS = (GLshort *) dstRow;
2303279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            for (col = 0; col < srcWidth; col++) {
2304279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               GLuint c;
2305279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               for (c = 0; c < comps; c++) {
2306279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                  GLshort p;
2307279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                  UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2308279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                  dstRowS[col * comps + c] = p;
2309279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               }
2310279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            }
2311279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            dstRow += dstRowStride;
2312279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            src += 4 * srcWidth;
2313279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         }
2314279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      }
2315279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      free((void *) tempImage);
2316279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2317279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   return GL_TRUE;
2318279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul}
2319279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2320279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2321279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean
2322b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
23241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
23251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
232622108bb571808542b89677752d62d3901698265fBrian Paul
23271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
232822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
2333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
2334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
233517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
233660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2337b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2338b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
23448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
234622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
235622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
235822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]),
2362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                             CHAN_TO_UBYTE(src[GCOMP]),
2363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                             CHAN_TO_UBYTE(src[BCOMP]) );
2364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
2365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
236932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
237849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2379b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_a8(TEXSTORE_PARAMS)
2380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
23811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
23821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
238322108bb571808542b89677752d62d3901698265fBrian Paul
23841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
23851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
23865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_I8 ||
23875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_R8);
238822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
239517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
239660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2397b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2398b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
24023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
24033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
24043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
24053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
24063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
24073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
24083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
24093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
24101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
24113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
24123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
24133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
24143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
24153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
24163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
24173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
24183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
24193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
24203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
24213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
24223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
24233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
24243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
24253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
24263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
24273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
24283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
24293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
24328f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
243422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
244422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2445b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
244622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col] = CHAN_TO_UBYTE(src[col]);
2450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
245532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
246249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ci8(TEXSTORE_PARAMS)
2464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
24651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
246622108bb571808542b89677752d62d3901698265fBrian Paul
2467a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims; (void) baseInternalFormat;
24681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_CI8);
246922108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_COLOR_INDEX);
2471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_COLOR_INDEX &&
2475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
247717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
247860909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2479b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2480b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2483f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2487f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2488b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
248922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2490b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
249122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
249360909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
2494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
2495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow,
2496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking,
2497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    ctx->_ImageTransferState);
2498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
25071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
250949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2510b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2511f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2512184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
25131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
251422108bb571808542b89677752d62d3901698265fBrian Paul
2515a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
25171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
25181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
251922108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
252717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
252860909388ab136d849d99eab49e782a53772a618fBrian Paul                  dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2529b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstRowStride,
2530b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstImageOffsets,
2531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
25381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2542b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
254322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2544b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
254522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2547b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2548b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
255549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2556114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2557114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2558114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
25591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2560114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
25611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
256222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2563114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2564114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2565114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2566114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2567114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2568114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2569114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2570114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2571114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
2572114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2573114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstRowStride,
2574114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstImageOffsets,
2575114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2576114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2577114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2578114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2579114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2580114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2581114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2582114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2583114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2584114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2585114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2586114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2587114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2588114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2589114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2590114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2591114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2592114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2593114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2594114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2595114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2596114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2597114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2598114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
2599114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstAddr, dstXoffset, dstYoffset, dstZoffset,
2600114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstRowStride, dstImageOffsets,
2601114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2602114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2603114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2604114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2605114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2606114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
26078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
26088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2609114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2610114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2611114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
261232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2613114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2614114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2615114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2616114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2617114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2618114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2619114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2620114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2621114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2622114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2623114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2624114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2625114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2626114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2627114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2628114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2629114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2630114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2631114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
2632114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = (GLbyte *) dstAddr
2633114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            + dstYoffset * dstRowStride
263422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2635114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
263622108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2637114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
263822108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2639114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
264032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2641114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2642114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2643114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
264584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
264684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
264784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_R8 format.
264884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
264984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
265084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_r8(TEXSTORE_PARAMS)
265184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
265284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
265384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
265484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R8);
265684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 1);
265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
265884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   /* XXX look at adding optimized paths */
265984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
266084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
266184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
266284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
266384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
266484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcPacking);
266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
266884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
267384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
267484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
267584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
267684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
267784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            GLubyte *dstB = (GLubyte *) dstRow;
267884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
267984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul               dstB[col] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
268084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
268184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
268284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
268384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
268484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
268584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
268684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
268784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
268884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
268984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
269084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
269184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RG88 format.
269284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
269384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
269484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rg88(TEXSTORE_PARAMS)
269584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
269684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
269784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
269884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
269984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG88);
270084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 1);
270184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
270284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   /* XXX look at adding optimized paths */
270384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
270484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
270584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
270684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
270784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
270884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
270984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
271084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcPacking);
271184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
271284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
271384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
271484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
271584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
271684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
271784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
271884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
271984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
272084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
272184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
272284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
272384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul               dstUS[col] = PACK_COLOR_88(FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
272484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                          FLOAT_TO_BYTE_TEX(srcRow[GCOMP]));
272584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
272684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
272784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
272884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
272984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
273084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
273184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
273284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
273384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
273484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
273584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
273684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
273784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
273884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
273984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
274084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
274184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
274284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
274384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
274484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
274584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 4);
274684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
274784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
274884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
274984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
275084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
275184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
275284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
275384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
275484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcPacking);
275584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
275684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
275784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
275884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
275984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
276084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
276184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
276284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
276384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
276484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
276584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            GLuint *dstUI = (GLuint *) dstRow;
276684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
276784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul               dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
276884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                             FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
276984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                             FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
277084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                             0xff );
277184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul               srcRow += 4;
277284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
277384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
277484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
277584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
277684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
277784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
277884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
277984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
278084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
278184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
278284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2783c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
278439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
278539de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
2786c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
278749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2788c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
2789c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
2790c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
27911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
27921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2793c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
27941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
27951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
279622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
2797c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2798c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
2799c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       !srcPacking->SwapBytes &&
28001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
2801c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
2802c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
2803c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
2804c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
2805c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
2806c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2807c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstRowStride,
2808c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstImageOffsets,
2809c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2810c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
2811c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2812c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else if (!ctx->_ImageTransferState &&
2813bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       !srcPacking->SwapBytes &&
28141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
2815bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       baseInternalFormat == GL_RGBA &&
2816bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
2817bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
2818bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      /* simple memcpy path */
2819bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      memcpy_texture(ctx, dims,
2820bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2821bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstRowStride,
2822bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstImageOffsets,
2823bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2824bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcAddr, srcPacking);
2825bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   }
2826bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   else if (!ctx->_ImageTransferState &&
2827c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    (srcType == GL_BYTE) &&
2828c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    can_swizzle(baseInternalFormat) &&
2829c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    can_swizzle(srcFormat)) {
2830c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2831c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLubyte dstmap[4];
2832c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2833c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2834c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       */
28351f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) ||
28361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) {
2837c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[3] = 0;
2838c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[2] = 1;
2839c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[1] = 2;
2840c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[0] = 3;
2841c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
2842c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      else {
2843c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[3] = 3;
2844c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[2] = 2;
2845c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[1] = 1;
2846c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[0] = 0;
2847c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
2848c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2849c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2850c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcFormat,
2851c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcType,
2852c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				baseInternalFormat,
2853c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstmap, 4,
2854c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstAddr, dstXoffset, dstYoffset, dstZoffset,
2855c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstRowStride, dstImageOffsets,
2856c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2857c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcPacking);
2858c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2859c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
2860c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
2861c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
2862c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
286322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2864c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
2865c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
2866c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcPacking);
2867c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
2868c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
2869c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
2870c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
2871c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
2872c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         GLubyte *dstRow = (GLubyte *) dstAddr
287322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2874c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            + dstYoffset * dstRowStride
287522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2876c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
2877c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            GLuint *dstUI = (GLuint *) dstRow;
28781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
2879c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2880c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
2881c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
2882c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
2883c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
2884c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
2885c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
2886c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
2887bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
2888bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2889bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
2890bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
2891bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
2892bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
2893bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
2894bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
2895bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
2896c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
2897c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
2898c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
289932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2900c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2901c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
2902c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
2903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
290484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2905184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
2906184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
2907184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
290849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2909b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
2910184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
291192098438784887fd6005918794476cfbbeac5035Karl Schultz   const GLuint depthScale = 0xffffff;
2912c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
2913c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
2914c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      / sizeof(GLuint);
2915c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
291625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
29171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
2918c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
2919c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2920184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2921c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   if (srcFormat != GL_DEPTH_COMPONENT && ctx->Pixel.DepthScale == 1.0f &&
2922966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
2923184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
2924ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
2925184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
2926184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2927b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2928b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2929184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2930184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
293139de9251c4770fdcce3395643003aa626178446dBrian Paul   }
293239de9251c4770fdcce3395643003aa626178446dBrian Paul   else if (srcFormat == GL_DEPTH_COMPONENT) {
2933c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      /* In case we only upload depth we need to preserve the stencil */
2934ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
2935c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint *dstRow = (GLuint *) dstAddr
2936b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img]
2937b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
2938b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset;
2939ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         const GLuint *src
2940ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
2941c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcWidth, srcHeight,
2942c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcFormat, srcType,
2943c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  img, 0, 0);
2944ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
2945c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie            GLuint depth[MAX_WIDTH];
2946c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLubyte stencil[MAX_WIDTH];
2947ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
2948c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2949c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2950c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2951c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepstencil = GL_TRUE;
295239de9251c4770fdcce3395643003aa626178446dBrian Paul	    }
295339de9251c4770fdcce3395643003aa626178446dBrian Paul            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2954c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepdepth = GL_TRUE;
2955c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2956c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2957c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepdepth == GL_FALSE)
2958c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* the 24 depth bits will be in the low position: */
2959c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_depth_span(ctx, srcWidth,
2960c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       GL_UNSIGNED_INT, /* dst type */
2961c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       keepstencil ? depth : dstRow, /* dst addr */
2962c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       depthScale,
2963c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       srcType, src, srcPacking);
2964c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2965c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil == GL_FALSE)
2966c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* get the 8-bit stencil values */
2967c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_stencil_span(ctx, srcWidth,
2968c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 GL_UNSIGNED_BYTE, /* dst type */
2969c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 stencil, /* dst addr */
2970c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 srcType, src, srcPacking,
2971c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 ctx->_ImageTransferState);
2972c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2973c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    for (i = 0; i < srcWidth; i++) {
2974c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       if (keepstencil)
2975c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
2976c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       else
2977c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
2978c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2979ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
2980ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
2981b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
2982ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
2983ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
2984184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
2985184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
2986184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
2987184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2988184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2989a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
2990a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
2991a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
299249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2993a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
2994a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
2995a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
2996a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
2997a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
2998a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      / sizeof(GLuint);
2999a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
3000a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
30011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
300239de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
300339de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_DEPTH_COMPONENT ||
300439de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_STENCIL_INDEX);
300539de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
300639de9251c4770fdcce3395643003aa626178446dBrian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT);
3007c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
3008c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   for (img = 0; img < srcDepth; img++) {
3009c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      GLuint *dstRow = (GLuint *) dstAddr
3010c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstImageOffsets[dstZoffset + img]
3011c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstYoffset * dstRowStride / sizeof(GLuint)
3012c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 + dstXoffset;
3013c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      const GLuint *src
3014c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
3015c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcWidth, srcHeight,
3016c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcFormat, srcType,
3017c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						img, 0, 0);
3018c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      for (row = 0; row < srcHeight; row++) {
3019c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint depth[MAX_WIDTH];
3020c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLubyte stencil[MAX_WIDTH];
3021c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLint i;
3022c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
3023c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3024c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
3025c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepstencil = GL_TRUE;
302639de9251c4770fdcce3395643003aa626178446dBrian Paul	 }
302739de9251c4770fdcce3395643003aa626178446dBrian Paul         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
3028c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepdepth = GL_TRUE;
3029c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3030666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3031c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepdepth == GL_FALSE)
3032c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* the 24 depth bits will be in the low position: */
3033c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_depth_span(ctx, srcWidth,
3034c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    GL_UNSIGNED_INT, /* dst type */
3035c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    keepstencil ? depth : dstRow, /* dst addr */
3036c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    depthScale,
3037c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    srcType, src, srcPacking);
3038c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3039c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepstencil == GL_FALSE)
3040c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* get the 8-bit stencil values */
3041c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_stencil_span(ctx, srcWidth,
3042c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      GL_UNSIGNED_BYTE, /* dst type */
3043c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      stencil, /* dst addr */
3044c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      srcType, src, srcPacking,
3045c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      ctx->_ImageTransferState);
3046c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3047c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 /* merge stencil values into depth values */
3048c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 for (i = 0; i < srcWidth; i++) {
3049c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil)
3050c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
3051c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    else
3052c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
3053666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3054c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3055c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 src += srcRowStride;
3056c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 dstRow += dstRowStride / sizeof(GLuint);
3057a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
3058a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
3059a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
3060a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
3061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
306239de9251c4770fdcce3395643003aa626178446dBrian Paul
306339de9251c4770fdcce3395643003aa626178446dBrian Paul/**
306439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data.
306539de9251c4770fdcce3395643003aa626178446dBrian Paul */
306639de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean
306739de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS)
306839de9251c4770fdcce3395643003aa626178446dBrian Paul{
306939de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8);
307039de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_STENCIL_INDEX);
307139de9251c4770fdcce3395643003aa626178446dBrian Paul
307239de9251c4770fdcce3395643003aa626178446dBrian Paul   if (!ctx->_ImageTransferState &&
307339de9251c4770fdcce3395643003aa626178446dBrian Paul       !srcPacking->SwapBytes &&
307439de9251c4770fdcce3395643003aa626178446dBrian Paul       baseInternalFormat == srcFormat &&
307539de9251c4770fdcce3395643003aa626178446dBrian Paul       srcType == GL_UNSIGNED_BYTE) {
307639de9251c4770fdcce3395643003aa626178446dBrian Paul      /* simple memcpy path */
307739de9251c4770fdcce3395643003aa626178446dBrian Paul      memcpy_texture(ctx, dims,
307839de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
307939de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstRowStride,
308039de9251c4770fdcce3395643003aa626178446dBrian Paul                     dstImageOffsets,
308139de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
308239de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcAddr, srcPacking);
308339de9251c4770fdcce3395643003aa626178446dBrian Paul   }
308439de9251c4770fdcce3395643003aa626178446dBrian Paul   else {
308539de9251c4770fdcce3395643003aa626178446dBrian Paul      const GLint srcRowStride
308639de9251c4770fdcce3395643003aa626178446dBrian Paul	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
308739de9251c4770fdcce3395643003aa626178446dBrian Paul	 / sizeof(GLuint);
308839de9251c4770fdcce3395643003aa626178446dBrian Paul      GLint img, row;
308939de9251c4770fdcce3395643003aa626178446dBrian Paul
309039de9251c4770fdcce3395643003aa626178446dBrian Paul      for (img = 0; img < srcDepth; img++) {
309139de9251c4770fdcce3395643003aa626178446dBrian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
309239de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstImageOffsets[dstZoffset + img]
309339de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
309439de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstXoffset;
309539de9251c4770fdcce3395643003aa626178446dBrian Paul         const GLuint *src
309639de9251c4770fdcce3395643003aa626178446dBrian Paul            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
309739de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcWidth, srcHeight,
309839de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcFormat, srcType,
309939de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   img, 0, 0);
310039de9251c4770fdcce3395643003aa626178446dBrian Paul         for (row = 0; row < srcHeight; row++) {
310139de9251c4770fdcce3395643003aa626178446dBrian Paul            GLubyte stencil[MAX_WIDTH];
310239de9251c4770fdcce3395643003aa626178446dBrian Paul            GLint i;
310339de9251c4770fdcce3395643003aa626178446dBrian Paul
310439de9251c4770fdcce3395643003aa626178446dBrian Paul            /* get the 8-bit stencil values */
310539de9251c4770fdcce3395643003aa626178446dBrian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
310639de9251c4770fdcce3395643003aa626178446dBrian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
310739de9251c4770fdcce3395643003aa626178446dBrian Paul                                      stencil, /* dst addr */
310839de9251c4770fdcce3395643003aa626178446dBrian Paul                                      srcType, src, srcPacking,
310939de9251c4770fdcce3395643003aa626178446dBrian Paul                                      ctx->_ImageTransferState);
311039de9251c4770fdcce3395643003aa626178446dBrian Paul            /* merge stencil values into depth values */
311139de9251c4770fdcce3395643003aa626178446dBrian Paul            for (i = 0; i < srcWidth; i++)
311239de9251c4770fdcce3395643003aa626178446dBrian Paul               dstRow[i] = stencil[i];
311339de9251c4770fdcce3395643003aa626178446dBrian Paul
311439de9251c4770fdcce3395643003aa626178446dBrian Paul            src += srcRowStride;
311539de9251c4770fdcce3395643003aa626178446dBrian Paul            dstRow += dstRowStride / sizeof(GLubyte);
311639de9251c4770fdcce3395643003aa626178446dBrian Paul         }
311739de9251c4770fdcce3395643003aa626178446dBrian Paul      }
311839de9251c4770fdcce3395643003aa626178446dBrian Paul
311939de9251c4770fdcce3395643003aa626178446dBrian Paul   }
312039de9251c4770fdcce3395643003aa626178446dBrian Paul
312139de9251c4770fdcce3395643003aa626178446dBrian Paul   return GL_TRUE;
312239de9251c4770fdcce3395643003aa626178446dBrian Paul}
312339de9251c4770fdcce3395643003aa626178446dBrian Paul
312439de9251c4770fdcce3395643003aa626178446dBrian Paul
3125f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
3127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
3128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
3129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
3130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
3131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
3132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
3133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
313449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
3136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
31371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
31381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
313922108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
31411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
31421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
31431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
31441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
31451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
31461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32);
3147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_INTENSITY);
315322108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLfloat));
3154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3155f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
3158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
3159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
316017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
316160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3162b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
3163b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
3164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
317122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
3175b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
31769c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
3177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
31809c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3182b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
318322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3184b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
318522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3187c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dstRow, srcRow, bytesPerRow);
3188b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
3189b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
3190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
319332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3198c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
3202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
320349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3204b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
32061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
32071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
320822108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
32101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
32111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
32121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
32131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
32141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
32151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16);
3216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_INTENSITY);
322222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLhalfARB));
3223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
3227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
3228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
322917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
323060909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3231b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
3232b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
3233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3234f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
324022108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3241f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
3244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
3245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3246f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3247f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
3248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3249b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
325022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3251b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
325222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
3256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
3258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
3259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
3260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
3261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
326432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */
3271abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3272abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3273abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3274abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3275abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3276abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3277abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3278abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8);
3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3280abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3281abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3282abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3283abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3284abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3285abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLbyte));
3286abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3287abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3288abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3289abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3290abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_BYTE) {
3291abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3292abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3293abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3294abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3295abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3315abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3316abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3317abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLbyte *dstTexel = (GLbyte *) dstRow;
3318abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3319abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3320abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLbyte) src[i];
3321abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3322abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3323abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3324abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3325abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */
3334abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3336abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16);
3342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLshort));
3349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3351abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3352abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
33539fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul       srcType == GL_SHORT) {
3354abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3355abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3365abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLshort *dstTexel = (GLshort *) dstRow;
3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3385abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3386abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3387abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3388abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3389abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3390abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3391abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3392abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3393abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3394abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3395abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3396abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */
3397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3403abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3404abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32);
3405abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3406abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3408abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3410abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3411abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLint));
3412abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3413abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_INT) {
3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3418abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3419abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3420abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3421abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3422abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3425abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3426abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3427abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3428abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3429abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3431abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3432abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3435abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3439abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3440abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3441abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3442abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3443abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint *dstTexel = (GLint *) dstRow;
3444abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3445abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3446abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3452abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3453abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3454abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3455abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3456abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3457abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3458abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3459abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */
3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3462abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3463abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3466abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3467abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8);
3468abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3469abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3470abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3471abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3472abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3473abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLubyte));
3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3476abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3477abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3478abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3479abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_BYTE) {
3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3482abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3484abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3485abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3486abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3487abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3488abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3489abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3492abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3493abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3494abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3499abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3500abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3501abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3502abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3503abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3505abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLubyte *dstTexel = (GLubyte *) dstRow;
3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3509abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLubyte) src[i];
3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3513abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3514abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3515abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3516abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3517abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3518abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3519abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3520abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3521abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3522abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */
3523abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3524abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3525abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3530abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16);
3531abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3532abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3533abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3534abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3535abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3536abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3537abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLushort));
3538abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3539abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3540abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3541abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3542abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_SHORT) {
3543abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3544abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3545abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3546abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3547abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3548abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3549abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3550abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3551abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3552abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3553abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3556abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3558abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3559abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3561abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3562abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3563abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3564abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3565abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3566abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3567abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3568abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3569abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLushort *dstTexel = (GLushort *) dstRow;
3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLushort) src[i];
3573abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3574abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3576abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3577abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3578abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3579abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3580abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3581abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3583abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */
3586abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3587abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3588abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3589abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3590abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3591abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3592abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3593abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32);
3594abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLuint));
3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   if (!ctx->_ImageTransferState &&
3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       !srcPacking->SwapBytes &&
3604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_INT) {
3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstRowStride,
3610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     dstImageOffsets,
3611abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3612abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3613abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3614abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3615abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3616abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
3617abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3618abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3619abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3620abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3621abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcPacking);
3622abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3623abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3624abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3625abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3626abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3627abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
3628abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
3629abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3630abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3632abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLuint *dstTexel = (GLuint *) dstRow;
3633abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3634abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3635abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLuint) src[i];
3636abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3637abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3638abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3639abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3640abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3641abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3642abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3643abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3644abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3645abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3646abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3647abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3648abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3649abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
36508d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
365149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36528d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
36538d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
365546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
365646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
365846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
365946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
36601f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
366146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36620f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
366339de9251c4770fdcce3395643003aa626178446dBrian Paul                             newDstFormat, dstAddr,
366439de9251c4770fdcce3395643003aa626178446dBrian Paul                             dstXoffset, dstYoffset, dstZoffset,
366539de9251c4770fdcce3395643003aa626178446dBrian Paul                             dstRowStride, dstImageOffsets,
366639de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcWidth, srcHeight, srcDepth,
366739de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcFormat, srcType,
366839de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcAddr, srcPacking);
366946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36708d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36718d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
367254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
367349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36748d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
36758d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
367746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
367846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
368046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
368146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
36821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
368346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
368446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               newDstFormat, dstAddr,
368546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstXoffset, dstYoffset, dstZoffset,
368646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstRowStride, dstImageOffsets,
368746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
368846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
368946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
369046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36928d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
369354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
369449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36955bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
36965bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
36971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
36985bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
36995bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
37001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
37015bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
37025bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
37031f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
37045bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
37055bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
37065bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               newDstFormat, dstAddr,
37075bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstXoffset, dstYoffset, dstZoffset,
37085bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstRowStride, dstImageOffsets,
37095bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
37105bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
37115bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
37125bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
37135bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
37145bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
37155bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
371649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
37178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
37188d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
37191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
372046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
372146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
37221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
372346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
37241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
372546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
372654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
372754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   k = _mesa_texstore_a8(ctx, dims, baseInternalFormat,
372854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         newDstFormat, dstAddr,
372954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstXoffset, dstYoffset, dstZoffset,
373054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstRowStride, dstImageOffsets,
373154e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcWidth, srcHeight, srcDepth,
373254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcFormat, srcType,
373354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcAddr, srcPacking);
373446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
37358d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
37368d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
373754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
373849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
37398d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
37408d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
37411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
374246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
374346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
37441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
374546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
374646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
37471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
374846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
37495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
37505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      newDstFormat, dstAddr,
37515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      dstXoffset, dstYoffset, dstZoffset,
37525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      dstRowStride, dstImageOffsets,
37535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcWidth, srcHeight, srcDepth,
37545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcFormat, srcType,
37555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcAddr, srcPacking);
375646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
37578d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
37588d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
37599927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
37609927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
37619927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
37629927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
37639927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
37649927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
37659927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
37669927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
37679927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
37688d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
37698d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
3770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3771485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3772485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3773485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
377439de9251c4770fdcce3395643003aa626178446dBrian Paul * Table mapping MESA_FORMAT_* to _mesa_texstore_*()
3775485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary.
3776485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
3777b1616b2a811b9a161d1ee2a8251e0efe32a8c192Ian Romanickstatic const struct {
3778485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   gl_format Name;
3779485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   StoreTexImageFunc Store;
3780485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
3781485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] =
3782485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
3783bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_NONE, NULL },
3784485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 },
3785485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 },
3786485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 },
3787485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 },
378874d61d03b54d72217d463c248468cdcd09320efcBrian Paul   { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 },
37892d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer   { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 },
3790485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 },
3791485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 },
3792485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 },
3793485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 },
3794485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 },
3795485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 },
3796485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 },
3797485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 },
3798485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 },
37995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL88, _mesa_texstore_unorm88 },
38005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 },
38015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 },
38025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 },
3803485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 },
3804485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_A8, _mesa_texstore_a8 },
3805485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_L8, _mesa_texstore_a8 },
3806485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_I8, _mesa_texstore_a8 },
3807485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_CI8, _mesa_texstore_ci8 },
3808485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr },
3809485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr },
38105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_R8, _mesa_texstore_a8 },
38115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG88, _mesa_texstore_unorm88 },
38125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 },
38135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_R16, _mesa_texstore_r16 },
38145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 },
38155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 },
3816485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 },
3817485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 },
3818485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z16, _mesa_texstore_z16 },
3819e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 },
3820c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 },
3821485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z32, _mesa_texstore_z32 },
3822c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   { MESA_FORMAT_S8, _mesa_texstore_s8 },
3823bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 },
3824bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 },
3825bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 },
3826bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SL8, _mesa_texstore_sl8 },
3827bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SLA8, _mesa_texstore_sla8 },
3828bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 },
3829bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 },
3830bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 },
3831bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 },
3832bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 },
3833bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 },
3834bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 },
3835bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 },
3836bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 },
3837bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 },
3838bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 },
3839bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 },
3840bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 },
3841bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 },
3842bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
3843bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
3844bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 },
3845bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 },
3846bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
3847bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
3848bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
3849bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 },
3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 },
3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 },
3856abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 },
3857abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3858bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
385984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
386084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   { MESA_FORMAT_SIGNED_R8, _mesa_texstore_signed_r8 },
386184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   { MESA_FORMAT_SIGNED_RG88, _mesa_texstore_signed_rg88 },
386284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 },
386384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3864bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
3865bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
386684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3867279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   { MESA_FORMAT_SIGNED_R_16, _mesa_texstore_signed_rgba_16 },
3868279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   { MESA_FORMAT_SIGNED_RG_16, _mesa_texstore_signed_rgba_16 },
3869279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 },
387017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 },
387117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 }
3872485105ed182e2e997b084f047e72d5a2c3460057Brian Paul};
3873485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3874485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3875920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
3876920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
3877920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
3878920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
3879920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
3880920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
3881920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstAddr;
3882920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
3883920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstRowStride; (void) dstImageOffsets;
3884920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
3885920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
3886920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
3887920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
3888920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3889920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
3890920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
3891920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
3892920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
3893920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3894920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3895485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
3896485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
3897485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
3898e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
3899485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
3900485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
3901bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG
39021f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul   GLuint i;
3903485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
3904bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul      ASSERT(texstore_funcs[i].Name == i);
3905485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
3906bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif
3907bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   ASSERT(texstore_funcs[format].Name == format);
3908920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3909920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   if (texstore_funcs[format].Store)
3910920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return texstore_funcs[format].Store;
3911920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   else
3912920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return _mesa_texstore_null;
3913485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
3914485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3915485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3916660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
3917660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
3918660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
3919660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
3920660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
3921660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
3922660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
3923660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
3924660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
3925660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
39261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
3927660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
3928660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
3929660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3930660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstRowStride, dstImageOffsets,
3931660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
3932660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
3933660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
3934660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
3935660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
3936485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
39377a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
3938c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a texture image.
3939c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory.
3940c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded.
394171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too!
39427a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */
394371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid *
3944f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions,
394571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    GLsizei width, GLsizei height, GLsizei depth,
394671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    GLenum format, GLenum type, const GLvoid *pixels,
394771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    const struct gl_pixelstore_attrib *unpack,
394871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    const char *funcName)
39497a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{
3950c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   GLubyte *buf;
3951c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3952434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (!_mesa_is_bufferobj(unpack->BufferObj)) {
39537a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      /* no PBO */
39547a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return pixels;
39557a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
395660909388ab136d849d99eab49e782a53772a618fBrian Paul   if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth,
395760909388ab136d849d99eab49e782a53772a618fBrian Paul                                  format, type, pixels)) {
3958c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access");
3959c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
39607a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
3961c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3962a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
3963a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul                                          GL_READ_ONLY_ARB, unpack->BufferObj);
3964c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if (!buf) {
3965c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped");
3966c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
3967c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
3968c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3969c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   return ADD_POINTERS(buf, pixels);
39707a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul}
39717a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
39727a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
39737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
3974c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a compressed texture
3975c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * image.
3976c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory.
3977c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded.
397871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too!
39797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */
398071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid *
3981f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx,
3982c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 GLsizei imageSize, const GLvoid *pixels,
3983c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 const struct gl_pixelstore_attrib *packing,
3984c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 const char *funcName)
39857a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{
3986c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   GLubyte *buf;
3987c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3988434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (!_mesa_is_bufferobj(packing->BufferObj)) {
39897a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      /* not using a PBO - return pointer unchanged */
39907a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return pixels;
39917a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
3992c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if ((const GLubyte *) pixels + imageSize >
3993f285f0d8f60adafdfba5c1f0563b81c68bd398d3Brian Paul       ((const GLubyte *) 0) + packing->BufferObj->Size) {
3994c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      /* out of bounds read! */
3995c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access");
3996c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
3997c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
3998c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3999a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
4000a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul                                         GL_READ_ONLY_ARB, packing->BufferObj);
4001c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if (!buf) {
4002c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped");
4003c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
40047a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
4005c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
4006c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   return ADD_POINTERS(buf, pixels);
40077a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul}
40087a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
40097a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
4010c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul/**
4011c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * This function must be called after either of the validate_pbo_*_teximage()
4012c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * functions.  It unmaps the PBO buffer if it was mapped earlier.
4013c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul */
401471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellvoid
4015f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_unmap_teximage_pbo(struct gl_context *ctx,
4016c039af165d5919008c6df599795951f85dea164dBrian Paul                         const struct gl_pixelstore_attrib *unpack)
4017c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul{
4018434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (_mesa_is_bufferobj(unpack->BufferObj)) {
4019c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
4020c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                              unpack->BufferObj);
4021c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
4022c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul}
4023c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
402489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4025b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return texture size in bytes */
4026b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint
4027b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_size(const struct gl_texture_image *texImage)
4028da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul{
402932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width,
403032aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul                                       texImage->Height, texImage->Depth);
4031b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   return sz;
4032da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul}
4033da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul
4034da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul
4035b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return row stride in bytes */
4036b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint
4037b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_row_stride(const struct gl_texture_image *texImage)
40385999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
403982bcc1c5d27b825db7f002c3c183bd1dc7833438Brian Paul   GLuint stride = _mesa_format_row_stride(texImage->TexFormat,
4040b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                           texImage->Width);
4041b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   return stride;
40425999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
40435999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
40445999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
40455999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4046ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
404789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage1D()
4048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * and Driver.CopyTexImage1D().
40496b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
40508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
40518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4052f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
40538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
40548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint border,
40558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const GLvoid *pixels,
40568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
40578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
40588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
40598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
406032aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
4061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
40628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
40638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
4064b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
40654cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
40667d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
40677d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
40687d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
40697d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
40708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4071e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4072e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage1D");
40736b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
40746b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
40756b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
40766b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
407789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
40786b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
40796b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
4080b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLint dstRowStride = 0;
4081b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
4082b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4083b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4084b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
4085b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4086b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4087b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, 1, 1,
4088b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4089f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4090f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
4091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4092f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
4093f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
409471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
40958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
40968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
40978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
40986b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
409989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage2D()
410089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage2D().
41016b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul *
4102b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather
4103b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM.  Device driver's can easily plug in their own replacement.
41048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
41058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4106f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
41078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
41088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint border,
41098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
41108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
41118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
41128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
41138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
411432aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
4115a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
41168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
41178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
4118b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
41194cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
41207d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
41217d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
41227d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
41237d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
41248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
412571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage2D");
41276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
41286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
41296b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
41306b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
413189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
41326b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
41336b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
4134b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
4135b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
4136b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4137b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4138b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
4139b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4140b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4141b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, 1,
4142b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
4145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
4147f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
414871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
41498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
41508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
41518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
41528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
41536b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
415489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage3D()
415589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage3D().
41566b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
41578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
41588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4159f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
41608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
41618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint depth, GLint border,
41628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
41638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
41648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
41658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
41668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
416732aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
4168a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
41698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
41708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
4171b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
41724cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
41737d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
41747d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
41757d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
41767d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
41778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
4179e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing, "glTexImage3D");
41806b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
41816b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
41826b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
41836b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
418489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
41856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
41866b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
4187b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
4188b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
4189b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4190b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4191b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
4192b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4193b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4194b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, depth,
4195b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
4198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
4200f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
420171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
42028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
420889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D()
420989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D().
42108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4212f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level,
42138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint width,
42148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
42158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
42168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
42178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
42188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4219b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4220e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage1D");
42227a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
42237a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
42247a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
4225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
4226b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLint dstRowStride = 0;
4227b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
4228b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4229b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4230b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, 0, 0,  /* offsets */
4231b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4232b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4233b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, 1, 1,
4234b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
4237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
42393893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
424071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
42418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
424489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
424689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D()
424789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D().
42488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4250f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level,
42518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset,
42528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height,
42538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
42548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
42558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
42568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
42578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4258b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
425971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage2D");
42617a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
42627a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
42637a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
4264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
4265b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
4266b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
4267b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4268b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4269b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, yoffset, 0,
4270b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4271b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4272b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, 1,
4273b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
4276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
42783893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
427971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
42808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
42818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
42838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
42848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D().
428589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D().
42868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
42878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4288f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level,
42898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset, GLint zoffset,
42908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height, GLint depth,
42918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
42928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
42938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
42948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
42958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4296b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4297e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
4298e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing,
4299e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        "glTexSubImage3D");
4300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!pixels)
4301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return;
4302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
4304b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
4305b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
4306b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
4307b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
4308b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, yoffset, zoffset,
4309b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
4310b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
4311b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, depth,
4312b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
4313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
4314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
4315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
4316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
43178f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
431871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
43198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43222aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/*
43238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D()
43248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4326f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
43278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
43288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint border,
43298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
43308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
43318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
43328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
433389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
4334a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4335a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4336a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
4337a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) border;
4338a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4339a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
4340a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
43418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4345b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
43468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D()
43478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4349f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
43508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
43518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint border,
43528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
43538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
43548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
43558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4356a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) border;
4357a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul
435889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* This is pretty simple, basically just do a memcpy without worrying
435989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul    * about the usual image unpacking or image transfer operations.
43608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
436189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texObj);
436289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
436389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
436489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
436589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
436689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
436789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
436889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* allocate storage */
43694cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(imageSize);
437089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (!texImage->Data) {
437189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
437289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
437389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
437489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
4377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexImage2D");
43787a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
43797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
43807a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
438189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* copy the data */
4382e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(texImage->Data, data, imageSize);
43838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
438471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
43858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
43868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
43898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
43908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D()
43918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4393f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
43948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
43958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint depth,
43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint border,
43978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
43988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
43998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
44008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
440189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
4402a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4403a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4404a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
4405a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
4406a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
4407a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4408a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
4409a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
44108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
44118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
441489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
441589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D()
4416e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
4417e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
4418f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target,
441989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
442089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLsizei width,
442189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
442289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
442389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
442489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
4425e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{
44265999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 1D texture formats yet */
4427a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4428a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4429a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) width;
4430a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
4431a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4432a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
4433a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
4434e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul}
4435e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
4436e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
443789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
443889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D()
443989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
444089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
4441f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target,
444289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
444389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLint yoffset,
444489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei width, GLsizei height,
444589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
444689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
444789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
444889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
445089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint bytesPerRow, destRowStride, srcRowStride;
445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
445289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLubyte *dest;
445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
44541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
4455bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   const GLint destWidth = texImage->Width;
4456d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
44575999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4458d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
44595999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4460d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   (void) level;
4461a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
446289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
446389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* these should have been caught sooner */
4464d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((width % bw) == 0 || width == 2 || width == 1);
4465d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((height % bh) == 0 || height == 2 || height == 1);
4466d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((xoffset % bw) == 0);
4467d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((yoffset % bh) == 0);
446889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
4472e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
44737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
44747a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
44757a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
44762594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
447789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
447889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
44792594168e9f3cdc4ac53c925486491167837cda30Brian Paul   destRowStride = _mesa_format_row_stride(texFormat, destWidth);
448089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
4481bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul                                         texFormat, destWidth,
4482a5467697336f201abee19cba1521be80e5c87d3bBrian Paul                                         (GLubyte *) texImage->Data);
448389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4484bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   bytesPerRow = srcRowStride;  /* bytes per row of blocks */
4485d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   rows = height / bh;  /* rows in blocks */
448689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4487bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   /* copy rows of blocks */
448889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   for (i = 0; i < rows; i++) {
4489e197de56cdb86835f1437688a9161cd909792d80Brian Paul      memcpy(dest, src, bytesPerRow);
449089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      dest += destRowStride;
449189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      src += srcRowStride;
449289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
44938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
449471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
449589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
449689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
449789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
449889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
449989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D()
450089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
4502f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target,
450389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint level,
450489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint xoffset, GLint yoffset, GLint zoffset,
450589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei width, GLsizei height, GLsizei depth,
450689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLenum format,
450789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei imageSize, const GLvoid *data,
450889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_object *texObj,
450989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_image *texImage)
451089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
45115999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 3D texture formats yet */
4512a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4513a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4514a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) yoffset; (void) zoffset;
4515a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
4516a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
4517a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
4518a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
4519a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
452089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
4521