texstore.c revision 079bb3fff7104782f2c921200e9a299c38a53ab6
18e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
28e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Mesa 3-D graphics library
3a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Version:  7.5
48e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
5501338d70e96e0388fd5198625d856c4ec07745fBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Copyright (c) 2008-2009  VMware, Inc.
78e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
88e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
98e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * copy of this software and associated documentation files (the "Software"),
108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * to deal in the Software without restriction, including without limitation
118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Software is furnished to do so, subject to the following conditions:
148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * The above copyright notice and this permission notice shall be included
168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * in all copies or substantial portions of the Software.
178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Authors:
288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *   Brian Paul
298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
31248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
3289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * The GL texture image functions in teximage.c basically just do
3389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * error checking and data structure allocation.  They in turn call
3489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * device driver functions which actually copy/convert/store the user's
3589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture image data.
3689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
3789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * However, most device drivers will be able to use the fallback functions
3889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * in this file.  That is, most drivers will have the following bit of
3989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * code:
4089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
4189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   etc...
4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated.  We have to do:
4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    Format/type conversions
4789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    pixel unpacking
48a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt *    pixel transfer (scale, bais, lookup, etc)
4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full
5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images.
5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
553c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h"
567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
57e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h"
588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h"
598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h"
6024edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h"
61db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
620117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
64b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h"
653c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
6689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
67da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h"
688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h"
69da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h"
70d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu#include "texcompress_etc.h"
718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h"
728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
732e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h"
741271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
75631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
77248200737398a7d6403a23930a6c9d93db06b942Brian Paul
78fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
81fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
8271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
83248200737398a7d6403a23930a6c9d93db06b942Brian Paul
84248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
85e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
90e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
91248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
92248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
93248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
94248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
95248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
10371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
1043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
1105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG:
11171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
11671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
1325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   IDX_RG,
133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1422e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
176fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
178fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   {
2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      IDX_RG,
2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP4(0, 1, ZERO, ONE),
2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP2(0, 1)
2245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   },
225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
229248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
230248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
231248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
232248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
233248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
241fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
2485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG: return IDX_RG;
249fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
260fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
262fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
268248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
269248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
270248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
271248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2732e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2806b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0
281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[0],
285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[1],
286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[2],
287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[3],
288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[4],
289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[5]);
2906b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif
291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
29939de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
317e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat *
318e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum logicalBaseFormat,
320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum textureBaseFormat,
321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum srcFormat, GLenum srcType,
323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const GLvoid *srcAddr,
324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const struct gl_pixelstore_attrib *srcPacking,
325e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLbitfield transferOps)
326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
328a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint components = _mesa_components_in_format(logicalBaseFormat);
329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint srcStride =
330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLfloat *dst;
332a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLint img, row;
333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
3385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
3395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
3485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
3495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
356a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				  * components * sizeof(GLfloat));
358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   if (!tempImage)
359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      return NULL;
360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   dst = tempImage;
362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   for (img = 0; img < srcDepth; img++) {
363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      const GLubyte *src
364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcWidth, srcHeight,
366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcFormat, srcType,
367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 img, 0, 0);
368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      for (row = 0; row < srcHeight; row++) {
369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       dst, srcFormat, srcType, src,
371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       srcPacking, transferOps);
372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 dst += srcWidth * components;
373a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 src += srcStride;
374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
3833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
38513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
38713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
39432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
39732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
41732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values.  Used for unsigned
427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures.
428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */
429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint *
430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims,
431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum logicalBaseFormat,
432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum textureBaseFormat,
433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum srcFormat, GLenum srcType,
435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const GLvoid *srcAddr,
436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const struct gl_pixelstore_attrib *srcPacking)
437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{
438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *tempImage;
439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint srcStride =
441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *dst;
443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLint img, row;
444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(dims >= 1 && dims <= 3);
446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RGB ||
449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RG ||
450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RED ||
451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_INTENSITY ||
454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_ALPHA);
455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RGB ||
458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RG ||
459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RED ||
460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE ||
46238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          textureBaseFormat == GL_INTENSITY ||
463dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_ALPHA);
464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                 * components * sizeof(GLuint));
467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (!tempImage)
468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      return NULL;
469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   dst = tempImage;
471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   for (img = 0; img < srcDepth; img++) {
472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLubyte *src
473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcWidth, srcHeight,
475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcFormat, srcType,
476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 img, 0, 0);
477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (row = 0; row < srcHeight; row++) {
478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      dst, srcFormat, srcType, src,
480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      srcPacking);
481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 dst += srcWidth * components;
482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 src += srcStride;
483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* more work */
488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLuint *newImage;
491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint i, n;
492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLubyte map[6];
493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* The actual texture format should have at least as many components
499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       * as the logical texture format.
500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       */
501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(texComponents >= logComponents);
502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                   * texComponents * sizeof(GLuint));
505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      if (!newImage) {
506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         free(tempImage);
507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         return NULL;
508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      n = srcWidth * srcHeight * srcDepth;
513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (i = 0; i < n; i++) {
514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         GLint k;
515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         for (k = 0; k < texComponents; k++) {
516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            GLint j = map[k];
517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            if (j == ZERO)
518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = 0.0F;
519dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else if (j == ONE)
520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = 1.0F;
521dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else
522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         }
524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      free(tempImage);
527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      tempImage = newImage;
528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   return tempImage;
531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul}
532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
534dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
535dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/**
536663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components.
537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
54039de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
556663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte.
557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
558663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte *
559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum logicalBaseFormat,
561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum textureBaseFormat,
562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLint srcWidth, GLint srcHeight, GLint srcDepth,
563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum srcFormat, GLenum srcType,
564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const GLvoid *srcAddr,
565663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const struct gl_pixelstore_attrib *srcPacking)
566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   GLubyte *tempImage, *dst;
571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
5765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
5775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
5855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
5865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
593663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                       * components * sizeof(GLubyte));
59596128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
59796128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
6068c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
6078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
609e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
610e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       srcFormat, srcType, src, srcPacking,
611e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       transferOps);
612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
621663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      GLubyte *newImage;
622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
6233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
634663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
635663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                         * texComponents * sizeof(GLubyte));
636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
63732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
6413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
651663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               newImage[i * texComponents + k] = 255;
652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
65732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
665c039af165d5919008c6df599795951f85dea164dBrian Paul/**
666c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
671248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
672248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
673248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
674c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
675c039af165d5919008c6df599795951f85dea164dBrian Paul */
676c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
677c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
678c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
67971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
701248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
70971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
76271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
7643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
7803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
782501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
785501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
78671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
78846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
789501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
790bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
79246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
79339de9251c4770fdcce3395643003aa626178446dBrian Paul
79439de9251c4770fdcce3395643003aa626178446dBrian Paul/**
79539de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
79639de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness.
797bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
799bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
80046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
802c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
80346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
80446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
805bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
806df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
807bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
808df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
81439de9251c4770fdcce3395643003aa626178446dBrian Paul
81539de9251c4770fdcce3395643003aa626178446dBrian Paul/**
81639de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
81739de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state.
81846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
81946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
820bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
82246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
823bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
824bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
825bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
827c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
840c039af165d5919008c6df599795951f85dea164dBrian Paul/**
841c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
842c039af165d5919008c6df599795951f85dea164dBrian Paul */
84371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
844f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx,
84571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
84671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
84746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
84846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
8490c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
85146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
8520c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
8565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                          GLubyte **dstSlices,
85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
86271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
863bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
8643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
86571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
866c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
867c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
868c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
869c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
870c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
871c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
872c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
873c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
874c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
875c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
87671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
878edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
8820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
8843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
886bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
88746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
88971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
890bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
89171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
892298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
8932e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
895b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
8969c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
8995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLubyte *dstImage = dstSlices[0]
900b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstXoffset * dstComponents;
90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
903b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
90771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
90871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
9095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
910b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
911b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset * dstComponents;
91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         srcImage += srcImageStride;
91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
91971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
92071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
92171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
92271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do.
925f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed.
926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported.
927f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
928f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void
929f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx,
93017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
9311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
933b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
9345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul               GLubyte **dstSlices,
935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
94460909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
94560909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
9461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
94722108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
948b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
9505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul       dstRowStride == bytesPerRow) {
9515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy image by image */
9525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLint img;
9535253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      for (img = 0; img < srcDepth; img++) {
9545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstImage = dstSlices[dstZoffset + img]
9555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul            + dstYoffset * dstRowStride
9565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul            + dstXoffset * texelBytes;
9575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         ctx->Driver.TextureMemCpy(dstImage, srcImage,
9585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                   bytesPerRow * srcHeight);
9595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         srcImage += srcImageStride;
9605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      }
961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
9625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   else {
9635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy row by row */
964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
9675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
9685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul            + dstYoffset * dstRowStride
9695253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul            + dstXoffset * texelBytes;
970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
97117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
982f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
983bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image.
984f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
98549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
986b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
98825cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
9891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
990755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   GLenum dstType;
991a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
992bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32 ||
993bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák          dstFormat == MESA_FORMAT_Z32_FLOAT);
99422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLuint));
995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
996755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   if (dstFormat == MESA_FORMAT_Z32)
997755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_UNSIGNED_INT;
998755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   else
999755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_FLOAT;
1000755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt
1001966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1002966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1004a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1005a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1006bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák       srcType == dstType) {
1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
100817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
10095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
10105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
10185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
102022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
102260909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10241ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1025bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák                                    dstType, dstRow,
1026a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1036e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
1038e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
1039e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1041e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
1042e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint texelBytes = 4;
1043e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1044a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1045e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1047e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
10515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1052b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstXoffset * texelBytes;
1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
105560909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10571ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1058a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1059a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1067e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1069c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
1070c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
1071c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
1072c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1073c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
1074c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
1075c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint texelBytes = 4;
1076c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1077c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   (void) dims;
1078c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
1079c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1080c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   {
1081c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      /* general path */
1082c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      GLint img, row;
1083c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      for (img = 0; img < srcDepth; img++) {
10845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1085c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstYoffset * dstRowStride
1086c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstXoffset * texelBytes;
1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1106a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1107f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
110849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1109b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
111125cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
11121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1113a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
11141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
111522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLushort));
1116f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1117966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1118966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1119f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1122a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
112417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
11255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
11265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
11321ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
11345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
113622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1137f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
113860909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
11411ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1142a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1153defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
115549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1156b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
11581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
11591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
116022108bb571808542b89677752d62d3901698265fBrian Paul
11611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
11621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
116322108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
11671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGB565 &&
1168a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1169a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1170a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT_5_6_5) {
1171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
117217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
11735253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
11745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1176f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1178a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1179a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1180a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1181a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1182a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1183a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1184a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
11858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
11868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1187a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
118860909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
11905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLubyte *dst = dstSlices[0]
1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                   + dstYoffset * dstRowStride
119222108bb571808542b89677752d62d3901698265fBrian Paul                   + dstXoffset * texelBytes;
1193a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1194a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1196a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1197defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
11981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1199f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1200f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1201f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1202f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1203f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1204f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1205f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1206f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1207f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1208f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1209defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1210a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1213a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1216663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
121822108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1219a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1220a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1221a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1222663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1224a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1225a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
12275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1228b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
122922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1231a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dstUS = (GLushort *) dstRow;
1232defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            /* check for byteswapped format */
12331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGB565) {
1234f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1235663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_565( src[RCOMP],
1236663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                               src[GCOMP],
1237663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                               src[BCOMP] );
1238f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1239f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1240f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1241f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1242f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1243663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_565_REV( src[RCOMP],
1244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                   src[GCOMP],
1245663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                   src[BCOMP] );
1246f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1247f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
125232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1258248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1259248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1260248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
126149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1264184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
12651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
12661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
126771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
12681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
1269d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBA8888_REV ||
1270d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888 ||
1271d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888_REV);
127222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1276d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      (dstFormat == MESA_FORMAT_RGBA8888 ||
1277d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu       dstFormat == MESA_FORMAT_RGBX8888) &&
1278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1279defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
12802e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
12812e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
12822e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
12832e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       /* simple memcpy path */
12842e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      memcpy_texture(ctx, dims,
12855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
12865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
12872e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
12882e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcAddr, srcPacking);
12892e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   }
12902e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   else if (!ctx->_ImageTransferState &&
12912e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       !srcPacking->SwapBytes &&
1292d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      (dstFormat == MESA_FORMAT_RGBA8888_REV ||
1293d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu       dstFormat == MESA_FORMAT_RGBX8888_REV) &&
12942e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
12952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
12962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
12972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
12982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
1299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
130017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
13015253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
13025253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
130671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
130746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
130846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
130946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1310528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
131171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
131246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
131371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
131471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1315528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
131671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
1317d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 ||
1318d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu                            dstFormat == MESA_FORMAT_RGBX8888)) ||
1319d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	  (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV ||
1320d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	                     dstFormat == MESA_FORMAT_RGBX8888_REV))) {
132146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
132246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
132346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
132446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
132546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
132646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
132746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
132946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
133046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
133146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
133371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
133471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
133546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1336528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
133771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
13385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
13395253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
134171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
134271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1345663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
134722108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1351663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
13565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
135822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint *dstUI = (GLuint *) dstRow;
1361d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu            if (dstFormat == MESA_FORMAT_RGBA8888 ||
1362d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu                dstFormat == MESA_FORMAT_RGBX8888) {
1363f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1364663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888( src[RCOMP],
1365663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1366663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP],
1367663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[ACOMP] );
1368f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1369f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1371f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1372f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1373663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( src[RCOMP],
1374663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1375663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP],
1376663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[ACOMP] );
1377f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1378f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1379a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1380a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1381a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1382a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
138332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1384a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1385a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1386a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1387a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1388a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
138949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1390b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1392184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
13931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1394f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul   const GLenum baseFormat = GL_RGBA;
1395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
13961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
139774d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
13982d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888 ||
13992d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888_REV );
140022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
140474d61d03b54d72217d463c248468cdcd09320efcBrian Paul       (dstFormat == MESA_FORMAT_ARGB8888 ||
140574d61d03b54d72217d463c248468cdcd09320efcBrian Paul        dstFormat == MESA_FORMAT_XRGB8888) &&
1406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
1409defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
1410defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (little endian) */
141117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
14125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
14135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1417defb035b6cf03c555318d9dd48864242ed036f39Brian Paul   else if (!ctx->_ImageTransferState &&
1418a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
14192d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer       (dstFormat == MESA_FORMAT_ARGB8888_REV ||
14202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer        dstFormat == MESA_FORMAT_XRGB8888_REV) &&
1421a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1422a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_BGRA &&
1423a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
1424defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
1425defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
142617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
14275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
14285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1429a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1430a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1431a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
143271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
143371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
143474d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
143574d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
143671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
14370c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
14380c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
143971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
144071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
14428c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14438c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
144471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
14465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1447b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
144822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
144971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1450259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
145171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
145224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
145324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
145424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
145524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
145671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
145771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
145871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
145971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
146171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
146271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
146371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
14641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
14660c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
146724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1468259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1470ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1471ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1472ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1473ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1474ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1475ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1476ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
14778c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14788c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1479ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1480ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
14815253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1482b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
148322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1484ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1485259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1486ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
148724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
148824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
148924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
149024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
149171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
149271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
149371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
149471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
149571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
149671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
149771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
149846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
149946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
150046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
15010c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
150271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
150371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
150471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
150571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
15060c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
150771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
15081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
150974d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
15102d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
15112d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
151246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
151346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
151446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
151546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
151646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
151746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
15181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
151974d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
15202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
152174d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
152246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
152346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
152446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
152546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
152646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
152771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
152871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
152971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
153046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
15310c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
153271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
15335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			        dstXoffset, dstYoffset, dstZoffset,
1534b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
15355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                dstSlices,
153671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
153771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
153871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1541663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1542a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
154322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1545a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1546a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1547663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1548a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1549a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1550a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1551a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
15525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1553b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
155422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLuint *dstUI = (GLuint *) dstRow;
15571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB8888) {
1558f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888( src[ACOMP],
1560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
1563f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1564f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
156674d61d03b54d72217d463c248468cdcd09320efcBrian Paul            else if (dstFormat == MESA_FORMAT_XRGB8888) {
156774d61d03b54d72217d463c248468cdcd09320efcBrian Paul               for (col = 0; col < srcWidth; col++) {
156874d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  dstUI[col] = PACK_COLOR_8888( 0xff,
1569663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1571663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
157274d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  src += 4;
157374d61d03b54d72217d463c248468cdcd09320efcBrian Paul               }
157474d61d03b54d72217d463c248468cdcd09320efcBrian Paul            }
1575f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1576f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1577663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( src[ACOMP],
1578663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
1579663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1580663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
1581f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1583defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            }
1584a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1585a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1586a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
158732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1588a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1589a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1590a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1591a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
159349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1594b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1596184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
15971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
15981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
16001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
160122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGR &&
1607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
161017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
16115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
16125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1620a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1621b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
16238c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
16248c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
162560909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
162660909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
16275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1628b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
162922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
16413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
16423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
16433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
16443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
16453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
16473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
16493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1650167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
16513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1652167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
16533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
16543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
16563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
16573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
16583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
16593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
16605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
16615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
16623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
16633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
16643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1667663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
166922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1670f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1672f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1673663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = (const GLubyte *) tempImage;
1674f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1675f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
16785253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1679b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
168022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1681f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1682f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0
1683f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (littleEndian) {
1684f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1685663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 0] = src[RCOMP];
1686663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 1] = src[GCOMP];
1687663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstRow[col * 3 + 2] = src[BCOMP];
1688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1689f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else {
1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1693f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = srcUB[BCOMP];
1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = srcUB[GCOMP];
1695f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = srcUB[RCOMP];
1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else
1700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1701663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 0] = src[BCOMP];
1702663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 1] = src[GCOMP];
1703663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 2] = src[RCOMP];
1704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
1705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif
1707f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
171032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1712f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
171649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1717b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1718a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
1719184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
17201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
17211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1722a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
17231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
172422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1725a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1726a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1727a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
1728a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1729a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1730a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_BYTE &&
1731a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       littleEndian) {
1732a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
173317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
17345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
17355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1736a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1737a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1738a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1739a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1740a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1741a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1742a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1743a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1744a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1745a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
17468c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
17478c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
174860909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
174960909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
17505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1751b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
175222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1755a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1756a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1757a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1758a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1760a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1761a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1762a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1763a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
17643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
17653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
17663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
17673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
17683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
17703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
17723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1773167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
17743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1775167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
17763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
17773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
17793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
17803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
17813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
17823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
17835253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
17845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
17853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
17863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
17873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1788a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1789a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1790663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1791a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
179222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1793a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1794a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1795a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1796663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = (const GLubyte *) tempImage;
1797a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1798a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1799a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1800a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
18015253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1802b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
180322108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1804a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1805a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1806663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 0] = src[RCOMP];
1807663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 1] = src[GCOMP];
1808663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col * 3 + 2] = src[BCOMP];
1809a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               src += 3;
1810a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1811a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1812a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
181432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1815a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1816a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1819a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
182049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1821b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1822f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
18231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
182522108bb571808542b89677752d62d3901698265fBrian Paul
18261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
18271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
182822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1830f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
18321f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB4444 &&
1833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1834f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1835defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
1836f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
183717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
18385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
18395253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1840f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1841f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1843f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1844f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1845663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
184722108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1851663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1853f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
18565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1857b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
185822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
18611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB4444) {
1862f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1863663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_4444( src[ACOMP],
1864663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1865663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1866663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
1867f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1868f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1870f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1871f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1872663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_4444_REV( src[ACOMP],
1873663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
1874663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1875663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
1876f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1877f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1878a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1879a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1880a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1881a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
188232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1883a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1884a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1885a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1886a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
188749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1888dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1889dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
18901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
189222108bb571808542b89677752d62d3901698265fBrian Paul
18931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
189422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1895a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1896dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1897dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       !srcPacking->SwapBytes &&
18981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA5551 &&
1899dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1900dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcFormat == GL_RGBA &&
1901dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
1902dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1903dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
19045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
19055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1906dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1907dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1908dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1909dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
1910dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* general path */
1911663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1912dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 baseInternalFormat,
191322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1914dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcWidth, srcHeight, srcDepth,
1915dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcFormat, srcType, srcAddr,
1916dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcPacking);
1917663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src =tempImage;
1918dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      GLint img, row, col;
1919dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      if (!tempImage)
1920dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         return GL_FALSE;
1921dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      for (img = 0; img < srcDepth; img++) {
19225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1923dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            + dstYoffset * dstRowStride
192422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1925dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         for (row = 0; row < srcHeight; row++) {
1926dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            GLushort *dstUS = (GLushort *) dstRow;
1927dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    for (col = 0; col < srcWidth; col++) {
1928663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul	       dstUS[col] = PACK_COLOR_5551( src[RCOMP],
1929663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[GCOMP],
1930663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[BCOMP],
1931663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul					     src[ACOMP] );
1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	      src += 4;
1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    }
1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            dstRow += dstRowStride;
1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         }
1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      }
193732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1941defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
194249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1943b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
19451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
194722108bb571808542b89677752d62d3901698265fBrian Paul
19481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
19491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
195022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
19541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB1555 &&
1955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1957defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
1958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
195917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
19605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
19615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1967663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
196922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1973663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src =tempImage;
1974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
19785253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
1979b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
198022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1982f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
19831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB1555) {
1984f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1985663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_1555( src[ACOMP],
1986663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[RCOMP],
1987663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[GCOMP],
1988663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                src[BCOMP] );
1989f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1990f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1991f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1992f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1993f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1994663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                  dstUS[col] = PACK_COLOR_1555_REV( src[ACOMP],
1995663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[RCOMP],
1996663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[GCOMP],
1997663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                    src[BCOMP] );
1998f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1999f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2000a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2001a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2002a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2003a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
200432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2005a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2006a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2007a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2008a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2010621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean
2011621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
2012621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{
2013621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2014621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2015621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2016621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
2017621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(texelBytes == 4);
2018621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2019621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   if (!ctx->_ImageTransferState &&
2020621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       !srcPacking->SwapBytes &&
2021621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       dstFormat == MESA_FORMAT_ARGB2101010 &&
2022621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       srcFormat == GL_BGRA &&
2023621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       srcType == GL_UNSIGNED_INT_2_10_10_10_REV &&
2024621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák       baseInternalFormat == GL_RGBA) {
2025621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* simple memcpy path */
2026621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      memcpy_texture(ctx, dims,
20275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
20285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2029621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2030621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcAddr, srcPacking);
2031621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
2032621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   else {
2033621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* general path */
2034e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2035621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseInternalFormat,
2036621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseFormat,
2037621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
2038621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcFormat, srcType, srcAddr,
203950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 srcPacking,
204050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 ctx->_ImageTransferState);
204150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák      const GLfloat *src = tempImage;
2042621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      GLint img, row, col;
2043621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      if (!tempImage)
2044621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         return GL_FALSE;
2045621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      for (img = 0; img < srcDepth; img++) {
20465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2047621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            + dstYoffset * dstRowStride
2048621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            + dstXoffset * texelBytes;
2049621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         if (baseInternalFormat == GL_RGBA) {
2050621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
205150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
2052621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
205350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort a,r,g,b;
205450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
205550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
205650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
205750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
205850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
205950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
2060621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
2061621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
2062621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
2063621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
2064621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else if (baseInternalFormat == GL_RGB) {
2065621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
206650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
2067621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
206850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort r,g,b;
206950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
207050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
207150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
207250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
207350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
2074621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
2075621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
2076621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
2077621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
2078621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else {
2079621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            ASSERT(0);
2080621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         }
2081621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      }
2082621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      free((void *) tempImage);
2083621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
2084621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   return GL_TRUE;
2085621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák}
2086621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
2087621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
208839de9251c4770fdcce3395643003aa626178446dBrian Paul/**
2089bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
2090bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */
2091bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean
2092bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS)
2093bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{
2094bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2095bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2096bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2097bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_AL44);
2098bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(texelBytes == 1);
2099bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2100bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   {
2101bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      /* general path */
2102663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2103bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseInternalFormat,
2104bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseFormat,
2105bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2106bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcFormat, srcType, srcAddr,
2107bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcPacking);
2108663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2109bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      GLint img, row, col;
2110bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      if (!tempImage)
2111bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         return GL_FALSE;
2112bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      for (img = 0; img < srcDepth; img++) {
21135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2114bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            + dstYoffset * dstRowStride
2115bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            + dstXoffset * texelBytes;
2116bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         for (row = 0; row < srcHeight; row++) {
2117bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            GLubyte *dstUS = (GLubyte *) dstRow;
2118bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            for (col = 0; col < srcWidth; col++) {
2119bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               /* src[0] is luminance, src[1] is alpha */
2120663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstUS[col] = PACK_COLOR_44( src[1],
2121663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                           src[0] );
2122bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               src += 2;
2123bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            }
2124bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            dstRow += dstRowStride;
2125bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         }
2126bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      }
2127bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      free((void *) tempImage);
2128bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   }
2129bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   return GL_TRUE;
2130bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák}
2131bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2132bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
2133bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/**
213439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
213539de9251c4770fdcce3395643003aa626178446dBrian Paul */
213649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
21375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS)
2138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2139184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
21401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
21411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
21431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
21445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL88_REV ||
21450a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul          dstFormat == MESA_FORMAT_GR88 ||
2146b4aecc4e1861e60e40e14868719219084967e46dBrian Paul          dstFormat == MESA_FORMAT_RG88);
214722108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2151e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL88 &&
2152e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
2153e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
21540a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul        (dstFormat == MESA_FORMAT_GR88 &&
2155e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
2157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
2158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
215917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
21605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
21615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
21653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
2166bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
21673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
21683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
21693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
21703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
21713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
21723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
21733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
21745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
21755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
21775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
21785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 3;
21795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
21805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
21815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 3;
21825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
21843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
21853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
21860a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul	 if ((littleEndian && dstFormat == MESA_FORMAT_GR88) ||
2187b4aecc4e1861e60e40e14868719219084967e46dBrian Paul	     (!littleEndian && dstFormat == MESA_FORMAT_RG88)) {
21885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
21895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 1;
21905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
21915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
21925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 1;
21935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
21945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
21953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
21963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
21973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
21983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
21993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
22003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
22013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
22023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
22033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
22045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
22055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
22063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
22073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
22083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2211663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
221322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2217663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
22225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2223b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
222422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL88 ||
22280a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul		dstFormat == MESA_FORMAT_GR88) {
2229f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2230ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
2231663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88( src[1],
2232663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[0] );
2233f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2234f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2236f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2237f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2238ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
2239663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( src[1],
2240663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                 src[0] );
2241f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2242f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2243a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2244a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2245a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2246a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
224732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2248a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2249a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2250a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2251a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2252a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
225339de9251c4770fdcce3395643003aa626178446dBrian Paul/**
225439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
225539de9251c4770fdcce3395643003aa626178446dBrian Paul */
225649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
22575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
22583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{
22593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLboolean littleEndian = _mesa_little_endian();
22603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
22613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
22623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
22633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
22645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL1616_REV ||
22655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	  dstFormat == MESA_FORMAT_RG1616 ||
22665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG1616_REV);
22673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(texelBytes == 4);
22683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
22693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   if (!ctx->_ImageTransferState &&
22703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       !srcPacking->SwapBytes &&
2271e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL1616 &&
2272e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
2273e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
2274e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede        (dstFormat == MESA_FORMAT_RG1616 &&
2275e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
22763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       srcType == GL_UNSIGNED_SHORT &&
22773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       littleEndian) {
22783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* simple memcpy path */
22793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      memcpy_texture(ctx, dims,
22805253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
22815253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
22823325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
22833325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcAddr, srcPacking);
22843325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
22853325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   else {
22863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* general path */
2287e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
22883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseInternalFormat,
22893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseFormat,
22903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcWidth, srcHeight, srcDepth,
22913325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcFormat, srcType, srcAddr,
2292bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2293bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
22943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *src = tempImage;
22953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      GLint img, row, col;
22963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      if (!tempImage)
22973325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         return GL_FALSE;
22983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      for (img = 0; img < srcDepth; img++) {
22995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
23003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstYoffset * dstRowStride
23013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            + dstXoffset * texelBytes;
23023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         for (row = 0; row < srcHeight; row++) {
23033325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            GLuint *dstUI = (GLuint *) dstRow;
23045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL1616 ||
23055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG1616) {
23063325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2307db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2308db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2309db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2310db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2311db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616(a, l);
2312db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
23133325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
23143325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
23153325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            else {
23163325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
2317db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
2318db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
2319db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
2320db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
2321db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
2322db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
23233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
23243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
23253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            dstRow += dstRowStride;
23263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         }
23273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      }
232832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
23293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
23303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   return GL_TRUE;
23313325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick}
23323325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
23333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
2334fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */
23353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean
2336eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS)
23375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{
23385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLboolean littleEndian = _mesa_little_endian();
23395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
23405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
23415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2342eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_R16 ||
2343bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák          dstFormat == MESA_FORMAT_A16 ||
2344fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_L16 ||
2345fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_I16);
23465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   ASSERT(texelBytes == 2);
23475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
23485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   if (!ctx->_ImageTransferState &&
23495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       !srcPacking->SwapBytes &&
2350eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák       baseInternalFormat == srcFormat &&
23515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcType == GL_UNSIGNED_SHORT &&
23525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       littleEndian) {
23535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* simple memcpy path */
23545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      memcpy_texture(ctx, dims,
23555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
23565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
23575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
23585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcAddr, srcPacking);
23595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
23605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   else {
23615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* general path */
2362e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
23635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseInternalFormat,
23645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseFormat,
23655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcWidth, srcHeight, srcDepth,
23665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcFormat, srcType, srcAddr,
2367bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2368bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
23695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *src = tempImage;
23705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      GLint img, row, col;
23715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (!tempImage)
23725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         return GL_FALSE;
23735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      for (img = 0; img < srcDepth; img++) {
23745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
23755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstYoffset * dstRowStride
23765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            + dstXoffset * texelBytes;
23775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         for (row = 0; row < srcHeight; row++) {
23785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            GLushort *dstUS = (GLushort *) dstRow;
23795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    for (col = 0; col < srcWidth; col++) {
23805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       GLushort r;
23815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
23825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
23835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       dstUS[col] = r;
23845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       src += 1;
23855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    }
23865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            dstRow += dstRowStride;
23875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
23885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      }
23895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      free((void *) tempImage);
23905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
23915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   return GL_TRUE;
23925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick}
23935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
23945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
23955d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean
239617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
239717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{
239817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
239917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
240017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
240117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
240217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(texelBytes == 8);
240317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
240417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   if (!ctx->_ImageTransferState &&
240517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       !srcPacking->SwapBytes &&
240617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       baseInternalFormat == GL_RGBA &&
240717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcFormat == GL_RGBA &&
240817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcType == GL_UNSIGNED_SHORT) {
240917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* simple memcpy path */
241017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      memcpy_texture(ctx, dims,
24115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
24125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
241317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
241417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcAddr, srcPacking);
241517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
241617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   else {
241717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* general path */
2418e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
241917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseInternalFormat,
242017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseFormat,
242117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcWidth, srcHeight, srcDepth,
242217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcFormat, srcType, srcAddr,
2423bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2424bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
242517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *src = tempImage;
242617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      GLint img, row, col;
242717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      if (!tempImage)
242817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         return GL_FALSE;
242917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      for (img = 0; img < srcDepth; img++) {
24305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
243117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstYoffset * dstRowStride
243217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            + dstXoffset * texelBytes;
243317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         for (row = 0; row < srcHeight; row++) {
243417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
243517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            for (col = 0; col < srcWidth; col++) {
243617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               GLushort r, g, b, a;
243717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
243817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
243917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
244017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
244117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
244217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+0] = r;
244317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+1] = g;
244417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+2] = b;
244517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+3] = a;
244617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               src += 4;
244717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            }
244817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            dstRow += dstRowStride;
244917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         }
245017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      }
245117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      free((void *) tempImage);
245217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
245317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   return GL_TRUE;
245417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul}
245517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
245617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
245717e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean
2458279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2459279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{
2460279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2461279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2462279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2463daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2464279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2465279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2466279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   if (!ctx->_ImageTransferState &&
2467279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       !srcPacking->SwapBytes &&
2468279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       baseInternalFormat == GL_RGBA &&
2469279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2470279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcFormat == GL_RGBA &&
2471279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcType == GL_SHORT) {
2472279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* simple memcpy path */
2473279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      memcpy_texture(ctx, dims,
24745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
24755253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2476279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2477279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcAddr, srcPacking);
2478279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2479279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   else {
2480279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* general path */
2481e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2482279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseInternalFormat,
2483279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseFormat,
2484279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2485279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcFormat, srcType, srcAddr,
2486bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2487bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2488279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *src = tempImage;
2489279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2490279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      GLint img, row, col;
2491279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2492279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      if (!tempImage)
2493279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         return GL_FALSE;
2494279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2495279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2496279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       * 3 or 4 components/pixel here.
2497279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       */
2498279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      for (img = 0; img < srcDepth; img++) {
24995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2500279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstYoffset * dstRowStride
2501279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            + dstXoffset * texelBytes;
2502279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         for (row = 0; row < srcHeight; row++) {
2503279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            GLshort *dstRowS = (GLshort *) dstRow;
2504daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
2505daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2506daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2507daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2508daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2509daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2510daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2511daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2512daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               }
2513daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2514daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 4 * srcWidth;
2515daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            } else {
2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2517daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2518daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2519daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2520daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
2521daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2522daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2523279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               }
2524daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 3 * srcWidth;
2526279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            }
2527279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         }
2528279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      }
2529279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      free((void *) tempImage);
2530279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2531279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   return GL_TRUE;
2532279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul}
2533279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2534279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2535279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean
2536b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
25381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
25391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
254022108bb571808542b89677752d62d3901698265fBrian Paul
25411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
254222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
2547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
2548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
254917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
25505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
25515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
255922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2560f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2561f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2562f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
25685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2569b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
257022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2573663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = PACK_COLOR_332( src[RCOMP],
2574663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[GCOMP],
2575663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[BCOMP] );
2576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
2577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
258132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
259049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2591bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS)
2592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
25931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
25941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
259522108bb571808542b89677752d62d3901698265fBrian Paul
25961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
25971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
25985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_I8 ||
25995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_R8);
260022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
260717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
26085253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
26095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
26133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
26143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
26153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
26163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
26173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
26183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
26193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
26203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
26211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
26223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
26233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
26243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
26253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
26263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
26273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
26283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
26293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
26303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
26313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
26323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
26333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
26343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
26353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
26365253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
26375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
26383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
26393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
26403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2643663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
264522108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2649663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
26545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2655b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
265622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2659663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = src[col];
2660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
266532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2667f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2669f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2670f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2672f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
26731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2674f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
267549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2676b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2678184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
26791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
268022108bb571808542b89677752d62d3901698265fBrian Paul
2681a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2682f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
26831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
26841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
268522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2686f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2687f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2689f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
269317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
26945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                  dstFormat, dstXoffset, dstYoffset, dstZoffset,
26955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                  dstRowStride, dstSlices,
2696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2701f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
27031f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
27075253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2708b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
270922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2711b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2712b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
271949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2720114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2721114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2722114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
27231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2724114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
27251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
272622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2727114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2728114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2729114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2730114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2731114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2732114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2733114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2734114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2735114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
27365253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
27375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2738114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2739114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2740114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2741114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2742114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2743114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2744114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2745114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2746114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2747114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2748114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2749114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2750114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2751114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2752114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2753114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2754114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2755114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2756114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2757114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2758114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2759114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2760114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2761114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
27625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstXoffset, dstYoffset, dstZoffset,
27635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
2764114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2765114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2766114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2767114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2768114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2769114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
27708c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
27718c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2772114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2773114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2774114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
277532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2776114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2777114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2778114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2779114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2780114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2781114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2782114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2783114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2784114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2785114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2786114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2787114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2788114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2789114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2790114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2791114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2792114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2793114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2794114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
27955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      dst = (GLbyte *) dstSlices[0]
2796114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            + dstYoffset * dstRowStride
279722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2798114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
279922108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2800114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
280122108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2802114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
280332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2804114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2805114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2806114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
280884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
280984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2810daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format.
281184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
281284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2813daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS)
281484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
281584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
281684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
281784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2818daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
2819daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L8 ||
2820daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I8 ||
2821daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_R8);
282284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 1);
282384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2824daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2825daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2826daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2827daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE) {
2828daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2829daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
28305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
28315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2832daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2833daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2834daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2835daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
283684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2837e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
283884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
283984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
284084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
284184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2842bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2843bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2844daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
284584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
284684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
284784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
284884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
28495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img]
285084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
285184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
285284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
285384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2854daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
285584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
285684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
2857daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            src += srcWidth;
285884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
285984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
286084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
286184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
286284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
286384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
286484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
286584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
286684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2867daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format.
286884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
286984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2870daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS)
287184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
2872daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
287384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
287484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
287584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2876daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
2877daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
2878daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 2);
287984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2880daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2881daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2882daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2883daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE &&
2884daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2885daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2886daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
28875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
28885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2889daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2890daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2891daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2892daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
289384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2894e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
289584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
289684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
289784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
289884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2899bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2900bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2901daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
290284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
290384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
290484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
290584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
29065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img]
290784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
290884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
290984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2910daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
291184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2912daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
2913daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
2914daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2915daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
291684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
291784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
291884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
291984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
292084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
292184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
292284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
292384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
292484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2925daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */
2926daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2927daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS)
2928daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2929daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2930daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2931daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2932daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2933daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
2934daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_A16 ||
2935daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L16 ||
2936daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I16);
2937daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 2);
2938daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2939daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2940daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2941daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2942daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
2943daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2944daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2945daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
29465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
29475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2948daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2949daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2950daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2951daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
2952daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
2953daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2954daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
2955daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
2956daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2957daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
2958daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
2959daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
2960daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
2961daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
2962daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
2963daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
2964daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
29655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
2966daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstYoffset * dstRowStride
2967daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstXoffset * texelBytes;
2968daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
2969daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dstUS = (GLshort *) dstRow;
2970daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    for (col = 0; col < srcWidth; col++) {
2971daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       GLushort r;
2972daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2973daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
2974daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       dstUS[col] = r;
2975daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       src += 1;
2976daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    }
2977daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
2978daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
2979daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
2980daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
2981daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2982daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
2983daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
2984daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2985daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/**
2986daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
2987daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */
2988daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2989daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
2990daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2991daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2992daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2993daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2994daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2995daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
2996daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_GR1616);
2997daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(texelBytes == 4);
2998daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2999daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
3000daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
3001daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
3002daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
3003daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
3004daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
3005daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
30065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
30075253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3008daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3009daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
3010daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3011daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
3012daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
3013daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3014daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
3015daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
3016daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
3017daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
3018daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
3019daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
3020daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
3021daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
3022daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
3023daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
3024daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
30255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3026daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstYoffset * dstRowStride
3027daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            + dstXoffset * texelBytes;
3028daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
3029daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dst = (GLshort *) dstRow;
3030daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            for (col = 0; col < srcWidth; col++) {
3031daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               GLushort l, a;
3032daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
3033daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
3034daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
3035daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = l;
3036daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = a;
3037daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
3038daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
3039daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            }
3040daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
3041daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
3042daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
3043daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
3044daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
3045daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
3046daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
304784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
304884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
304984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
305084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
305184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
305284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
305384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
305484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
305584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
305684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
305784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
305884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(texelBytes == 4);
305984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
306084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
306184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
3062e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
306384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
306484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
306584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
306684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
3067bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3068bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
306984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
307084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
307184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
307284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
307384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
30745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img]
307584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstYoffset * dstRowStride
307684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            + dstXoffset * texelBytes;
307784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
3078daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
307984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
3080daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3081daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3082daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
30838778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul               dst[0] = 127;
3084daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               srcRow += 3;
3085daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 4;
308684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
308784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
308884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
308984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
309084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
309184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
309284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
309384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
309484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
309584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
309684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3097c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
309839de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
309939de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
3100c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
310149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3102c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
3103c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
3104c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
31051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
31061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3107c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
31081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
31091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
311022108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
3111c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
3112c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
3113c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       !srcPacking->SwapBytes &&
31141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
3115c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
3116c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
3117c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
3118c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
3119c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
31205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
31215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3122c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3123c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
3124c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
3125c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else if (!ctx->_ImageTransferState &&
3126bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       !srcPacking->SwapBytes &&
31271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
3128bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       baseInternalFormat == GL_RGBA &&
3129bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
3130bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
3131bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      /* simple memcpy path */
3132bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      memcpy_texture(ctx, dims,
31335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
31345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3135bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3136bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcAddr, srcPacking);
3137bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   }
3138c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
3139c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
3140e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3141c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
314222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3143c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
3144c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
3145bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3146bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3147c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
3148c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
3149c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
3150c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
3151c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
31525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img]
3153c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            + dstYoffset * dstRowStride
315422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3155c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
3156daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
31571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
3158c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
3159daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3160daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3161daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
3162daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
3163c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
3164daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
3165c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
3166c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
3167bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
3168bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
3169daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
3170daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
3171daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
3172daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
3173bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
3174daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
3175bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
3176bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
3177c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
3178c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
3179c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
318032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3181c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
3182c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
3183c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
3184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
318584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
3186184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
3187184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
3188184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
318949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
3191184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
319292098438784887fd6005918794476cfbbeac5035Karl Schultz   const GLuint depthScale = 0xffffff;
3193c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
3194b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
3195c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
319625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
31971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
3198e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
3199e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
3200e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_STENCIL_INDEX);
3201c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
3202184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3203e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f &&
3204966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
3205184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
3206ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
3207184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
32085253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
32095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3210184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3211184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
321239de9251c4770fdcce3395643003aa626178446dBrian Paul   }
3213e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
3214e41a91cea764cc1ba95906251cd907d837225293Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
3215c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      /* In case we only upload depth we need to preserve the stencil */
3216ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
32175253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul	 GLuint *dstRow = (GLuint *) (dstSlices[dstZoffset + img]
32185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                      + dstYoffset * dstRowStride
32195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                      + dstXoffset * 4);
3220b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
3221b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
3222c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcWidth, srcHeight,
3223c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcFormat, srcType,
3224c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  img, 0, 0);
3225ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
3226c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie            GLuint depth[MAX_WIDTH];
3227c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLubyte stencil[MAX_WIDTH];
3228ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
3229c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
3230c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3231c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
3232c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepstencil = GL_TRUE;
323339de9251c4770fdcce3395643003aa626178446dBrian Paul	    }
323439de9251c4770fdcce3395643003aa626178446dBrian Paul            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
3235c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepdepth = GL_TRUE;
3236c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
3237c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3238c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepdepth == GL_FALSE)
3239c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* the 24 depth bits will be in the low position: */
3240c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_depth_span(ctx, srcWidth,
3241c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       GL_UNSIGNED_INT, /* dst type */
3242c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       keepstencil ? depth : dstRow, /* dst addr */
3243c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       depthScale,
3244c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       srcType, src, srcPacking);
3245c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3246c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil == GL_FALSE)
3247c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* get the 8-bit stencil values */
3248c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_stencil_span(ctx, srcWidth,
3249c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 GL_UNSIGNED_BYTE, /* dst type */
3250c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 stencil, /* dst addr */
3251c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 srcType, src, srcPacking,
3252c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 ctx->_ImageTransferState);
3253c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3254c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    for (i = 0; i < srcWidth; i++) {
3255c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       if (keepstencil)
3256c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
3257c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       else
3258c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
3259c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
3260ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
3261ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
3262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
3263ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
3264ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
3265184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
3266184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
3267184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
3268184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3269184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
3270a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
3271a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
3272a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
327349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3274a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
3275a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
3276a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
3277a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
3278b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
3279a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
3280a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
32811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
328239de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
328339de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_DEPTH_COMPONENT ||
328439de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_STENCIL_INDEX);
328539de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
328639de9251c4770fdcce3395643003aa626178446dBrian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT);
3287c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
3288c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   for (img = 0; img < srcDepth; img++) {
32895253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLuint *dstRow = (GLuint *) (dstSlices[dstZoffset + img]
32905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                   + dstYoffset * dstRowStride
32915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                   + dstXoffset * 4);
3292b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      const GLubyte *src
3293b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
3294c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcWidth, srcHeight,
3295c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcFormat, srcType,
3296c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						img, 0, 0);
3297c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      for (row = 0; row < srcHeight; row++) {
3298c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLuint depth[MAX_WIDTH];
3299c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLubyte stencil[MAX_WIDTH];
3300c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLint i;
3301c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
3302c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3303c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
3304c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepstencil = GL_TRUE;
330539de9251c4770fdcce3395643003aa626178446dBrian Paul	 }
330639de9251c4770fdcce3395643003aa626178446dBrian Paul         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
3307c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepdepth = GL_TRUE;
3308c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3309666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3310c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepdepth == GL_FALSE)
3311c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* the 24 depth bits will be in the low position: */
3312c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_depth_span(ctx, srcWidth,
3313c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    GL_UNSIGNED_INT, /* dst type */
3314c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    keepstencil ? depth : dstRow, /* dst addr */
3315c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    depthScale,
3316c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    srcType, src, srcPacking);
3317c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3318c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepstencil == GL_FALSE)
3319c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* get the 8-bit stencil values */
3320c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_stencil_span(ctx, srcWidth,
3321c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      GL_UNSIGNED_BYTE, /* dst type */
3322c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      stencil, /* dst addr */
3323c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      srcType, src, srcPacking,
3324c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      ctx->_ImageTransferState);
3325c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3326c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 /* merge stencil values into depth values */
3327c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 for (i = 0; i < srcWidth; i++) {
3328c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil)
3329c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
3330c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    else
3331c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
3332666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
3333c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
3334c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 src += srcRowStride;
3335c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 dstRow += dstRowStride / sizeof(GLuint);
3336a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
3337a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
3338a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
3339a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
3340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
334139de9251c4770fdcce3395643003aa626178446dBrian Paul
334239de9251c4770fdcce3395643003aa626178446dBrian Paul/**
334339de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data.
334439de9251c4770fdcce3395643003aa626178446dBrian Paul */
334539de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean
334639de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS)
334739de9251c4770fdcce3395643003aa626178446dBrian Paul{
334839de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8);
334939de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_STENCIL_INDEX);
335039de9251c4770fdcce3395643003aa626178446dBrian Paul
335139de9251c4770fdcce3395643003aa626178446dBrian Paul   if (!ctx->_ImageTransferState &&
335239de9251c4770fdcce3395643003aa626178446dBrian Paul       !srcPacking->SwapBytes &&
335339de9251c4770fdcce3395643003aa626178446dBrian Paul       baseInternalFormat == srcFormat &&
335439de9251c4770fdcce3395643003aa626178446dBrian Paul       srcType == GL_UNSIGNED_BYTE) {
335539de9251c4770fdcce3395643003aa626178446dBrian Paul      /* simple memcpy path */
335639de9251c4770fdcce3395643003aa626178446dBrian Paul      memcpy_texture(ctx, dims,
33575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
33585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
335939de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
336039de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcAddr, srcPacking);
336139de9251c4770fdcce3395643003aa626178446dBrian Paul   }
336239de9251c4770fdcce3395643003aa626178446dBrian Paul   else {
336339de9251c4770fdcce3395643003aa626178446dBrian Paul      const GLint srcRowStride
3364b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
336539de9251c4770fdcce3395643003aa626178446dBrian Paul      GLint img, row;
336639de9251c4770fdcce3395643003aa626178446dBrian Paul
336739de9251c4770fdcce3395643003aa626178446dBrian Paul      for (img = 0; img < srcDepth; img++) {
33685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
336939de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
337039de9251c4770fdcce3395643003aa626178446dBrian Paul            + dstXoffset;
3371b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
3372b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
337339de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcWidth, srcHeight,
337439de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcFormat, srcType,
337539de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   img, 0, 0);
337639de9251c4770fdcce3395643003aa626178446dBrian Paul         for (row = 0; row < srcHeight; row++) {
337739de9251c4770fdcce3395643003aa626178446dBrian Paul            GLubyte stencil[MAX_WIDTH];
337839de9251c4770fdcce3395643003aa626178446dBrian Paul            GLint i;
337939de9251c4770fdcce3395643003aa626178446dBrian Paul
338039de9251c4770fdcce3395643003aa626178446dBrian Paul            /* get the 8-bit stencil values */
338139de9251c4770fdcce3395643003aa626178446dBrian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
338239de9251c4770fdcce3395643003aa626178446dBrian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
338339de9251c4770fdcce3395643003aa626178446dBrian Paul                                      stencil, /* dst addr */
338439de9251c4770fdcce3395643003aa626178446dBrian Paul                                      srcType, src, srcPacking,
338539de9251c4770fdcce3395643003aa626178446dBrian Paul                                      ctx->_ImageTransferState);
338639de9251c4770fdcce3395643003aa626178446dBrian Paul            /* merge stencil values into depth values */
338739de9251c4770fdcce3395643003aa626178446dBrian Paul            for (i = 0; i < srcWidth; i++)
338839de9251c4770fdcce3395643003aa626178446dBrian Paul               dstRow[i] = stencil[i];
338939de9251c4770fdcce3395643003aa626178446dBrian Paul
339039de9251c4770fdcce3395643003aa626178446dBrian Paul            src += srcRowStride;
339139de9251c4770fdcce3395643003aa626178446dBrian Paul            dstRow += dstRowStride / sizeof(GLubyte);
339239de9251c4770fdcce3395643003aa626178446dBrian Paul         }
339339de9251c4770fdcce3395643003aa626178446dBrian Paul      }
339439de9251c4770fdcce3395643003aa626178446dBrian Paul
339539de9251c4770fdcce3395643003aa626178446dBrian Paul   }
339639de9251c4770fdcce3395643003aa626178446dBrian Paul
339739de9251c4770fdcce3395643003aa626178446dBrian Paul   return GL_TRUE;
339839de9251c4770fdcce3395643003aa626178446dBrian Paul}
339939de9251c4770fdcce3395643003aa626178446dBrian Paul
340039de9251c4770fdcce3395643003aa626178446dBrian Paul
3401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
3403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
3404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
3405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
3406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
3407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
3408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
3409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
341049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3411b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
3412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
34131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
34141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
341522108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
34171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
34181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
34191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
34201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
34211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
34220ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
34230ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT32 ||
34240ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT32);
3425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
34300ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
34310ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
34320ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
343322108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLfloat));
3434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
34389e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
3440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
344117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
34425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
34435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3444f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3446f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3449e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
345122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3454bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3455bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3456b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
34579c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
3458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
34619c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3462f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
34635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3464b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
346522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3467c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dstRow, srcRow, bytesPerRow);
3468b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
3469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
3470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
347332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3478c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
3482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
348349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3484b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
34861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
34871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
348822108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3489f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
34901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
34911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
34921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
34931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
34941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
34950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
34960ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT16 ||
34970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT16);
3498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
35030ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
35040ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
35050ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
350622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLhalfARB));
3507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
35119e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
3513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
351417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
35155253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
35165253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3522e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
352422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3527bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3528bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
3530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
3533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
35345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3535b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
353622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
3537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
3540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
3542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
3543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
3544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
3545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
354832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */
3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3556abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3558abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3559abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3561abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
356238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT8 ||
356338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT8 ||
356438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT8 ||
356538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT8 ||
356638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT8 ||
356738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT8 ||
356838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT8 ||
356938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8);
3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3573abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3574abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3576abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLbyte));
3577abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3578bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3579bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3580bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3581bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3583abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_BYTE) {
3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
35865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
35875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3588abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3589abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3590abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3591abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3592abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3593e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3594abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3598bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
36045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLbyte *dstTexel = (GLbyte *) dstRow;
3609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3611abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLbyte) src[i];
3612abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3613abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3614abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3615abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3616abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3617abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3618abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3619abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3620abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3621abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3622abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3623abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3624abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */
3625abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3626abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3627abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3628abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3629abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3630abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
363238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT16 ||
363338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT16 ||
363438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT16 ||
363538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT16 ||
363638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT16 ||
363738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT16 ||
363838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT16 ||
363938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16);
3640abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3641abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3642abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3643abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3644abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3645abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3646abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLshort));
3647abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3648bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3649bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3650bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3651bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3652abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
36539fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul       srcType == GL_SHORT) {
3654abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3655abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
36565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
36575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3658abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3659abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3660abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3661abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3662abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3663e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3664abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3665abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3666abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3667abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3668bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3669abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3670abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3671abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3672abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3673abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
36745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3675abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3676abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3677abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3678abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLshort *dstTexel = (GLshort *) dstRow;
3679abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3680abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3681abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3682abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3683abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3684abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3685abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3686abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3687abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3688abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3689abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3690abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3691abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3692abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3693abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3694abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */
3695abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3696abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3697abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3698abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3699abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3700abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3701abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
370238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT32 ||
370338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT32 ||
370438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT32 ||
370538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT32 ||
370638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT32 ||
370738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT32 ||
370838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT32 ||
370938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32);
3710abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3711abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3712abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3713abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3714abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3715abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3716abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLint));
3717abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3718bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3719bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3720bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3721bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3722abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3723abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_INT) {
3724abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3725abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
37265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
37275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3728abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3729abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3730abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3731abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3732abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3733e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3734abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseInternalFormat,
3735abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 baseFormat,
3736abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3737abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                                                 srcFormat, srcType, srcAddr,
3738bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking, 0x0);
3739abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      const GLfloat *src = tempImage;
3740abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3741abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3742abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3743abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
37445253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3745abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3746abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3747abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3748abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint *dstTexel = (GLint *) dstRow;
3749abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3750abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3751abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               dstTexel[i] = (GLint) src[i];
3752abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3753abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3754abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3755abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3756abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3757abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3758abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3759abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3760abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3761abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3762abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3763abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3764abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */
3765abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3766abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3767abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3768abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3769abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3770abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3771abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
377238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT8 ||
377338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT8 ||
377438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT8 ||
377538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT8 ||
377638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT8 ||
377738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT8 ||
377838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT8 ||
377938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
3780abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3781abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3782abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3783abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3784abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3785abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3786abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLubyte));
3787abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3788bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3789bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3790bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3791bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3792abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3793abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_BYTE) {
3794abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3795abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
37965253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
37975253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3798abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3799abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3800abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3801abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3802abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3803dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3804dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3805dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3806dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3807dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3808abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3809abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3810abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3811abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
38125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3813abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3814abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3815abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3816abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLubyte *dstTexel = (GLubyte *) dstRow;
3817abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3818abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3819dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
3820abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3821abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3822abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3823abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3824abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3825abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3826abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3827abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3828abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3829abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3830abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3831abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3832abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */
3833abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3834abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3835abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3836abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3837abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3838abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3839abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
384038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT16 ||
384138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT16 ||
384238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT16 ||
384338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT16 ||
384438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT16 ||
384538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT16 ||
384638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT16 ||
384738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
3848abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3849abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLushort));
3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3856bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3857bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3858bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3859bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3860abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3861abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_SHORT) {
3862abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3863abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
38645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
38655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3866abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3867abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3868abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3869abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3870abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3871dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3872dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3873dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3874dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3875dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3876abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3877abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3878abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3879abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
38805253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3881abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3882abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3883abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3884abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLushort *dstTexel = (GLushort *) dstRow;
3885abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3886abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3887dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
3888abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3889abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3890abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3891abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3892abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3893abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3894abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3895abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3896abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3897abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3898abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3899abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3900abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */
3901abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3902abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3903abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3904abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
3905abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3906abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3907abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
390838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT32 ||
390938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT32 ||
391038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT32 ||
391138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT32 ||
391238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT32 ||
391338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT32 ||
391438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT32 ||
391538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
3916abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3917abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3918abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3919abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3920abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3921abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
3922abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(texelBytes == components * sizeof(GLuint));
3923abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3924bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3925bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3926bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3927bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3928abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3929abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_INT) {
3930abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3931abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
39325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
39335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3934abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3935abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3936abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3937abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3938abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3939dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3940dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3941dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3942dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3943dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3946abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
39485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
3949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstYoffset * dstRowStride
3950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            + dstXoffset * texelBytes;
3951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLuint *dstTexel = (GLuint *) dstRow;
3953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3955dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               dstTexel[i] = src[i];
3956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3957abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3958abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3959abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3960abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3961abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3962abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3963abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3964abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3965abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3966abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3967abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3968abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3969abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
39708d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
397149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
39728d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
39738d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
39741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
397546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
397646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
39771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
397846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
397946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
39801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
398146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
39820f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
39835253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
398439de9251c4770fdcce3395643003aa626178446dBrian Paul                             dstXoffset, dstYoffset, dstZoffset,
39855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
398639de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcWidth, srcHeight, srcDepth,
398739de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcFormat, srcType,
398839de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcAddr, srcPacking);
398946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
39908d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
39918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
399254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
399349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
39948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
39958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
39961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
399746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
399846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
39991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
400046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
400146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
40021f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
400346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
40045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
400546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstXoffset, dstYoffset, dstZoffset,
40065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
400746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
400846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
400946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
401046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
40118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
40128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
401354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
401449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40155bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
40165bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
40171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
40185bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
40195bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
40215bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40225bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
40231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
40245bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40255bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
40265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
40275bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstXoffset, dstYoffset, dstZoffset,
40285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
40295bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
40305bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
40315bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
40325bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
40335bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
40345bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
40355bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
403649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
40388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
40391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
404046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
404146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
404346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
404546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
404654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
4047bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
40485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
40495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstXoffset, dstYoffset, dstZoffset,
40505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
40515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcWidth, srcHeight, srcDepth,
40525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcFormat, srcType,
40535253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcAddr, srcPacking);
405446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
40558d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
40568d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
405754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
405849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
40598d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
40608d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
40611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
406246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
406346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
406546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
406646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
40671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
406846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
40695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
40705253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      newDstFormat,
40715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      dstXoffset, dstYoffset, dstZoffset,
40725253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      dstRowStride, dstSlices,
40735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcWidth, srcHeight, srcDepth,
40745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcFormat, srcType,
40755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcAddr, srcPacking);
407646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
40778d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
40788d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
40799927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
40809927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
40819927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
40829927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
40839927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
40849927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
40859927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
40869927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
40879927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
40888d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
40898d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
40909d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean
40919d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
40929d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{
40939d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
40949d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
40959d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
40969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(baseInternalFormat == GL_RGB);
40979d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
40989d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   if (!ctx->_ImageTransferState &&
40999d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       !srcPacking->SwapBytes &&
41009d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       srcFormat == GL_RGB &&
41019d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák       srcType == GL_UNSIGNED_INT_5_9_9_9_REV) {
41029d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* simple memcpy path */
41039d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      memcpy_texture(ctx, dims,
41045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
41055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
41069d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
41079d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcAddr, srcPacking);
41089d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
41099d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   else {
41109d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* general path */
41119d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
41129d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseInternalFormat,
41139d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseFormat,
41149d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
41159d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcFormat, srcType, srcAddr,
41169d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcPacking,
41179d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 ctx->_ImageTransferState);
41189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *srcRow = tempImage;
41199d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      GLint img, row, col;
41209d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      if (!tempImage)
41219d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         return GL_FALSE;
41229d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      for (img = 0; img < srcDepth; img++) {
41235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
41249d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            + dstYoffset * dstRowStride
41259d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            + dstXoffset * 4;
41269d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         for (row = 0; row < srcHeight; row++) {
41279d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint *dstUI = (GLuint*)dstRow;
41289d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (col = 0; col < srcWidth; col++) {
41299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]);
41309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
41319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            dstRow += dstRowStride;
41329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            srcRow += srcWidth * 3;
41339d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
41349d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      }
41359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
41369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      free((void *) tempImage);
41379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
41389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   return GL_TRUE;
41399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák}
4140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4141631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean
4142631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
4143631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{
4144631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
4145631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4146631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
4147631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(baseInternalFormat == GL_RGB);
4148631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4149631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   if (!ctx->_ImageTransferState &&
4150631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       !srcPacking->SwapBytes &&
4151631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       srcFormat == GL_RGB &&
4152631d23daa91c569bf268a2191bd466df73a64263Marek Olšák       srcType == GL_UNSIGNED_INT_10F_11F_11F_REV) {
4153631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* simple memcpy path */
4154631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      memcpy_texture(ctx, dims,
41555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
41565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
4157631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
4158631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcAddr, srcPacking);
4159631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
4160631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   else {
4161631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* general path */
4162631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
4163631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseInternalFormat,
4164631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseFormat,
4165631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
4166631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcFormat, srcType, srcAddr,
4167631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcPacking,
4168631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 ctx->_ImageTransferState);
4169631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *srcRow = tempImage;
4170631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      GLint img, row, col;
4171631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      if (!tempImage)
4172631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         return GL_FALSE;
4173631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      for (img = 0; img < srcDepth; img++) {
41745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         GLubyte *dstRow = dstSlices[dstZoffset + img]
4175631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            + dstYoffset * dstRowStride
4176631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            + dstXoffset * 4;
4177631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         for (row = 0; row < srcHeight; row++) {
4178631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint *dstUI = (GLuint*)dstRow;
4179631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (col = 0; col < srcWidth; col++) {
4180631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]);
4181631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
4182631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            dstRow += dstRowStride;
4183631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            srcRow += srcWidth * 3;
4184631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
4185631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      }
4186631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4187631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      free((void *) tempImage);
4188631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
4189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   return GL_TRUE;
4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšák}
4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
4192485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4193b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean
4194b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
4195b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{
4196b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
4197b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL ||
4198b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
4199b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_STENCIL_INDEX);
4200b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat != GL_DEPTH_STENCIL ||
4201b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4202b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4203b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL &&
4204b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthScale == 1.0f &&
4205b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthBias == 0.0f &&
4206b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       !srcPacking->SwapBytes) {
4207b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* simple path */
4208b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      memcpy_texture(ctx, dims,
42095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
42105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
4211b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
4212b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcAddr, srcPacking);
4213b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
4214b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
4215b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
4216b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      GLint img, row;
4217b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      const GLint srcRowStride
4218b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
4219b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         / sizeof(uint64_t);
4220b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4221b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* In case we only upload depth we need to preserve the stencil */
4222b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      for (img = 0; img < srcDepth; img++) {
42235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         uint64_t *dstRow = (uint64_t *) (dstSlices[dstZoffset + img]
42245253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                          + dstYoffset * dstRowStride
42255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                          + dstXoffset * 8);
4226b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         const uint64_t *src
4227b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
4228b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcWidth, srcHeight,
4229b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcFormat, srcType,
4230b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  img, 0, 0);
4231b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         for (row = 0; row < srcHeight; row++) {
4232b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            /* The unpack functions with:
4233b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
4234b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * only write their own dword, so the other dword (stencil
4235b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * or depth) is preserved. */
4236b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_STENCIL_INDEX)
4237b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_depth_span(ctx, srcWidth,
4238b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
4239b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       dstRow, /* dst addr */
4240b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       1.0f, srcType, src, srcPacking);
4241b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4242b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_DEPTH_COMPONENT)
4243b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_stencil_span(ctx, srcWidth,
4244b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
4245b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         dstRow, /* dst addr */
4246b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         srcType, src, srcPacking,
4247b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         ctx->_ImageTransferState);
4248b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4249b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            src += srcRowStride;
4250b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            dstRow += dstRowStride / sizeof(uint64_t);
4251b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         }
4252b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      }
4253b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
4254b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   return GL_TRUE;
4255b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák}
4256b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
4257920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
4258f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
4259f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{
4260f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
4261f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
4262f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
4263f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT);
4264f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   ASSERT(texelBytes == 4);
4265f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
4266f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   if (!srcPacking->SwapBytes &&
4267f449be660e70aac2aefd2ce84581e137de25520bDave Airlie       dstFormat == MESA_FORMAT_ARGB2101010_UINT &&
4268f449be660e70aac2aefd2ce84581e137de25520bDave Airlie       srcFormat == GL_BGRA_INTEGER_EXT &&
4269f449be660e70aac2aefd2ce84581e137de25520bDave Airlie       srcType == GL_UNSIGNED_INT_2_10_10_10_REV &&
4270f449be660e70aac2aefd2ce84581e137de25520bDave Airlie       baseInternalFormat == GL_RGBA) {
4271f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* simple memcpy path */
4272f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      memcpy_texture(ctx, dims,
4273f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     dstFormat, dstXoffset, dstYoffset, dstZoffset,
4274f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     dstRowStride, dstSlices,
4275f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
4276f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcAddr, srcPacking);
4277f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
4278f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   else {
4279f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* general path */
4280f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
4281f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseInternalFormat,
4282f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseFormat,
4283f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcWidth, srcHeight,
4284f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcDepth, srcFormat,
4285f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcType, srcAddr,
4286f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcPacking);
4287f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *src = tempImage;
4288f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      GLint img, row, col;
4289f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      if (!tempImage)
4290f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         return GL_FALSE;
4291f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      for (img = 0; img < srcDepth; img++) {
4292f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         GLubyte *dstRow = dstSlices[dstZoffset + img]
4293f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            + dstYoffset * dstRowStride
4294f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            + dstXoffset * texelBytes;
4295f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
4296f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         for (row = 0; row < srcHeight; row++) {
4297f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            GLuint *dstUI = (GLuint *) dstRow;
4298f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            for (col = 0; col < srcWidth; col++) {
4299f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               GLushort a,r,g,b;
4300f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               r = src[RCOMP];
4301f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               g = src[GCOMP];
4302f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               b = src[BCOMP];
4303f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               a = src[ACOMP];
4304f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
4305f449be660e70aac2aefd2ce84581e137de25520bDave Airlie               src += 4;
4306f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            }
4307f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            dstRow += dstRowStride;
4308f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         }
4309f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      }
4310f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      free((void *) tempImage);
4311f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
4312f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   return GL_TRUE;
4313f449be660e70aac2aefd2ce84581e137de25520bDave Airlie}
4314f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
4315f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean
4316920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
4317920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
4318920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
4319920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
4320920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
4321920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
43225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   (void) dstRowStride; (void) dstSlices,
4323920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
4324920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
4325920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
4326920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
4327920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4328920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
4329920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
4330920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
4331920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
4332920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4333920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4334485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
4335485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
4336485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
4337e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
4338485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
4339485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
43406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static StoreTexImageFunc table[MESA_FORMAT_COUNT];
43416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static GLboolean initialized = GL_FALSE;
43426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
43436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   if (!initialized) {
43446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_NONE] = _mesa_texstore_null;
43456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
43466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888;
43476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888;
43486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888;
43496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888;
4350d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888;
4351d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888;
43526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888;
43536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888;
43546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888;
43556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888;
43566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565;
43576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565;
43586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444;
43596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444;
43606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551;
43616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555;
43626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555;
43636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44;
43646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88;
43656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88;
43666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616;
43676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616;
43686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332;
43696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A8] = _mesa_texstore_unorm8;
43706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A16] = _mesa_texstore_unorm16;
43716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L8] = _mesa_texstore_unorm8;
43726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L16] = _mesa_texstore_unorm16;
43736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I8] = _mesa_texstore_unorm8;
43746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I16] = _mesa_texstore_unorm16;
43756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
43766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
43776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R8] = _mesa_texstore_unorm8;
43780a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul      table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88;
4379b4aecc4e1861e60e40e14868719219084967e46dBrian Paul      table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88;
43806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R16] = _mesa_texstore_unorm16;
43816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616;
43826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616;
43836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010;
43846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8;
43856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24;
43866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z16] = _mesa_texstore_z16;
43876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24;
43886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8;
43896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32] = _mesa_texstore_z32;
43906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8] = _mesa_texstore_s8;
43916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8;
43926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8;
43936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8;
43946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SL8] = _mesa_texstore_sl8;
43956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8;
43966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1;
43976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1;
43986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3;
43996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5;
44006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1;
44016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1;
44026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1;
44036e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1;
44046e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3;
44056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5;
44066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32;
44076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16;
44086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32;
44096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16;
44106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
44116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
44126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32;
44136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16;
44146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
44156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
44166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32;
44176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16;
44186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32;
44196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16;
44206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32;
44216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16;
44226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8;
44236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8;
44246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88;
44256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888;
44266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888;
44276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888;
44286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16;
44296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616;
44306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16;
44316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16;
44326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16;
44336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1;
44346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1;
44356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2;
44366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2;
44376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1;
44386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1;
44396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2;
44406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2;
4441d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8;
44426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8;
44436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8;
44446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88;
44456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8;
44466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16;
44476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16;
44486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616;
44496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16;
44506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5;
44516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
44526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32;
44536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8;
445438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
445538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
445638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
445738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
445838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8;
445938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16;
446038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32;
446138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
446238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8;
446338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16;
446438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32;
446538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8;
446638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16;
446738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32;
446838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
446938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8;
447038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16;
447138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32;
447238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8;
447338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16;
447438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32;
447538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
447638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
447738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
447838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
447938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8;
448038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16;
448138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32;
448238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
448338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8;
448438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8;
448538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8;
448638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8;
448738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16;
448838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16;
448938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16;
449038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16;
449138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32;
449238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32;
449338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32;
449438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32;
449538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
449638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8;
449738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8;
449838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8;
449938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8;
450038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16;
450138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16;
450238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16;
450338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16;
450438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32;
450538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32;
450638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32;
450738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32;
450838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
4509f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint;
45106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      initialized = GL_TRUE;
4511485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
4512920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
45136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   ASSERT(table[format]);
45146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   return table[format];
4515485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
4516485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4517485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4518660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
4519660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
4520660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
4521660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
4522660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
4523660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
4524660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
4525660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
4526660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
4527660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
45281f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
4529660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4530660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
45315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                        dstFormat, dstXoffset, dstYoffset, dstZoffset,
45325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                        dstRowStride, dstSlices,
4533660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
4534660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
4535660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
4536660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
4537660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4538485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
453981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/**
454081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it.
454181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture
454281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from
454381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values.
454481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat  the user-provided image format
454581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat  the destination texture format
454681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */
454781430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield
454881430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat)
45495999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
455081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT)
455181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul       && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL)
455281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
455381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   else
455481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_WRITE_BIT;
45555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
45565999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4557ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
45581da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage1D().
45596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
45608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
45618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4562f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
45638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
45648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint border,
45658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const GLvoid *pixels,
45668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
45678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
45688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
45698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
457081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
457181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
457281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
457381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
457481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4575a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
45768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4577b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0)
4578b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4579b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
458078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
458178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
458278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, 1, 1)) {
45837d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
45847d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
45857d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
45868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4587e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4588e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage1D");
45896b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
45906b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
45916b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
45926b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
459389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
45946b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
459581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
459681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer (write to whole region) */
459781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
459881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               0, 0, width, 1,
459981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
460081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
46011ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
46021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
46031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               texImage->TexFormat,
46041ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, 0, 0,  /* dstX/Y/Zoffset */
46051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, /* dstRowStride */
46061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               &dstMap,
46071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               width, 1, 1,
46081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               format, type, pixels, packing);
460981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
46101ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
46111ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
46121ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
46131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = GL_FALSE;
46141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
461581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
461681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
461781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
4618f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
461971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
46208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
46218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
46228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
46236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
46241da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage2D().
46256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul *
4626b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather
4627b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM.  Device driver's can easily plug in their own replacement.
46288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
46298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4630f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
46318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
46328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint border,
46338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
46348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
46358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
46368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
46378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
463881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
463981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
464081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
464181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
464281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4643a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
46448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4645b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0 || height == 0)
4646b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4647b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
464878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
464978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
465078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
46517d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
46527d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
46537d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
46548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
465571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4656e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage2D");
46576b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
46586b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
46596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
46606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
466189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
46626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
466381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4664229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   if (target == GL_TEXTURE_1D_ARRAY) {
4665229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      const GLint srcStride =
4666229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         _mesa_image_row_stride(packing, width, format, type);
4667229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      int y;
4668229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4669229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      success = GL_TRUE;
4670229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4671229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      for (y = 0; y < height; y++) {
4672229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         /* Map dest texture buffer (write to whole region) */
4673229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         ctx->Driver.MapTextureImage(ctx, texImage, y,
4674229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     0, 0, width, 1,
4675229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     rwMode,
4676229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                     &dstMap, &dstRowStride);
46771ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         if (dstMap) {
46781ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul            success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
46791ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     texImage->TexFormat,
46801ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     0, 0, 0,  /* dstX/Y/Zoffset */
46811ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     dstRowStride,
46821ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     &dstMap,
46831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     width, 1, 1,
46841ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                     format, type, pixels, packing);
46851ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul            ctx->Driver.UnmapTextureImage(ctx, texImage, y);
46861ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         }
46871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         else {
46881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul            success = GL_FALSE;
46891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         }
4690229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
4691229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt         if (!success)
4692229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt            break;
4693229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
46946a04fa9cd4982f056588e11263345e1561197261Brian Paul         pixels = (const GLubyte *) pixels + srcStride;
4695229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      }
4696229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   } else {
4697229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      /* Map dest texture buffer (write to whole region) */
4698229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      ctx->Driver.MapTextureImage(ctx, texImage, 0,
4699229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  0, 0, width, height,
4700229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  rwMode,
4701229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt                                  &dstMap, &dstRowStride);
47021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      if (dstMap) {
47031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
47041ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  texImage->TexFormat,
47051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  0, 0, 0,  /* dstX/Y/Zoffset */
47061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  dstRowStride,
47071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  &dstMap,
47081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  width, height, 1,
47091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                                  format, type, pixels, packing);
4710229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
47111ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
47121ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
47131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      else {
47141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         success = GL_FALSE;
47151ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
4716229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   }
471781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
471881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
471981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
4720f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
472171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
47228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
47238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
47266b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
47271da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage3D().
47286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
47298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
47308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4731f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
47328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
47338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint depth, GLint border,
47348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
47358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
47368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
47378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
47388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
473981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
47401ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   GLboolean success = GL_TRUE;
474181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint slice;
474281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte **sliceMaps;
474381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
474481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4745a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
47468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4747b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt   if (width == 0 || height == 0 || depth == 0)
4748b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4749b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
475078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
475178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
475278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, depth)) {
475378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
47547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
47557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
47568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
475781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth,
475881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                        format, type,
475981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                        pixels, packing, "glTexImage3D");
47606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
47616b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
47626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
47636b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
476489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
47656b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
476681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4767229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   if (target == GL_TEXTURE_1D_ARRAY) {
4768229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      depth = height;
4769229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt      height = 1;
4770229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt   }
4771229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt
47721ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   sliceMaps = (GLubyte **) calloc(depth, sizeof(GLubyte *));
477381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
477481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer slices */
477581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
477681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage, slice,
477781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  0, 0, width, height,
477881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  rwMode,
477981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  &sliceMaps[slice], &dstRowStride);
47801ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      if (!sliceMaps[slice]) {
47811ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         success = GL_FALSE;
47821ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         break;
47831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
478481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
478581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
47861ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (success) {
47871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
47881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               texImage->TexFormat,
47891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, 0, 0,  /* dstX/Y/Zoffset */
47901ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               dstRowStride,
47911ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               sliceMaps,
47921ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               width, height, depth,
47931ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               format, type, pixels, packing);
47941ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
479581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
479681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Unmap dest texture buffer slices */
479781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
47981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      if (sliceMaps[slice]) {
47991ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         ctx->Driver.UnmapTextureImage(ctx, texImage, slice);
48001ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
4801f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
4802f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
480381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
480481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
480581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
480671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
480781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
480881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(sliceMaps);
48098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
48108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
481589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D()
481689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D().
48178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
48188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4819f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level,
48208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint width,
48218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
48228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
48238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
48248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
48258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
482681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
482781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
482881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
482981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
483081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4831b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4832e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
4833e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage1D");
48347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
48357a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
48367a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
483706913497d6b17f454bf4c5b8601d391980eb8265Brian Paul   /* Map dest texture buffer */
483881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
483981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, 0, width, 1,
484081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
484181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
484281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
48431ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
48441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
48451ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               texImage->TexFormat,
48461ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, 0, 0,  /* dstX/Y/Zoffset */
48471ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               dstRowStride,
48481ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               &dstMap,
48491ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               width, 1, 1,
48501ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               format, type, pixels, packing);
485181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
48521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
48531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
48541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
48551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = GL_FALSE;
48561ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
485781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
485881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
485981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
48603893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
486171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
48628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
48638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
48648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
486589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
486789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D()
486889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D().
48698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
48708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4871f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level,
48728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset,
48738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height,
48748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
48758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
48768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
48778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
48788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
487981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
488081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
488181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
488281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLboolean success;
488381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
488571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
4886e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage2D");
48877a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
48887a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
48897a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
489006913497d6b17f454bf4c5b8601d391980eb8265Brian Paul   /* Map dest texture buffer */
489181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
489281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
489381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               rwMode,
489481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
489581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
48961ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
48971ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
48981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               texImage->TexFormat,
48991ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, 0, 0,  /* dstX/Y/Zoffset */
49001ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               dstRowStride,
49011ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               &dstMap,
49021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               width, height, 1,
49031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               format, type, pixels, packing);
490481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
49051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
49061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
49071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
49081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = GL_FALSE;
49091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
491081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
491181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
491281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
49133893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
491471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
49158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
49168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
49198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D().
492089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D().
49218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
49228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4923f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level,
49248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset, GLint zoffset,
49258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height, GLint depth,
49268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
49278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
49288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
49298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
49308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
493181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat);
49321ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   GLboolean success = GL_TRUE;
493381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint slice;
493481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte **sliceMaps;
493581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint dstRowStride;
493681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
4937b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4938e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
4939e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing,
4940e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        "glTexSubImage3D");
4941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!pixels)
4942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return;
4943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
49441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   sliceMaps = (GLubyte **) calloc(depth, sizeof(GLubyte *));
494581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
494681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Map dest texture buffer slices */
494781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
494881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice,
494981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  xoffset, yoffset, width, height,
495081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                                  rwMode,
49515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                  &sliceMaps[slice], &dstRowStride);
49521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      if (!sliceMaps[slice]) {
49531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         success = GL_FALSE;
49541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         break;
49551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
495681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   }
495781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
49581ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (success) {
49591ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
49601ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               texImage->TexFormat,
49611ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               0, 0, 0,
49621ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               dstRowStride,
49631ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               sliceMaps,
49641ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               width, height, depth,
49651ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul                               format, type, pixels, packing);
49661ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
496781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
496881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   /* Unmap dest texture buffer slices */
496981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   for (slice = 0; slice < depth; slice++) {
49701ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      if (sliceMaps[slice]) {
49711ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + slice);
49721ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
4973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
49748f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
497581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if (!success)
497681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
497781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
497871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
497981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
498081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   free(sliceMaps);
49818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
49828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
49842aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/*
49858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D()
49868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
49878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
498878527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx,
498978527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
49908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
49918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint border,
49928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
49938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
49948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
49958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
499689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
4997a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
4998a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
4999a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
5000a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) border;
5001a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5002a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5003a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
50048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
50058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
5008b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
50098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D()
50108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
50118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
501278527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx,
501378527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
50148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
50158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint border,
50168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
50178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
50188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
50198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
5020bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt   /* This is pretty simple, because unlike the general texstore path we don't
5021bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * have to worry about the usual image unpacking or image transfer
5022bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * operations.
50238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
502489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texObj);
502589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
502689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
502789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
502889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
502989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
503078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
503178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
503278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul                                            width, height, 1)) {
503378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
503489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
503589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
503689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5037bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt   _mesa_store_compressed_texsubimage2d(ctx, target, level,
5038bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					0, 0,
5039bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					width, height,
5040bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					texImage->TexFormat,
5041bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					imageSize, data,
5042bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt					texObj, texImage);
50438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
50448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
50488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D()
50498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
50508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
505178527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx,
505278527154bd8693c0956ff78c369222d37c5668e7Brian Paul                                  GLenum target, GLint level,
50538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
50548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint depth,
50558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint border,
50568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
50578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
50588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
50598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
506089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
5061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5062a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5063a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
5064a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
5065a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
5066a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5067a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5068a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
50698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
50708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
50728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
507389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
507489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D()
5075e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
5076e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
5077f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target,
507889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
507989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLsizei width,
508089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
508189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
508289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
508389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
5084e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{
50855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 1D texture formats yet */
5086a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5087a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5088a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) width;
5089a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
5090a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5091a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5092a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
5093e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul}
5094e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
5095e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
509689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
509789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D()
509889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
509989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
5100f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target,
510189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
510289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLint yoffset,
510389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei width, GLsizei height,
510489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
510589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
510689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
510789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
510889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
510981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint bytesPerRow, dstRowStride, srcRowStride;
511089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
511181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
511289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
51131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
5114d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
51155999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
5116d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
51175999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
511889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* these should have been caught sooner */
5119079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt   ASSERT((width % bw) == 0 || width < bw);
5120079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt   ASSERT((height % bh) == 0 || height < bh);
5121d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((xoffset % bw) == 0);
5122d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((yoffset % bh) == 0);
512389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5124b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
5125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
5126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
5127e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
51287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
51297a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
51307a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
51312594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
513289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
513389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
513406913497d6b17f454bf4c5b8601d391980eb8265Brian Paul   /* Map dest texture buffer */
513581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
513681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
513781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               GL_MAP_WRITE_BIT,
513881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
513989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
51401ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
51411ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      bytesPerRow = srcRowStride;  /* bytes per row of blocks */
51421e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt      rows = (height + bh - 1) / bh;  /* rows in blocks */
514389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
51441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      /* copy rows of blocks */
51451ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      for (i = 0; i < rows; i++) {
51461ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         memcpy(dstMap, src, bytesPerRow);
51471ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         dstMap += dstRowStride;
51481ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         src += srcRowStride;
51491ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
51508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
51511ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
51521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
51531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
51541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
51551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
515681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
515771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
515889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
515989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
516089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
516189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
516289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D()
516389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
516489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
5165f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target,
516689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint level,
516789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint xoffset, GLint yoffset, GLint zoffset,
516889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei width, GLsizei height, GLsizei depth,
516989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLenum format,
517089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei imageSize, const GLvoid *data,
517189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_object *texObj,
517289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_image *texImage)
517389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
51745999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 3D texture formats yet */
5175a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
5176a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
5177a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) yoffset; (void) zoffset;
5178a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
5179a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
5180a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
5181a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
5182a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
518389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
5184