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:
40ac14f569fef6a8d92c14cd02d51c09bab53c5e45Brian Paul *   ctx->Driver.TexImage = _mesa_store_teximage;
41ac14f569fef6a8d92c14cd02d51c09bab53c5e45Brian Paul *   ctx->Driver.TexSubImage = _mesa_store_texsubimage;
4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   etc...
4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated.  We have to do:
4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    Format/type conversions
4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    pixel unpacking
47a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt *    pixel transfer (scale, bais, lookup, etc)
4889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full
5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images.
5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
543c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h"
557a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
56e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h"
574c7e44e8e6fd1f441a97016d8bcc67133149e15eBrian Paul#include "format_pack.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"
74749c9060aca85277c388377d15fd6323ba20b78eJordan Justen#include "glformats.h"
751271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
76631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
78248200737398a7d6403a23930a6c9d93db06b942Brian Paul
79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
81fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
82fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
8371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
84248200737398a7d6403a23930a6c9d93db06b942Brian Paul
85248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
90e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
91e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
92248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
93248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
94248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
95248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
96248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
10371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
10471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
1115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG:
11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
11671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
11771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
126fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
1335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   IDX_RG,
134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
136fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
142fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1432e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
149fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
155fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
161fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
167fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
173fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
178fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
179fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   {
2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      IDX_RG,
2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP4(0, 1, ZERO, ONE),
2245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      MAP2(0, 1)
2255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   },
226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
229fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
233248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
234248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
241fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
242fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
2495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   case GL_RG: return IDX_RG;
250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
255fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
262fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
263fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
269248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
270248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
271248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
272248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2742e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2816b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[0],
286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[1],
287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[2],
288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[3],
289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[4],
290298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  map[5]);
2916b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
30039de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
318e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat *
319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum logicalBaseFormat,
321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum textureBaseFormat,
322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLenum srcFormat, GLenum srcType,
324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const GLvoid *srcAddr,
325e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    const struct gl_pixelstore_attrib *srcPacking,
326e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie			    GLbitfield transferOps)
327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint components = _mesa_components_in_format(logicalBaseFormat);
330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   const GLint srcStride =
331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
332a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLfloat *dst;
333a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   GLint img, row;
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
3395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
3405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
3495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
3505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				  * components * sizeof(GLfloat));
359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   if (!tempImage)
360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      return NULL;
361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   dst = tempImage;
363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt   for (img = 0; img < srcDepth; img++) {
364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      const GLubyte *src
365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcWidth, srcHeight,
367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 srcFormat, srcType,
368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt						 img, 0, 0);
369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt      for (row = 0; row < srcHeight; row++) {
370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       dst, srcFormat, srcType, src,
372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt				       srcPacking, transferOps);
373a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 dst += srcWidth * components;
374a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt	 src += srcStride;
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
3843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
38713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
38813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
39532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
39832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
41832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values.  Used for unsigned
428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures.
429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */
430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint *
431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims,
432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum logicalBaseFormat,
433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum textureBaseFormat,
434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     GLenum srcFormat, GLenum srcType,
436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const GLvoid *srcAddr,
437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                     const struct gl_pixelstore_attrib *srcPacking)
438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{
439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *tempImage;
440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   const GLint srcStride =
442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLuint *dst;
444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   GLint img, row;
445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(dims >= 1 && dims <= 3);
447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RGB ||
450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RG ||
451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_RED ||
452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_INTENSITY ||
455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          logicalBaseFormat == GL_ALPHA);
456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RGB ||
459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RG ||
460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_RED ||
461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
462dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_LUMINANCE ||
46338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          textureBaseFormat == GL_INTENSITY ||
464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul          textureBaseFormat == GL_ALPHA);
465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                 * components * sizeof(GLuint));
468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (!tempImage)
469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      return NULL;
470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   dst = tempImage;
472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   for (img = 0; img < srcDepth; img++) {
473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLubyte *src
474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcWidth, srcHeight,
476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 srcFormat, srcType,
477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul						 img, 0, 0);
478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (row = 0; row < srcHeight; row++) {
479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      dst, srcFormat, srcType, src,
481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                      srcPacking);
482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 dst += srcWidth * components;
483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul	 src += srcStride;
484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* more work */
489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLuint *newImage;
492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLint i, n;
493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      GLubyte map[6];
494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      /* The actual texture format should have at least as many components
500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       * as the logical texture format.
501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul       */
502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      ASSERT(texComponents >= logComponents);
503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                                   * texComponents * sizeof(GLuint));
506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      if (!newImage) {
507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         free(tempImage);
508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         return NULL;
509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      n = srcWidth * srcHeight * srcDepth;
514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      for (i = 0; i < n; i++) {
515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         GLint k;
516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         for (k = 0; k < texComponents; k++) {
517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            GLint j = map[k];
518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            if (j == ZERO)
519a240c998ac649d79f423bb0c445993132cd56f97Brian Paul               newImage[i * texComponents + k] = 0;
520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else if (j == ONE)
521a240c998ac649d79f423bb0c445993132cd56f97Brian Paul               newImage[i * texComponents + k] = 1;
522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul            else
523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         }
525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      }
526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      free(tempImage);
528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      tempImage = newImage;
529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   }
530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul   return tempImage;
532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul}
533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
534dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
535dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul
536dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/**
537663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components.
538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
54139de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures.  So, we might
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte.
558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
559663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte *
560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum logicalBaseFormat,
562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum textureBaseFormat,
563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLint srcWidth, GLint srcHeight, GLint srcDepth,
564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            GLenum srcFormat, GLenum srcType,
565663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const GLvoid *srcAddr,
566663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                            const struct gl_pixelstore_attrib *srcPacking)
567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
571663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   GLubyte *tempImage, *dst;
572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
5775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RG ||
5785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          logicalBaseFormat == GL_RED ||
579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
5865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RG ||
5875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          textureBaseFormat == GL_RED ||
588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul   tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
595663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                       * components * sizeof(GLubyte));
59696128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
59896128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
6068c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
6078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
6088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
610e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
611e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       srcFormat, srcType, src, srcPacking,
612e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                                       transferOps);
613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
622663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      GLubyte *newImage;
623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
6243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
62813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
635663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
636663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                         * texComponents * sizeof(GLubyte));
637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
63832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(tempImage);
639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
6423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
652663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               newImage[i * texComponents + k] = 255;
653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
65832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(tempImage);
659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
666c039af165d5919008c6df599795951f85dea164dBrian Paul/**
667c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
671c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
672248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
673248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
674248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
675c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
676c039af165d5919008c6df599795951f85dea164dBrian Paul */
677c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
678c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
679c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
68071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
701501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
702248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
70671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
709501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
71171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
726501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
72971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
744501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
74771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
762501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
76471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
7653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
780501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
7823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
784501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
78571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
786501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
78871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
78946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
790501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
792bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
79346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
79439de9251c4770fdcce3395643003aa626178446dBrian Paul
79539de9251c4770fdcce3395643003aa626178446dBrian Paul/**
79639de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
79739de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness.
798bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
79946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
800bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
80246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
803c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
80446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
80546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
806bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
807df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
808bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
809df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
81446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
81539de9251c4770fdcce3395643003aa626178446dBrian Paul
81639de9251c4770fdcce3395643003aa626178446dBrian Paul/**
81739de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
81839de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state.
81946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
822bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
82346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
824bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
825bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
826bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
828c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
83846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
84046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
841c039af165d5919008c6df599795951f85dea164dBrian Paul/**
842c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
843c039af165d5919008c6df599795951f85dea164dBrian Paul */
84471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
845f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx,
84671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
84771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
84846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
84946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
8510c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
85246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
8530c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
8565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                          GLubyte **dstSlices,
85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
86271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
863bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
8643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
86571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
866c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
867c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
868c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
869c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
870c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
871c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
872c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
873c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
874c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
875c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
87671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
878edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
8820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
8843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
886bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
88746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
88971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
890bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
89171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
892298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
8932e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
895b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
8969c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
899d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLubyte *dstImage = dstSlices[0];
90071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
907d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
90871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
90971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
91071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
91171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         srcImage += srcImageStride;
91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
920f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do.
921f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed.
922f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported.
923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void
925f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx,
92617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
9271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
928b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
9295253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul               GLubyte **dstSlices,
930f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
93960909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
94060909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
9411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
94222108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
943b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
9455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul       dstRowStride == bytesPerRow) {
9465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy image by image */
9475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      GLint img;
9485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      for (img = 0; img < srcDepth; img++) {
949d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstImage = dstSlices[img];
9505acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul         memcpy(dstImage, srcImage, bytesPerRow * srcHeight);
9515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul         srcImage += srcImageStride;
9525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      }
953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
9545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   else {
9555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul      /* memcpy row by row */
956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
959d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
9615acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul            memcpy(dstRow, srcRow, bytesPerRow);
962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
9716e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul/**
9726e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * General-case function for storing a color texture images with
9736e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * components that can be represented with ubytes.  Example destination
9746e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565.
9756e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul */
9766e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstatic GLboolean
9776e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstore_ubyte_texture(TEXSTORE_PARAMS)
9786e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul{
9796e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte);
9806e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   GLubyte *tempImage, *src;
9816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   GLint img;
9826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
9836e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
9846e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           baseInternalFormat,
9856e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           GL_RGBA,
9866e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcWidth, srcHeight, srcDepth,
9876e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcFormat, srcType, srcAddr,
9886e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                           srcPacking);
9896e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   if (!tempImage)
9906e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return GL_FALSE;
9916e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
9926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   src = tempImage;
9936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   for (img = 0; img < srcDepth; img++) {
9946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight,
9956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 src, srcRowStride,
9966e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstSlices[img], dstRowStride);
9976e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      src += srcHeight * srcRowStride;
9986e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   }
9996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   free(tempImage);
10006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul   return GL_TRUE;
10026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul}
10036e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10046e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
10056e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul
1006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1008bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image.
1009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
101049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1011b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
101325cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
1014755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   GLenum dstType;
1015a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1016bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32 ||
1017bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák          dstFormat == MESA_FORMAT_Z32_FLOAT);
101844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLuint));
1019f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1020755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   if (dstFormat == MESA_FORMAT_Z32)
1021755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_UNSIGNED_INT;
1022755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt   else
1023755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt      dstType = GL_FLOAT;
1024755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt
1025966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1026966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1028a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1029a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1030bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák       srcType == dstType) {
1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
103217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1033d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
10345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1036f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1042d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1043f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
104460909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1047bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák                                    dstType, dstRow,
1048a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
1060e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
1061e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1063e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
1064e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1065a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1066e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1068e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
1069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1071f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1072d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
107460909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10761ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1077a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1078a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1086e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1087f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   (void) dims;
1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   {
1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      /* general path */
1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      GLint img, row;
1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      for (img = 0; img < srcDepth; img++) {
1102d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1119c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1120c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1121c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1122a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
112449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1125b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
112725cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
1128a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
11291f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
113044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLushort));
1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1132966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1133966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1137a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
113917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1140d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
11415253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
11471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1149d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
115160909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1153a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
11541ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1155a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1166defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
116849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1169b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
11711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
11721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
117344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1176a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1177f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1178f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
118017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1181d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
11825253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1183f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1186a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1187a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1188a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1190a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1192a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
11938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
11948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
119660909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1197a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
1198d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLubyte *dst = dstSlices[0];
1199a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1201a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1202a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1203defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
12041f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1205f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1206f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1207f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1208f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1209f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1210f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1211f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1212f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1213f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1214f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1215defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1216a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1218a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1219a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
12216e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
12226e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
12236e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
12246e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
123349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1234b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1236184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
123771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
12381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
1239d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBA8888_REV ||
1240d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888 ||
1241d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu          dstFormat == MESA_FORMAT_RGBX8888_REV);
124244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
12452e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
1246b27792335e284bcddcbcfa807e5152feff330f58Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1247b27792335e284bcddcbcfa807e5152feff330f58Brian Paul                                            srcPacking->SwapBytes)) {
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
124917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1250d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
12515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
125571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
125646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
125746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
125846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1259528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
126071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
126146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
126271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
126371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1264528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
126571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
1266d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 ||
1267d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu                            dstFormat == MESA_FORMAT_RGBX8888)) ||
1268d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	  (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV ||
1269d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu	                     dstFormat == MESA_FORMAT_RGBX8888_REV))) {
127046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
127146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
127246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
127346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
127446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
127546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
127646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
127746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
127846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
127946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
128046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
128171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
128271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
128371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
128446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1285528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
128671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
12875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
128871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
128971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
129071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
12926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
12936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
12946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
12956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1296a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1297a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1298a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1299a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1300a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
130149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1302b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1304184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
1305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
13061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
130774d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
13082d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888 ||
13092d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer          dstFormat == MESA_FORMAT_XRGB8888_REV );
131044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1313a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1314b27792335e284bcddcbcfa807e5152feff330f58Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1315b27792335e284bcddcbcfa807e5152feff330f58Brian Paul                                            srcPacking->SwapBytes)) {
1316defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
131717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1318d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
13195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1320a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1321a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1322a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
132371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
132471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
132574d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
132674d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
13280c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
13290c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
133071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
133171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
13338c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13348c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
133571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
133671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1337d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
133871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1339259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
134124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
134224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
134324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
134424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
134571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
134971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
135071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
13530df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            dstFormat == MESA_FORMAT_ARGB8888 &&
13540df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            srcFormat == GL_LUMINANCE_ALPHA &&
13550df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            baseInternalFormat == GL_RGBA &&
13560df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            srcType == GL_UNSIGNED_BYTE) {
13570df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul      /* special case of storing LA -> ARGB8888 */
13580df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul      int img, row, col;
13590df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul      const GLint srcRowStride =
13600df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
13610df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul      for (img = 0; img < srcDepth; img++) {
13620df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul         const GLubyte *srcRow = (const GLubyte *)
13630df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            _mesa_image_address(dims, srcPacking, srcAddr, srcWidth,
13640df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul                                srcHeight, srcFormat, srcType, img, 0, 0);
13650df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul         GLubyte *dstRow = dstSlices[img];
13660df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul         for (row = 0; row < srcHeight; row++) {
13670df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            GLuint *d4 = (GLuint *) dstRow;
13680df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            for (col = 0; col < srcWidth; col++) {
13690df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul               GLubyte l = srcRow[col * 2 + 0], a = srcRow[col * 2 + 1];
13700df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul               d4[col] = PACK_COLOR_8888(a, l, l, l);
13710df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            }
13720df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            dstRow += dstRowStride;
13730df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            srcRow += srcRowStride;
13740df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul         }
13750df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul      }
13760df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul   }
13770df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul   else if (!ctx->_ImageTransferState &&
13780df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul            !srcPacking->SwapBytes &&
13791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
138071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
13810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
138224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1383259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1384b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
13928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
13938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1396d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1398259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
140024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
140124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
140224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
140324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
140471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
140571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
140671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
140771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
140871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
140971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
141071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
141146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
141246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
141346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
14140c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
141571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
141771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
141871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
14190c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
142071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
14211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
142274d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
14232d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
14242d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
142546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
142646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
142746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
142846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
142946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
143046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
14311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
143274d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
14332d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
143474d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
143546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
143646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
143746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
143846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
143946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
144071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
144271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
144346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
14440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
1446b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
14475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                                dstSlices,
144871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
144971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
145071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
14526e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
14536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
14546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
14556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1457a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1458a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1459a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
146149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1462b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1463f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
14641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
146544c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1469f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1470f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
147217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1473d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
14745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1482a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1483b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
14858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
148760909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
148860909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1489d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
15013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
15023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
15033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
15043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
15053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
15073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
15093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1510167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
15113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1512167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
15133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
15143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
15163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
15173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
15183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
15193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
15205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
15213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
15223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
15233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
15256e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
15266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
15276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
15286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
153449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1535b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1536a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
15371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
153844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1541a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1542f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1543f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
154517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1546d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
15475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1548a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1549a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1550a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1551a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1552a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1553a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1554a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1557a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
15588c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
15598c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
156060909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
156160909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1562d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1564a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1569a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1570a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1572a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
15743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
15753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
15763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
15773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
15783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
15803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
15823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1583167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
15843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1585167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
15863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
15873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
15883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
15893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
15903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
15913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
15923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
15935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
15943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
15953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
15963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1597a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
15986e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
15996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1602a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1603a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
160749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1608b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
16101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
16111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
161244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1616f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1617f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul                                            srcPacking->SwapBytes)) {
1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
161917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1620d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
16266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16296e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1630a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1631a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1632a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1633a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
163449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1635dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1636dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
16371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
163844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1640dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1641dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1642453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1643453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1644dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1645dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
1646d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1648dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1649dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1650dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1651dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
16526e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1656dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1657dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1658dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1659defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
166049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
16631f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
16641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
166544c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1667f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1669453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1670453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
167217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1673d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
16745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1675f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1678f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
16796e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
16806e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
16816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
16826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
1683a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1684a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1685a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1686a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1687f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1688621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean
1689621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
1690621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{
1691621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1692621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1693621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
169444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1695621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1696621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   if (!ctx->_ImageTransferState &&
1697453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       baseInternalFormat == GL_RGBA &&
1698453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1699453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul                                            srcPacking->SwapBytes)) {
1700621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* simple memcpy path */
1701621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      memcpy_texture(ctx, dims,
1702d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
17035253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1704621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1705621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                     srcAddr, srcPacking);
1706621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
1707621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   else {
1708621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      /* general path */
1709e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
1710621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseInternalFormat,
1711621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 baseFormat,
1712621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
1713621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                                                 srcFormat, srcType, srcAddr,
171450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 srcPacking,
171550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                                                 ctx->_ImageTransferState);
171650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák      const GLfloat *src = tempImage;
1717621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      GLint img, row, col;
1718621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      if (!tempImage)
1719621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         return GL_FALSE;
1720621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      for (img = 0; img < srcDepth; img++) {
1721d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1722621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         if (baseInternalFormat == GL_RGBA) {
1723621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
172450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
1725621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
172650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort a,r,g,b;
172750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
172850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
172950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
173050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
173150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
173250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
1733621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
1734621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
1735621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
1736621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
1737621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else if (baseInternalFormat == GL_RGB) {
1738621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            for (row = 0; row < srcHeight; row++) {
173950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák               GLuint *dstUI = (GLuint *) dstRow;
1740621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               for (col = 0; col < srcWidth; col++) {
174150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  GLushort r,g,b;
174250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák
174350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
174450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
174550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
174650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
1747621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák                  src += 4;
1748621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               }
1749621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák               dstRow += dstRowStride;
1750621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            }
1751621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         } else {
1752621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák            ASSERT(0);
1753621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák         }
1754621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      }
1755621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák      free((void *) tempImage);
1756621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   }
1757621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák   return GL_TRUE;
1758621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák}
1759621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
1760621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák
176139de9251c4770fdcce3395643003aa626178446dBrian Paul/**
1762bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
1763bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */
1764bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean
1765bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS)
1766bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{
1767bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1768bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1769bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_AL44);
177044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
1771bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1772bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   {
1773bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      /* general path */
1774663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1775bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseInternalFormat,
1776bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 baseFormat,
1777bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
1778bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcFormat, srcType, srcAddr,
1779bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák                                                 srcPacking);
1780663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1781bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      GLint img, row, col;
1782bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      if (!tempImage)
1783bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         return GL_FALSE;
1784bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      for (img = 0; img < srcDepth; img++) {
1785d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1786bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         for (row = 0; row < srcHeight; row++) {
1787bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            GLubyte *dstUS = (GLubyte *) dstRow;
1788bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            for (col = 0; col < srcWidth; col++) {
1789bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               /* src[0] is luminance, src[1] is alpha */
1790663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstUS[col] = PACK_COLOR_44( src[1],
1791663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                           src[0] );
1792bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák               src += 2;
1793bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            }
1794bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák            dstRow += dstRowStride;
1795bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák         }
1796bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      }
1797bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák      free((void *) tempImage);
1798bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   }
1799bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák   return GL_TRUE;
1800bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák}
1801bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1802bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák
1803bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/**
180439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
180539de9251c4770fdcce3395643003aa626178446dBrian Paul */
180649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
18075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS)
1808f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1809184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
18101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
18121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
18135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL88_REV ||
18140a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul          dstFormat == MESA_FORMAT_GR88 ||
1815b4aecc4e1861e60e40e14868719219084967e46dBrian Paul          dstFormat == MESA_FORMAT_RG88);
181644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1817f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1818f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1819f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1820e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL88 &&
1821e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1822e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
18230a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul        (dstFormat == MESA_FORMAT_GR88 &&
1824e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
1825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1826f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
182817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
1829d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
18305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
1831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
18343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
1835bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
18363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
18373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
18383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
18393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
18403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
18423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
18435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
18445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
18455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
18465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
18475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 3;
18485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
18505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 3;
18515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
18525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
18543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
18550a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul	 if ((littleEndian && dstFormat == MESA_FORMAT_GR88) ||
1856b4aecc4e1861e60e40e14868719219084967e46dBrian Paul	     (!littleEndian && dstFormat == MESA_FORMAT_RG88)) {
18575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 0;
18585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 1;
18595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 else {
18615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[0] = 1;
18625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    dstmap[1] = 0;
18635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 }
18643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
18653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
18663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
18673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
18693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
18703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
18713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
18723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
18735253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
18743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
18753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
18763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1879663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
188122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1885663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1890d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
18935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL88 ||
18940a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul		dstFormat == MESA_FORMAT_GR88) {
1895f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1896ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1897663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88( src[1],
1898663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                             src[0] );
1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1904ae70caf7eb708351ee93b35926142e503be79d39Brian Paul                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1905663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( src[1],
1906663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul                                                 src[0] );
1907f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1909a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
191332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
1914a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1916a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1917a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1918a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
191939de9251c4770fdcce3395643003aa626178446dBrian Paul/**
192039de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
192139de9251c4770fdcce3395643003aa626178446dBrian Paul */
192249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
19235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
19243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{
19253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLboolean littleEndian = _mesa_little_endian();
19263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
19273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
19295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_AL1616_REV ||
19305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	  dstFormat == MESA_FORMAT_RG1616 ||
19315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_RG1616_REV);
193244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
19333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19343325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   if (!ctx->_ImageTransferState &&
19353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       !srcPacking->SwapBytes &&
1936e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede       ((dstFormat == MESA_FORMAT_AL1616 &&
1937e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1938e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         srcFormat == GL_LUMINANCE_ALPHA) ||
1939e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede        (dstFormat == MESA_FORMAT_RG1616 &&
1940e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede         baseInternalFormat == srcFormat)) &&
19413325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       srcType == GL_UNSIGNED_SHORT &&
19423325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick       littleEndian) {
19433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* simple memcpy path */
19443325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      memcpy_texture(ctx, dims,
1945d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
19465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
19473325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
19483325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                     srcAddr, srcPacking);
19493325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
19503325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   else {
19513325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      /* general path */
1952e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
19533325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseInternalFormat,
19543325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 baseFormat,
19553325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcWidth, srcHeight, srcDepth,
19563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick                                                 srcFormat, srcType, srcAddr,
1957bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
1958bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
19593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      const GLfloat *src = tempImage;
19603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      GLint img, row, col;
19613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      if (!tempImage)
19623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         return GL_FALSE;
19633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      for (img = 0; img < srcDepth; img++) {
1964d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
19653325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         for (row = 0; row < srcHeight; row++) {
19663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            GLuint *dstUI = (GLuint *) dstRow;
19675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            if (dstFormat == MESA_FORMAT_AL1616 ||
19685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick		dstFormat == MESA_FORMAT_RG1616) {
19693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
1970db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
1971db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
1972db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1973db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1974db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616(a, l);
1975db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
19763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
19773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
19783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            else {
19793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               for (col = 0; col < srcWidth; col++) {
1980db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  GLushort l, a;
1981db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt
1982db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1983db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1984db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
1985db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt		  src += 2;
19863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick               }
19873325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            }
19883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick            dstRow += dstRowStride;
19893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick         }
19903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick      }
199132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
19923325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   }
19933325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick   return GL_TRUE;
19943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick}
19953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
19963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick
1997fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */
19983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean
1999eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS)
20005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{
20015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLboolean littleEndian = _mesa_little_endian();
20025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
20035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
2004eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_R16 ||
2005bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák          dstFormat == MESA_FORMAT_A16 ||
2006fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_L16 ||
2007fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák          dstFormat == MESA_FORMAT_I16);
200844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
20095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   if (!ctx->_ImageTransferState &&
20115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       !srcPacking->SwapBytes &&
2012eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák       baseInternalFormat == srcFormat &&
20135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       srcType == GL_UNSIGNED_SHORT &&
20145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick       littleEndian) {
20155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* simple memcpy path */
20165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      memcpy_texture(ctx, dims,
2017d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
20185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
20195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
20205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                     srcAddr, srcPacking);
20215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
20225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   else {
20235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      /* general path */
2024e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseInternalFormat,
20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 baseFormat,
20275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcWidth, srcHeight, srcDepth,
20285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick                                                 srcFormat, srcType, srcAddr,
2029bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2030bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
20315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      const GLfloat *src = tempImage;
20325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      GLint img, row, col;
20335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      if (!tempImage)
20345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         return GL_FALSE;
20355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      for (img = 0; img < srcDepth; img++) {
2036d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
20375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         for (row = 0; row < srcHeight; row++) {
20385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            GLushort *dstUS = (GLushort *) dstRow;
20395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    for (col = 0; col < srcWidth; col++) {
20405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       GLushort r;
20415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
20435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       dstUS[col] = r;
20445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	       src += 1;
20455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    }
20465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            dstRow += dstRowStride;
20475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
20485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      }
20495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      free((void *) tempImage);
20505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   }
20515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   return GL_TRUE;
20525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick}
20535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
20555d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean
205617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
205717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{
205817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
205917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
206017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
206144c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 8);
206217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
206317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   if (!ctx->_ImageTransferState &&
206417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       !srcPacking->SwapBytes &&
206517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       baseInternalFormat == GL_RGBA &&
206617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcFormat == GL_RGBA &&
206717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul       srcType == GL_UNSIGNED_SHORT) {
206817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* simple memcpy path */
206917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      memcpy_texture(ctx, dims,
2070d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
20715253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
207217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
207317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                     srcAddr, srcPacking);
207417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
207517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   else {
207617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      /* general path */
2077e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
207817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseInternalFormat,
207917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 baseFormat,
208017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcWidth, srcHeight, srcDepth,
208117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul                                                 srcFormat, srcType, srcAddr,
2082bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2083bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
208417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      const GLfloat *src = tempImage;
208517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      GLint img, row, col;
208617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      if (!tempImage)
208717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         return GL_FALSE;
208817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      for (img = 0; img < srcDepth; img++) {
2089d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
209017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         for (row = 0; row < srcHeight; row++) {
209117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
209217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            for (col = 0; col < srcWidth; col++) {
209317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               GLushort r, g, b, a;
209417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
209517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
209617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
209717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
209817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
209917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+0] = r;
210017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+1] = g;
210117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+2] = b;
210217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               dstUS[col*4+3] = a;
210317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul               src += 4;
210417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            }
210517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul            dstRow += dstRowStride;
210617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul         }
210717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      }
210817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul      free((void *) tempImage);
210917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   }
211017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul   return GL_TRUE;
211117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul}
211217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
211317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul
211417e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean
2115279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2116279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{
2117279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2118279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2119daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2120279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2121279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2122279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   if (!ctx->_ImageTransferState &&
2123279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       !srcPacking->SwapBytes &&
2124279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       baseInternalFormat == GL_RGBA &&
2125279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2126279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcFormat == GL_RGBA &&
2127279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       srcType == GL_SHORT) {
2128279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* simple memcpy path */
2129279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      memcpy_texture(ctx, dims,
2130d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
21315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2132279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2133279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                     srcAddr, srcPacking);
2134279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2135279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   else {
2136279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* general path */
2137e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2138279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseInternalFormat,
2139279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 baseFormat,
2140279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2141279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul                                                 srcFormat, srcType, srcAddr,
2142bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2143bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2144279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLfloat *src = tempImage;
2145279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2146279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      GLint img, row, col;
2147279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2148279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      if (!tempImage)
2149279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         return GL_FALSE;
2150279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2151279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2152279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       * 3 or 4 components/pixel here.
2153279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul       */
2154279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      for (img = 0; img < srcDepth; img++) {
2155d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2156279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         for (row = 0; row < srcHeight; row++) {
2157279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            GLshort *dstRowS = (GLshort *) dstRow;
2158daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
2159daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2160daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2161daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2162daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2163daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2164daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2165daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2166daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               }
2167daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2168daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 4 * srcWidth;
2169daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            } else {
2170daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               for (col = 0; col < srcWidth; col++) {
2171daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  GLuint c;
2172daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  for (c = 0; c < comps; c++) {
2173daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     GLshort p;
2174daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
2175daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     dstRowS[col * comps + c] = p;
2176daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  }
2177279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul               }
2178daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow += dstRowStride;
2179daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 3 * srcWidth;
2180279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul            }
2181279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul         }
2182279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      }
2183279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul      free((void *) tempImage);
2184279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   }
2185279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul   return GL_TRUE;
2186279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul}
2187279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2188279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul
2189279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean
2190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
21921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
219344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
21976f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
21986f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul                                            srcPacking->SwapBytes)) {
2199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
220017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
2201d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
22025253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
22076e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul      return store_ubyte_texture(ctx, dims, baseInternalFormat,
22086e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 dstFormat, dstRowStride, dstSlices,
22096e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcWidth, srcHeight, srcDepth,
22106e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul                                 srcFormat, srcType, srcAddr, srcPacking);
2211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
221949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2220bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS)
2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
22221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
222322108bb571808542b89677752d62d3901698265fBrian Paul
22241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
22251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
22265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_I8 ||
22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick          dstFormat == MESA_FORMAT_R8);
222844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2232f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2234f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
223517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
2236d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
22375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2240f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
22491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
22503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
22513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
22533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
22543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
22563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
22573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
22583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
22603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
22613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
22623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
22633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
22645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
22653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
22663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
22673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2270663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
227222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2276663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul      const GLubyte *src = tempImage;
2277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2281d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2284663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul               dstRow[col] = src[col];
2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
229032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
22981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
230049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2301b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2303184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
230422108bb571808542b89677752d62d3901698265fBrian Paul
2305a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
23071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
23081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
230944c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
231717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
2318d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                  dstFormat,
23195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                  dstRowStride, dstSlices,
2320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
23271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2331d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2333b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2334b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
234149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2342114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2343114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2344114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
23451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2346114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
23471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
234822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2349114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2350114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2351114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2352114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2353114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2354114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2355114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2356114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2357114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
2358d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
23595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2360114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2361114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2362114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2363114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2364114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2365114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2366114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2367114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2368114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2369114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2370114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2371114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2372114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2373114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2374114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2375114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2376114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2377114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2378114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2379114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2380114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2381114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2382114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2383114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
23845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul				dstRowStride, dstSlices,
2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2388114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2390114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
23918c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
23928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2394114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
239632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2400114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2401114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2402114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2403114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2404114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2405114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2406114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2407114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2408114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2409114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2410114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2411114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2412114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2413114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2414114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2415114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
2416d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      dst = (GLbyte *) dstSlices[0];
2417114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
241822108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2419114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
242022108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2421114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
242232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2423114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2424114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2425114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
242784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
242884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2429daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format.
243084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
243184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2432daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS)
243384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
243484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
243584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
2437daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L8 ||
2438daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I8 ||
2439daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_R8);
244044c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
244184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2442daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2443daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2444daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2445daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE) {
2446daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2447daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2448d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
24495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2450daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2451daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2452daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2453daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
245484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2455e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
245684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
245784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
245884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
245984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2460bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2461bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2462daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
246384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
246484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
246584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
246684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2467d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
246884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
246984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2470daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
247184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
247284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
2473daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            src += srcWidth;
247484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
247584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
247684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
247784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
247884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
247984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
248084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
248184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
248284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
2483daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format.
248484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
248584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
2486daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS)
248784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
2488daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
248984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
249084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2491daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
2492daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
249344c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
249484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2495daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2496daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2497daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2498daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_BYTE &&
2499daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2500daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2501daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2502d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
25035253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2504daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2505daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2506daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2507daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
250884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2509e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
251084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
251184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
251284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
251384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2514bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2515bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
251784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
251884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
251984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
252084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2521d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
252284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2523daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
252484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
2526daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
2527daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2528daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
252984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
253084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
253184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
253284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
253384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
253484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
253584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
253684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
253784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2538daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */
2539daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2540daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS)
2541daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2542daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2543daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2544daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2545daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
2546daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_A16 ||
2547daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_L16 ||
2548daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_I16);
254944c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2550daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2551daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2552daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2558d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
25595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
2572daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
2575daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
2576daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
2577d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2578daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
2579daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dstUS = (GLshort *) dstRow;
2580daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    for (col = 0; col < srcWidth; col++) {
2581daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       GLushort r;
2582daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2583daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
2584daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       dstUS[col] = r;
2585daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	       src += 1;
2586daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák	    }
2587daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
2588daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
2589daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
2590daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
2591daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2592daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
2593daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
2594daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2595daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/**
2596daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
2597daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */
2598daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean
2599daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
2600daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{
2601daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLboolean littleEndian = _mesa_little_endian();
2602daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2603daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2604daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
2605daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák          dstFormat == MESA_FORMAT_SIGNED_GR1616);
260644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2607daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2608daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   if (!ctx->_ImageTransferState &&
2609daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       !srcPacking->SwapBytes &&
2610daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       baseInternalFormat == srcFormat &&
2611daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       srcType == GL_SHORT &&
2612daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák       littleEndian) {
2613daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* simple memcpy path */
2614daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      memcpy_texture(ctx, dims,
2615d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
26165253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2617daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2618daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                     srcAddr, srcPacking);
2619daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2620daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   else {
2621daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      /* general path */
2622daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2623daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseInternalFormat,
2624daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 baseFormat,
2625daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
2626daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcFormat, srcType, srcAddr,
2627daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 srcPacking,
2628daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                                                 ctx->_ImageTransferState);
2629daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      const GLfloat *src = tempImage;
2630daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      GLint img, row, col;
2631daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      if (!tempImage)
2632daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         return GL_FALSE;
2633daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      for (img = 0; img < srcDepth; img++) {
2634d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2635daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         for (row = 0; row < srcHeight; row++) {
2636daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLshort *dst = (GLshort *) dstRow;
2637daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            for (col = 0; col < srcWidth; col++) {
2638daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               GLushort l, a;
2639daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák
2640daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
2641daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
2642daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[0] = l;
2643daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = a;
2644daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               src += 2;
2645daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 2;
2646daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            }
2647daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            dstRow += dstRowStride;
2648daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák         }
2649daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      }
2650daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák      free((void *) tempImage);
2651daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   }
2652daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák   return GL_TRUE;
2653daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák}
265484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/**
265684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */
265884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean
265984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
266084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{
266184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
266284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
266384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
266444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   {
266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      /* general path */
2668e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseInternalFormat,
267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 baseFormat,
267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcWidth, srcHeight, srcDepth,
267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul                                                 srcFormat, srcType, srcAddr,
2673bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2674bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
267584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      const GLfloat *srcRow = tempImage;
267684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      GLint img, row, col;
267784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      if (!tempImage)
267884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         return GL_FALSE;
267984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      for (img = 0; img < srcDepth; img++) {
2680d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
268184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         for (row = 0; row < srcHeight; row++) {
2682daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
268384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            for (col = 0; col < srcWidth; col++) {
2684daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2685daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2686daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
26878778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul               dst[0] = 127;
2688daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               srcRow += 3;
2689daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák               dst += 4;
269084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            }
269184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul            dstRow += dstRowStride;
269284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul         }
269384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      }
269484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul      free((void *) tempImage);
269584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   }
269684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul   return GL_TRUE;
269784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul}
269884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
269984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
270084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2701c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
270239de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
270339de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
2704c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
270549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2706c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
2707c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
27081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2709c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
27101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
27111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
271244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2713c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2714c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
2715c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
27166f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
27176f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul                                            srcPacking->SwapBytes)) {
2718c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
2719c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
2720d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
27215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2722c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2723c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
2724c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2725c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
2726c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
2727e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2728c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
272922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2730c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
2731c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
2732bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
2733bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
2734c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
2735c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
2736c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
2737c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
2738c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
2739d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2740c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
2741daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák            GLbyte *dst = dstRow;
27421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
2743c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2744daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2745daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2746daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2747daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2748c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
2749daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
2750c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
2751c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
2752bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
2753bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2754daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2755daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2756daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2757daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2758bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
2759daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák                  dst += 4;
2760bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
2761bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
2762c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
2763c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
2764c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
276532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
2766c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2767c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
2768c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
2769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
277084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul
2771184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
2772184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
2773184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
277449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
2776184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
277792098438784887fd6005918794476cfbbeac5035Karl Schultz   const GLuint depthScale = 0xffffff;
2778c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
2779b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2780c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
278125cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
27821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
2783e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
2784e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
2785e41a91cea764cc1ba95906251cd907d837225293Marek Olšák          srcFormat == GL_STENCIL_INDEX);
2786c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2787184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2788e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f &&
2789966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
2790184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
2791ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
2792184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
2793d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
27945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
2795184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2796184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
279739de9251c4770fdcce3395643003aa626178446dBrian Paul   }
2798e41a91cea764cc1ba95906251cd907d837225293Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
2799e41a91cea764cc1ba95906251cd907d837225293Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
28002e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      GLuint *depth = (GLuint *) malloc(srcWidth * sizeof(GLuint));
28012e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
28022e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
28032e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      if (!depth || !stencil) {
28042e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul         free(depth);
28052e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul         free(stencil);
28062e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul         return GL_FALSE;
28072e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      }
28082e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
2809c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      /* In case we only upload depth we need to preserve the stencil */
2810ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
2811d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul	 GLuint *dstRow = (GLuint *) dstSlices[img];
2812b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
2813b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2814c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcWidth, srcHeight,
2815c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  srcFormat, srcType,
2816c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie                  img, 0, 0);
2817ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
2818ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
2819c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2820c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2821c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2822c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepstencil = GL_TRUE;
282339de9251c4770fdcce3395643003aa626178446dBrian Paul	    }
282439de9251c4770fdcce3395643003aa626178446dBrian Paul            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2825c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       keepdepth = GL_TRUE;
2826c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2827c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2828c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepdepth == GL_FALSE)
2829c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* the 24 depth bits will be in the low position: */
2830c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_depth_span(ctx, srcWidth,
2831c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       GL_UNSIGNED_INT, /* dst type */
2832c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       keepstencil ? depth : dstRow, /* dst addr */
2833c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       depthScale,
2834c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				       srcType, src, srcPacking);
2835c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2836c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil == GL_FALSE)
2837c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       /* get the 8-bit stencil values */
2838c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       _mesa_unpack_stencil_span(ctx, srcWidth,
2839c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 GL_UNSIGNED_BYTE, /* dst type */
2840c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 stencil, /* dst addr */
2841c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 srcType, src, srcPacking,
2842c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie					 ctx->_ImageTransferState);
2843c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2844c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    for (i = 0; i < srcWidth; i++) {
2845c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       if (keepstencil)
2846c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
2847c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       else
2848c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
2849c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    }
2850ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
2851ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
2852b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
2853ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
2854ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
28552e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
28562e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      free(depth);
28572e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      free(stencil);
2858184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
2859184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
2860184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
2861184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2862184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2863a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
2864a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
2865a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
286649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2867a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
2868a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
2869a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
2870a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
2871b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2872a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
28732e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   GLuint *depth;
28742e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   GLubyte *stencil;
2875a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
28761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
287739de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
287839de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_DEPTH_COMPONENT ||
287939de9251c4770fdcce3395643003aa626178446dBrian Paul          srcFormat == GL_STENCIL_INDEX);
288039de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
288139de9251c4770fdcce3395643003aa626178446dBrian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT);
2882c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
28832e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   depth = (GLuint *) malloc(srcWidth * sizeof(GLuint));
28842e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
28852e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
28862e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   if (!depth || !stencil) {
28872e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      free(depth);
28882e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      free(stencil);
28892e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      return GL_FALSE;
28902e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   }
28912e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
2892c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie   for (img = 0; img < srcDepth; img++) {
2893d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul      GLuint *dstRow = (GLuint *) dstSlices[img];
2894b786db06540472beda9cedd18937d6e12855b3ebBrian Paul      const GLubyte *src
2895b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2896c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcWidth, srcHeight,
2897c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						srcFormat, srcType,
2898c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie						img, 0, 0);
2899c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie      for (row = 0; row < srcHeight; row++) {
2900c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLint i;
2901c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2902c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2903c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2904c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepstencil = GL_TRUE;
290539de9251c4770fdcce3395643003aa626178446dBrian Paul	 }
290639de9251c4770fdcce3395643003aa626178446dBrian Paul         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2907c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    keepdepth = GL_TRUE;
2908c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
2909666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2910c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepdepth == GL_FALSE)
2911c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* the 24 depth bits will be in the low position: */
2912c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_depth_span(ctx, srcWidth,
2913c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    GL_UNSIGNED_INT, /* dst type */
2914c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    keepstencil ? depth : dstRow, /* dst addr */
2915c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    depthScale,
2916c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				    srcType, src, srcPacking);
2917c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2918c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 if (keepstencil == GL_FALSE)
2919c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    /* get the 8-bit stencil values */
2920c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    _mesa_unpack_stencil_span(ctx, srcWidth,
2921c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      GL_UNSIGNED_BYTE, /* dst type */
2922c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      stencil, /* dst addr */
2923c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      srcType, src, srcPacking,
2924c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie				      ctx->_ImageTransferState);
2925c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
2926c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 /* merge stencil values into depth values */
2927c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 for (i = 0; i < srcWidth; i++) {
2928c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    if (keepstencil)
2929c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
2930c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	    else
2931c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
2932666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2933c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 }
2934c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 src += srcRowStride;
2935c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie	 dstRow += dstRowStride / sizeof(GLuint);
2936a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
2937a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
29382e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
29392e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   free(depth);
29402e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul   free(stencil);
29412e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
2942a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
2943a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
2944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
294539de9251c4770fdcce3395643003aa626178446dBrian Paul
294639de9251c4770fdcce3395643003aa626178446dBrian Paul/**
294739de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data.
294839de9251c4770fdcce3395643003aa626178446dBrian Paul */
294939de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean
295039de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS)
295139de9251c4770fdcce3395643003aa626178446dBrian Paul{
295239de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8);
295339de9251c4770fdcce3395643003aa626178446dBrian Paul   ASSERT(srcFormat == GL_STENCIL_INDEX);
295439de9251c4770fdcce3395643003aa626178446dBrian Paul
295539de9251c4770fdcce3395643003aa626178446dBrian Paul   if (!ctx->_ImageTransferState &&
295639de9251c4770fdcce3395643003aa626178446dBrian Paul       !srcPacking->SwapBytes &&
295739de9251c4770fdcce3395643003aa626178446dBrian Paul       baseInternalFormat == srcFormat &&
295839de9251c4770fdcce3395643003aa626178446dBrian Paul       srcType == GL_UNSIGNED_BYTE) {
295939de9251c4770fdcce3395643003aa626178446dBrian Paul      /* simple memcpy path */
296039de9251c4770fdcce3395643003aa626178446dBrian Paul      memcpy_texture(ctx, dims,
2961d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
29625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
296339de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
296439de9251c4770fdcce3395643003aa626178446dBrian Paul                     srcAddr, srcPacking);
296539de9251c4770fdcce3395643003aa626178446dBrian Paul   }
296639de9251c4770fdcce3395643003aa626178446dBrian Paul   else {
296739de9251c4770fdcce3395643003aa626178446dBrian Paul      const GLint srcRowStride
2968b786db06540472beda9cedd18937d6e12855b3ebBrian Paul	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
296939de9251c4770fdcce3395643003aa626178446dBrian Paul      GLint img, row;
29702e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
29712e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
29722e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      if (!stencil)
29732e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul         return GL_FALSE;
29742e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul
297539de9251c4770fdcce3395643003aa626178446dBrian Paul      for (img = 0; img < srcDepth; img++) {
2976d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
2977b786db06540472beda9cedd18937d6e12855b3ebBrian Paul         const GLubyte *src
2978b786db06540472beda9cedd18937d6e12855b3ebBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
297939de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcWidth, srcHeight,
298039de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   srcFormat, srcType,
298139de9251c4770fdcce3395643003aa626178446dBrian Paul                                                   img, 0, 0);
298239de9251c4770fdcce3395643003aa626178446dBrian Paul         for (row = 0; row < srcHeight; row++) {
298339de9251c4770fdcce3395643003aa626178446dBrian Paul            GLint i;
298439de9251c4770fdcce3395643003aa626178446dBrian Paul
298539de9251c4770fdcce3395643003aa626178446dBrian Paul            /* get the 8-bit stencil values */
298639de9251c4770fdcce3395643003aa626178446dBrian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
298739de9251c4770fdcce3395643003aa626178446dBrian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
298839de9251c4770fdcce3395643003aa626178446dBrian Paul                                      stencil, /* dst addr */
298939de9251c4770fdcce3395643003aa626178446dBrian Paul                                      srcType, src, srcPacking,
299039de9251c4770fdcce3395643003aa626178446dBrian Paul                                      ctx->_ImageTransferState);
299139de9251c4770fdcce3395643003aa626178446dBrian Paul            /* merge stencil values into depth values */
299239de9251c4770fdcce3395643003aa626178446dBrian Paul            for (i = 0; i < srcWidth; i++)
299339de9251c4770fdcce3395643003aa626178446dBrian Paul               dstRow[i] = stencil[i];
299439de9251c4770fdcce3395643003aa626178446dBrian Paul
299539de9251c4770fdcce3395643003aa626178446dBrian Paul            src += srcRowStride;
299639de9251c4770fdcce3395643003aa626178446dBrian Paul            dstRow += dstRowStride / sizeof(GLubyte);
299739de9251c4770fdcce3395643003aa626178446dBrian Paul         }
299839de9251c4770fdcce3395643003aa626178446dBrian Paul      }
299939de9251c4770fdcce3395643003aa626178446dBrian Paul
30002e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul      free(stencil);
300139de9251c4770fdcce3395643003aa626178446dBrian Paul   }
300239de9251c4770fdcce3395643003aa626178446dBrian Paul
300339de9251c4770fdcce3395643003aa626178446dBrian Paul   return GL_TRUE;
300439de9251c4770fdcce3395643003aa626178446dBrian Paul}
300539de9251c4770fdcce3395643003aa626178446dBrian Paul
300639de9251c4770fdcce3395643003aa626178446dBrian Paul
3007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3008f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
3009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
3010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
3011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
3012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
3013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
3014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
3015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
301649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3017b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
3018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
30191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
302022108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
30221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
30231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
30241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
30251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
30261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
30270ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
30280ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT32 ||
30290ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT32);
3030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
30350ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
30360ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
30370ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
303844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat));
3039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3042f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
30439e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
3045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
304617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
3047d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
30485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3054e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
305622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3059bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3060bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3061b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
30629c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
3063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
30669c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3068d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3070c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dstRow, srcRow, bytesPerRow);
3071b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
3072b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
3073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
307632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3077f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3081c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie
3082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
3084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
3085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
308649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
3087b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
30891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
309022108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
30921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
30931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
30941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
30951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
30961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
30970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
30980ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_R_FLOAT16 ||
30990ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          dstFormat == MESA_FORMAT_RG_FLOAT16);
3100f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3101f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
3102f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
3103f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3104f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
31050ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_INTENSITY ||
31060ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RED ||
31070ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák          baseInternalFormat == GL_RG);
310844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB));
3109f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
3111f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
3112f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
31139e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák       baseInternalFormat == baseFormat &&
3114f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
3115f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
311617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
3117d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
31185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3119f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
3121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
3123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
3124e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3125f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
312622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
3127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
3128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
3129bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 srcPacking,
3130bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul                                                 ctx->_ImageTransferState);
3131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
3132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
3134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
3135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
3136d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3137f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
3138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
3140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
3141f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
3142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
3143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
3144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
3145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
3146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
314832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) tempImage);
3149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
3151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
3152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3153f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3154abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */
3155abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3156abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3157abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3158abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3159abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3160abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
316138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT8 ||
316238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT8 ||
316338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT8 ||
316438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT8 ||
316538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT8 ||
316638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT8 ||
316738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT8 ||
316838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8);
3169abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3170abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3171f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3172f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3173abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3174abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3175abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3176abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
317744c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte));
3178abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3179bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3180bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3181bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3182bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3183abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3184abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_BYTE) {
3185abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3186abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3187d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
31885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3189abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3190abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3191abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3192abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3193abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
31945f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
31955f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
31965f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
31975f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
31985f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
31995f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
32005f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
32015f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3202abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3203b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3204abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3205abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3206abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3207d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3208abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3209abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLbyte *dstTexel = (GLbyte *) dstRow;
3210abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3211b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3212b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3213b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLbyte) MIN2(src[i], 0x7f);
3214b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3215b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3216b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3217b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLbyte) CLAMP((GLint) src[i], -0x80, 0x7f);
3218b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3219abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3220abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3221abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3223abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3225abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3227abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3229abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3231abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */
3232abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3233abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3234abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3236abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3237abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
323838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT16 ||
323938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT16 ||
324038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT16 ||
324138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT16 ||
324238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT16 ||
324338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT16 ||
324438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT16 ||
324538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16);
3246abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3247abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3248f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3249f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3250abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3251abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3252abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3253abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
325444c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort));
3255abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3256bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3257bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3258bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3259bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3260abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
32619fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul       srcType == GL_SHORT) {
3262abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3263abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3264d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
32655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3266abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3267abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3268abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3269abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
32715f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
32725f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
32735f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
32745f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
32755f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
32765f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
32775f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
32785f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3280b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3281abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3282abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3283abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3284d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3285abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3286abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLshort *dstTexel = (GLshort *) dstRow;
3287abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3288b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3289b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3290b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLshort) MIN2(src[i], 0x7fff);
3291b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3292b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3293b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3294b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLshort)CLAMP((GLint) src[i], -0x8000, 0x7fff);
3295b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */
3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
331538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_INT32 ||
331638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_INT32 ||
331738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_INT32 ||
331838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_INT32 ||
331938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_INT32 ||
332038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_INT32 ||
332138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_INT32 ||
332238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32);
3323abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3324abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3325f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3326f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
333144c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint));
3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3333bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3334bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3335bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3336bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_INT) {
3339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3341d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
33425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
33485f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
33495f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseInternalFormat,
33505f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     baseFormat,
33515f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcWidth, srcHeight, srcDepth,
33525f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcFormat, srcType,
33535f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcAddr,
33545f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt						     srcPacking);
33555f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt      const GLuint *src = tempImage;
3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3357b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3361d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint *dstTexel = (GLint *) dstRow;
3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3365b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3366b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3367b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLint) MIN2(src[i], 0x7fffffff);
3368b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3369b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3370b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3371b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLint) src[i];
3372b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3385abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */
3386abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3387abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3388abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3389abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3390abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3391abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
339238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT8 ||
339338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT8 ||
339438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT8 ||
339538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT8 ||
339638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT8 ||
339738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT8 ||
339838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT8 ||
339938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3402f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3403f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3404abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3405abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3406abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
340844c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte));
3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3410bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3411bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3412bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3413bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_BYTE) {
3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3418d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
34195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3420abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3421abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3422abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3425dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3431b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3432abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3435d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLubyte *dstTexel = (GLubyte *) dstRow;
3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3439b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3440b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3441b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLubyte) MIN2(src[i], 0xff);
3442b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3443b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3444b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3445b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLubyte) CLAMP((GLint) src[i], 0, 0xff);
3446b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3452abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3453abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3454abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3455abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3456abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3457abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3458abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3459abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */
3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3462abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3463abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
346638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT16 ||
346738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT16 ||
346838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT16 ||
346938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT16 ||
347038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT16 ||
347138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT16 ||
347238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT16 ||
347338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3476f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3477f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3478abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3479abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
348244c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort));
3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3484bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3485bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3486bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3487bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3488abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3489abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_SHORT) {
3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3492d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
34935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3494abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3505b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3509d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLushort *dstTexel = (GLushort *) dstRow;
3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3513b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3514b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3515b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLushort) MIN2(src[i], 0xffff);
3516b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen              }
3517b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3518b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3519b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = (GLushort) CLAMP((GLint) src[i], 0, 0xffff);
3520b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3521abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3522abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3523abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3524abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3525abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3530abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3531abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3532abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3533abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */
3534abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean
3535abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3536abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
3537abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3538abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   const GLint components = _mesa_components_in_format(baseFormat);
3539abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
354038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie   ASSERT(dstFormat == MESA_FORMAT_R_UINT32 ||
354138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RG_UINT32 ||
354238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGB_UINT32 ||
354338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_RGBA_UINT32 ||
354438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_ALPHA_UINT32 ||
354538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_INTENSITY_UINT32 ||
354638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_UINT32 ||
354738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
3548abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
3549abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_RGB ||
3550f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RG ||
3551f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          baseInternalFormat == GL_RED ||
3552abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_ALPHA ||
3553abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE ||
3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul          baseInternalFormat == GL_INTENSITY);
355644c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint));
3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3558bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3559bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    * to integer formats.
3560bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul    */
3561bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul   if (!srcPacking->SwapBytes &&
3562abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       baseInternalFormat == srcFormat &&
3563abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul       srcType == GL_UNSIGNED_INT) {
3564abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* simple memcpy path */
3565abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      memcpy_texture(ctx, dims,
3566d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
35675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3568abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3569abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul                     srcAddr, srcPacking);
3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   else {
3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      /* general path */
3573dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *tempImage =
3574dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3575dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcWidth, srcHeight, srcDepth,
3576dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul                              srcFormat, srcType, srcAddr, srcPacking);
3577dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul      const GLuint *src = tempImage;
3578b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3579abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      GLint img, row;
3580abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      if (!tempImage)
3581abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         return GL_FALSE;
3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      for (img = 0; img < srcDepth; img++) {
3583d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         for (row = 0; row < srcHeight; row++) {
3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLuint *dstTexel = (GLuint *) dstRow;
3586abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            GLint i;
3587b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3588b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3589b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = src[i];
3590b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3591b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3592b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (i = 0; i < srcWidth * components; i++) {
3593b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstTexel[i] = MAX2((GLint) src[i], 0);
3594b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            }
3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            dstRow += dstRowStride;
3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            src += srcWidth * components;
3598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      }
3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      free((void *) tempImage);
3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   return GL_TRUE;
3604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
36098d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
361049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
36128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
361446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
361546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
361746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
361846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
36191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
362046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36210f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
36225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
36235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
362439de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcWidth, srcHeight, srcDepth,
362539de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcFormat, srcType,
362639de9251c4770fdcce3395643003aa626178446dBrian Paul                             srcAddr, srcPacking);
362746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36298d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
363054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
363149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36328d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
36338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
363546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
363646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
363846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
363946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
36401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
364146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
36425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
36435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
364446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
364546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
364646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
364746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36488d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36498d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
365054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
365149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36525bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
36535bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
36541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
36555bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
36565bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
36571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
36585bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
36595bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
36601f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
36615bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
36625bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
36635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               newDstFormat,
36645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                               dstRowStride, dstSlices,
36655bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
36665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
36675bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
36685bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
36695bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
36705bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
36715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
367249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36738d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
36748d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
367646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
367746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
367946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
368146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
368254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
3683bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
36845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             newDstFormat,
36855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             dstRowStride, dstSlices,
36865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcWidth, srcHeight, srcDepth,
36875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcFormat, srcType,
36885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                             srcAddr, srcPacking);
368946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
36908d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
36918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
369254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
369349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
36948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
36958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
36961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
369746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
369846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
36991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
370046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
370146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
37021f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
370346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
37045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
37055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      newDstFormat,
37065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul			      dstRowStride, dstSlices,
37075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcWidth, srcHeight, srcDepth,
37085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcFormat, srcType,
37095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick			      srcAddr, srcPacking);
371046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
37118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
37128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
37139927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
37149927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
37159927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
37169927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
37179927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
37189927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
37199927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
37209927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
37219927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
37228d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
37238d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
37249d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean
37259d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
37269d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{
37279d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
37289d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
37299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
37309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   ASSERT(baseInternalFormat == GL_RGB);
37319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
37329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   if (!ctx->_ImageTransferState &&
373307ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
373407ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
37359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* simple memcpy path */
37369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      memcpy_texture(ctx, dims,
3737d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
37385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
37399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
37409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                     srcAddr, srcPacking);
37419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
37429d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   else {
37439d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      /* general path */
37449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
37459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseInternalFormat,
37469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 baseFormat,
37479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcWidth, srcHeight, srcDepth,
37489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcFormat, srcType, srcAddr,
37499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 srcPacking,
37509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák                                                 ctx->_ImageTransferState);
37519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      const GLfloat *srcRow = tempImage;
37529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      GLint img, row, col;
37539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      if (!tempImage)
37549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         return GL_FALSE;
37559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      for (img = 0; img < srcDepth; img++) {
3756d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
37579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         for (row = 0; row < srcHeight; row++) {
37589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint *dstUI = (GLuint*)dstRow;
37599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (col = 0; col < srcWidth; col++) {
37609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]);
37619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
37629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            dstRow += dstRowStride;
37639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            srcRow += srcWidth * 3;
37649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
37659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      }
37669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák
37679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      free((void *) tempImage);
37689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   }
37699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   return GL_TRUE;
37709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák}
3771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3772631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean
3773631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
3774631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{
3775631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3776631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3777631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
3778631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   ASSERT(baseInternalFormat == GL_RGB);
3779631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3780631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   if (!ctx->_ImageTransferState &&
378107ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
378207ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
3783631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* simple memcpy path */
3784631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      memcpy_texture(ctx, dims,
3785d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
37865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3787631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3788631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                     srcAddr, srcPacking);
3789631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
3790631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   else {
3791631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      /* general path */
3792631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3793631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseInternalFormat,
3794631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 baseFormat,
3795631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcWidth, srcHeight, srcDepth,
3796631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcFormat, srcType, srcAddr,
3797631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 srcPacking,
3798631d23daa91c569bf268a2191bd466df73a64263Marek Olšák                                                 ctx->_ImageTransferState);
3799631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      const GLfloat *srcRow = tempImage;
3800631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      GLint img, row, col;
3801631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      if (!tempImage)
3802631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         return GL_FALSE;
3803631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      for (img = 0; img < srcDepth; img++) {
3804d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3805631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         for (row = 0; row < srcHeight; row++) {
3806631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint *dstUI = (GLuint*)dstRow;
3807631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (col = 0; col < srcWidth; col++) {
3808631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]);
3809631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
3810631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            dstRow += dstRowStride;
3811631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            srcRow += srcWidth * 3;
3812631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
3813631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      }
3814631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3815631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      free((void *) tempImage);
3816631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   }
3817631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   return GL_TRUE;
3818631d23daa91c569bf268a2191bd466df73a64263Marek Olšák}
3819631d23daa91c569bf268a2191bd466df73a64263Marek Olšák
3820485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3821b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean
3822b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
3823b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{
3824b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
3825b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat == GL_DEPTH_STENCIL ||
3826b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_DEPTH_COMPONENT ||
3827b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcFormat == GL_STENCIL_INDEX);
3828b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   ASSERT(srcFormat != GL_DEPTH_STENCIL ||
3829b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
3830b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3831b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   if (srcFormat == GL_DEPTH_STENCIL &&
3832b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthScale == 1.0f &&
3833b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       ctx->Pixel.DepthBias == 0.0f &&
3834b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák       !srcPacking->SwapBytes) {
3835b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* simple path */
3836b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      memcpy_texture(ctx, dims,
3837d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
38385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                     dstRowStride, dstSlices,
3839b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3840b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                     srcAddr, srcPacking);
3841b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
3842b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   else if (srcFormat == GL_DEPTH_COMPONENT ||
3843b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            srcFormat == GL_STENCIL_INDEX) {
3844b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      GLint img, row;
3845b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      const GLint srcRowStride
3846b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
3847b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         / sizeof(uint64_t);
3848b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3849b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      /* In case we only upload depth we need to preserve the stencil */
3850b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      for (img = 0; img < srcDepth; img++) {
3851d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         uint64_t *dstRow = (uint64_t *) dstSlices[img];
3852b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         const uint64_t *src
3853b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
3854b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcWidth, srcHeight,
3855b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  srcFormat, srcType,
3856b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                  img, 0, 0);
3857b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         for (row = 0; row < srcHeight; row++) {
3858b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            /* The unpack functions with:
3859b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
3860b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * only write their own dword, so the other dword (stencil
3861b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák             * or depth) is preserved. */
3862b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_STENCIL_INDEX)
3863b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_depth_span(ctx, srcWidth,
3864b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3865b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                       dstRow, /* dst addr */
3866a240c998ac649d79f423bb0c445993132cd56f97Brian Paul                                       ~0U, srcType, src, srcPacking);
3867b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3868b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            if (srcFormat != GL_DEPTH_COMPONENT)
3869b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák               _mesa_unpack_stencil_span(ctx, srcWidth,
3870b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3871b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         dstRow, /* dst addr */
3872b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         srcType, src, srcPacking,
3873b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák                                         ctx->_ImageTransferState);
3874b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3875b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            src += srcRowStride;
3876b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák            dstRow += dstRowStride / sizeof(uint64_t);
3877b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák         }
3878b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák      }
3879b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   }
3880b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák   return GL_TRUE;
3881b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák}
3882b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák
3883920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
3884f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
3885f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{
3886f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3887f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3888f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT);
388944c089bd485a00462aeac361736035dc56895441Vinson Lee   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
3890f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
389107ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul   if (baseInternalFormat == GL_RGBA &&
389207ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
389307ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul                                            srcPacking->SwapBytes)) {
3894f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* simple memcpy path */
3895f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      memcpy_texture(ctx, dims,
3896d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                     dstFormat,
3897f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     dstRowStride, dstSlices,
3898f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3899f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                     srcAddr, srcPacking);
3900f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
3901f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   else {
3902f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      /* general path */
3903f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3904f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseInternalFormat,
3905f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     baseFormat,
3906f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcWidth, srcHeight,
3907f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcDepth, srcFormat,
3908f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcType, srcAddr,
3909f449be660e70aac2aefd2ce84581e137de25520bDave Airlie                                                     srcPacking);
3910f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      const GLuint *src = tempImage;
3911f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      GLint img, row, col;
3912b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3913f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      if (!tempImage)
3914f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         return GL_FALSE;
3915f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      for (img = 0; img < srcDepth; img++) {
3916d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul         GLubyte *dstRow = dstSlices[img];
3917f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3918f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         for (row = 0; row < srcHeight; row++) {
3919f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            GLuint *dstUI = (GLuint *) dstRow;
3920b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            if (is_unsigned) {
3921b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (col = 0; col < srcWidth; col++) {
3922b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  GLushort a,r,g,b;
3923b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  r = MIN2(src[RCOMP], 0x3ff);
3924b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  g = MIN2(src[GCOMP], 0x3ff);
3925b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  b = MIN2(src[BCOMP], 0x3ff);
3926b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  a = MIN2(src[ACOMP], 0x003);
3927b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
3928b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  src += 4;
3929b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3930b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen            } else {
3931b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               for (col = 0; col < srcWidth; col++) {
3932b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  GLushort a,r,g,b;
3933b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
3934b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
3935b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
3936b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  a = CLAMP((GLint) src[ACOMP], 0, 0x003);
3937b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
3938b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen                  src += 4;
3939b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen               }
3940f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            }
3941f449be660e70aac2aefd2ce84581e137de25520bDave Airlie            dstRow += dstRowStride;
3942f449be660e70aac2aefd2ce84581e137de25520bDave Airlie         }
3943f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      }
3944f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      free((void *) tempImage);
3945f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   }
3946f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   return GL_TRUE;
3947f449be660e70aac2aefd2ce84581e137de25520bDave Airlie}
3948f449be660e70aac2aefd2ce84581e137de25520bDave Airlie
3949f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean
3950749c9060aca85277c388377d15fd6323ba20b78eJordan Justen_mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS)
3951749c9060aca85277c388377d15fd6323ba20b78eJordan Justen{
3952749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3953749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
3954749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   ASSERT(dstFormat == MESA_FORMAT_ABGR2101010_UINT);
3955749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
3956749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
3957749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   if (baseInternalFormat == GL_RGBA &&
3958749c9060aca85277c388377d15fd6323ba20b78eJordan Justen       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
3959749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                            srcPacking->SwapBytes)) {
3960749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      /* simple memcpy path */
3961749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      memcpy_texture(ctx, dims,
3962749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                     dstFormat,
3963749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                     dstRowStride, dstSlices,
3964749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3965749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                     srcAddr, srcPacking);
3966749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   }
3967749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   else {
3968749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      /* general path */
3969749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3970749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     baseInternalFormat,
3971749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     baseFormat,
3972749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     srcWidth, srcHeight,
3973749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     srcDepth, srcFormat,
3974749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     srcType, srcAddr,
3975749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                                                     srcPacking);
3976749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      const GLuint *src = tempImage;
3977749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      GLint img, row, col;
3978749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3979749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      if (!tempImage)
3980749c9060aca85277c388377d15fd6323ba20b78eJordan Justen         return GL_FALSE;
3981749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      for (img = 0; img < srcDepth; img++) {
3982749c9060aca85277c388377d15fd6323ba20b78eJordan Justen         GLubyte *dstRow = dstSlices[img];
3983749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
3984749c9060aca85277c388377d15fd6323ba20b78eJordan Justen         for (row = 0; row < srcHeight; row++) {
3985749c9060aca85277c388377d15fd6323ba20b78eJordan Justen            GLuint *dstUI = (GLuint *) dstRow;
3986749c9060aca85277c388377d15fd6323ba20b78eJordan Justen            if (is_unsigned) {
3987749c9060aca85277c388377d15fd6323ba20b78eJordan Justen               for (col = 0; col < srcWidth; col++) {
3988749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  GLushort a,r,g,b;
3989749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  r = MIN2(src[RCOMP], 0x3ff);
3990749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  g = MIN2(src[GCOMP], 0x3ff);
3991749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  b = MIN2(src[BCOMP], 0x3ff);
3992749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  a = MIN2(src[ACOMP], 0x003);
3993749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
3994749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  src += 4;
3995749c9060aca85277c388377d15fd6323ba20b78eJordan Justen               }
3996749c9060aca85277c388377d15fd6323ba20b78eJordan Justen            } else {
3997749c9060aca85277c388377d15fd6323ba20b78eJordan Justen               for (col = 0; col < srcWidth; col++) {
3998749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  GLushort a,r,g,b;
3999749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
4000749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
4001749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
4002749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  a = CLAMP((GLint) src[ACOMP], 0, 0x003);
4003749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
4004749c9060aca85277c388377d15fd6323ba20b78eJordan Justen                  src += 4;
4005749c9060aca85277c388377d15fd6323ba20b78eJordan Justen               }
4006749c9060aca85277c388377d15fd6323ba20b78eJordan Justen            }
4007749c9060aca85277c388377d15fd6323ba20b78eJordan Justen            dstRow += dstRowStride;
4008749c9060aca85277c388377d15fd6323ba20b78eJordan Justen         }
4009749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      }
4010749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      free((void *) tempImage);
4011749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   }
4012749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   return GL_TRUE;
4013749c9060aca85277c388377d15fd6323ba20b78eJordan Justen}
4014749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
4015749c9060aca85277c388377d15fd6323ba20b78eJordan Justenstatic GLboolean
4016920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
4017920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
4018920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
4019920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
4020920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
40215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul   (void) dstRowStride; (void) dstSlices,
4022920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
4023920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
4024920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
4025920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
4026920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4027920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
4028920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
4029920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
4030920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
4031920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4032920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
4033485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
4034485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
4035485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
4036e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
4037485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
4038485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
40396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static StoreTexImageFunc table[MESA_FORMAT_COUNT];
40406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   static GLboolean initialized = GL_FALSE;
40416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
40426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   if (!initialized) {
40436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_NONE] = _mesa_texstore_null;
40446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie
40456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888;
40466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888;
40476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888;
40486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888;
4049d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888;
4050d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu      table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888;
40516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888;
40526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888;
40536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888;
40546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888;
40556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565;
40566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565;
40576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444;
40586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444;
40596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551;
40606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555;
40616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555;
40626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44;
40636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88;
40646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88;
40656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616;
40666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616;
40676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332;
40686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A8] = _mesa_texstore_unorm8;
40696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_A16] = _mesa_texstore_unorm16;
40706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L8] = _mesa_texstore_unorm8;
40716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L16] = _mesa_texstore_unorm16;
40726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I8] = _mesa_texstore_unorm8;
40736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_I16] = _mesa_texstore_unorm16;
40746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
40756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
40766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R8] = _mesa_texstore_unorm8;
40770a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul      table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88;
4078b4aecc4e1861e60e40e14868719219084967e46dBrian Paul      table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88;
40796e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R16] = _mesa_texstore_unorm16;
40806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616;
40816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616;
40826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010;
40836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8;
40846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24;
40856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z16] = _mesa_texstore_z16;
40866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24;
40876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8;
40886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32] = _mesa_texstore_z32;
40896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_S8] = _mesa_texstore_s8;
40906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8;
40916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8;
40926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8;
40936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SL8] = _mesa_texstore_sl8;
40946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8;
40956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1;
40966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1;
40976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3;
40986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5;
40996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1;
41006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1;
41016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1;
41026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1;
41036e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3;
41046e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5;
41056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32;
41066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16;
41076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32;
41086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16;
41096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
41106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
41116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32;
41126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16;
41136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
41146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
41156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32;
41166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16;
41176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32;
41186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16;
41196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32;
41206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16;
41216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8;
41226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8;
41236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88;
41246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888;
41256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888;
41266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888;
41276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16;
41286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616;
41296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16;
41306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16;
41316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16;
41326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1;
41336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1;
41346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2;
41356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2;
41366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1;
41376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1;
41386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2;
41396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2;
4140d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8;
41416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8;
41426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8;
41436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88;
41446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8;
41456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16;
41466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16;
41476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616;
41486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16;
41496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5;
41506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
41516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32;
41526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8;
415338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
415438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
415538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
415638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
415738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8;
415838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16;
415938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32;
416038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
416138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8;
416238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16;
416338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32;
416438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8;
416538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16;
416638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32;
416738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
416838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8;
416938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16;
417038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32;
417138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8;
417238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16;
417338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32;
417438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
417538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
417638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
417738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
417838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8;
417938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16;
418038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32;
418138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
418238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8;
418338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8;
418438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8;
418538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8;
418638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16;
418738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16;
418838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16;
418938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16;
419038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32;
419138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32;
419238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32;
419338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32;
419438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
419538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8;
419638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8;
419738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8;
419838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8;
419938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16;
420038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16;
420138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16;
420238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16;
420338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32;
420438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32;
420538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32;
420638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie      table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32;
420738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie
4208f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint;
4209749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      table[MESA_FORMAT_ABGR2101010_UINT] = _mesa_texstore_abgr2101010_uint;
42106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie      initialized = GL_TRUE;
4211485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
4212920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
42136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   ASSERT(table[format]);
42146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie   return table[format];
4215485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
4216485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4217485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
4218660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
4219660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
4220660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
4221660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
4222660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
4223660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
4224660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
4225660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
4226660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
4227660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
42281f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
4229660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4230660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
4231d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul                        dstFormat,
42325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul                        dstRowStride, dstSlices,
4233660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
4234660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
4235660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
4236660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
4237660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
4238485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
423981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/**
424081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it.
424181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture
424281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from
424381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values.
424481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat  the user-provided image format
424581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat  the destination texture format
424681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */
424781430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield
424881430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat)
42495999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
425081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT)
425181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul       && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL)
425281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul      return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
425381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   else
425464fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul      return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
42555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
42565999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
42575c818c6277247468ccf69abda00f5bc220b59644Brian Paul
4258ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
42595c818c6277247468ccf69abda00f5bc220b59644Brian Paul * Helper function for storing 1D, 2D, 3D whole and subimages into texture
42605c818c6277247468ccf69abda00f5bc220b59644Brian Paul * memory.
42615c818c6277247468ccf69abda00f5bc220b59644Brian Paul * The source of the image data may be user memory or a PBO.  In the later
42625c818c6277247468ccf69abda00f5bc220b59644Brian Paul * case, we'll map the PBO, copy from it, then unmap it.
42635c818c6277247468ccf69abda00f5bc220b59644Brian Paul */
42645c818c6277247468ccf69abda00f5bc220b59644Brian Paulstatic void
42655c818c6277247468ccf69abda00f5bc220b59644Brian Paulstore_texsubimage(struct gl_context *ctx,
42665c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  struct gl_texture_image *texImage,
42675c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLint xoffset, GLint yoffset, GLint zoffset,
42685c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLint width, GLint height, GLint depth,
42695c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  GLenum format, GLenum type, const GLvoid *pixels,
42705c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  const struct gl_pixelstore_attrib *packing,
42715c818c6277247468ccf69abda00f5bc220b59644Brian Paul                  const char *caller)
42725c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42735c818c6277247468ccf69abda00f5bc220b59644Brian Paul{
42745c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat);
42755c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLenum target = texImage->TexObject->Target;
42765c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLboolean success = GL_FALSE;
42775c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLuint dims, slice, numSlices = 1, sliceOffset = 0;
42785c818c6277247468ccf69abda00f5bc220b59644Brian Paul   GLint srcImageStride = 0;
42795c818c6277247468ccf69abda00f5bc220b59644Brian Paul   const GLubyte *src;
42805c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42815c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(xoffset + width <= texImage->Width);
42825c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(yoffset + height <= texImage->Height);
42835c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(zoffset + depth <= texImage->Depth);
42845c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42855c818c6277247468ccf69abda00f5bc220b59644Brian Paul   switch (target) {
42865c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D:
42875c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 1;
42885c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
42895c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D_ARRAY:
42905c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_3D:
42915c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 3;
42925c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
42935c818c6277247468ccf69abda00f5bc220b59644Brian Paul   default:
42945c818c6277247468ccf69abda00f5bc220b59644Brian Paul      dims = 2;
42955c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
42965c818c6277247468ccf69abda00f5bc220b59644Brian Paul
42975c818c6277247468ccf69abda00f5bc220b59644Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
42985c818c6277247468ccf69abda00f5bc220b59644Brian Paul   src = (const GLubyte *)
42995c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
43005c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  format, type, pixels, packing, caller);
43015c818c6277247468ccf69abda00f5bc220b59644Brian Paul   if (!src)
43025c818c6277247468ccf69abda00f5bc220b59644Brian Paul      return;
43035c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43045c818c6277247468ccf69abda00f5bc220b59644Brian Paul   /* compute slice info (and do some sanity checks) */
43055c818c6277247468ccf69abda00f5bc220b59644Brian Paul   switch (target) {
43065c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D:
43075c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_RECTANGLE:
43085c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_CUBE_MAP:
43095c818c6277247468ccf69abda00f5bc220b59644Brian Paul      /* one image slice, nothing special needs to be done */
43105c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
43115c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D:
43125c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(height == 1);
43135c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(depth == 1);
43145c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(yoffset == 0);
43155c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(zoffset == 0);
43165c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
43175c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_1D_ARRAY:
43185c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(depth == 1);
43195c818c6277247468ccf69abda00f5bc220b59644Brian Paul      assert(zoffset == 0);
43205c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = height;
43215c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = yoffset;
43225c818c6277247468ccf69abda00f5bc220b59644Brian Paul      height = 1;
43235c818c6277247468ccf69abda00f5bc220b59644Brian Paul      yoffset = 0;
43245c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_row_stride(packing, width, format, type);
43255c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
43265c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_2D_ARRAY:
43275c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = depth;
43285c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = zoffset;
43295c818c6277247468ccf69abda00f5bc220b59644Brian Paul      depth = 1;
43305c818c6277247468ccf69abda00f5bc220b59644Brian Paul      zoffset = 0;
43315c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_image_stride(packing, width, height,
43325c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                                format, type);
43335c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
43345c818c6277247468ccf69abda00f5bc220b59644Brian Paul   case GL_TEXTURE_3D:
43355c818c6277247468ccf69abda00f5bc220b59644Brian Paul      /* we'll store 3D images as a series of slices */
43365c818c6277247468ccf69abda00f5bc220b59644Brian Paul      numSlices = depth;
43375c818c6277247468ccf69abda00f5bc220b59644Brian Paul      sliceOffset = zoffset;
43385c818c6277247468ccf69abda00f5bc220b59644Brian Paul      srcImageStride = _mesa_image_image_stride(packing, width, height,
43395c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                                format, type);
43405c818c6277247468ccf69abda00f5bc220b59644Brian Paul      break;
43415c818c6277247468ccf69abda00f5bc220b59644Brian Paul   default:
43425c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target);
43435c818c6277247468ccf69abda00f5bc220b59644Brian Paul      return;
43445c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
43455c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43465c818c6277247468ccf69abda00f5bc220b59644Brian Paul   assert(numSlices == 1 || srcImageStride != 0);
43475c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43485c818c6277247468ccf69abda00f5bc220b59644Brian Paul   for (slice = 0; slice < numSlices; slice++) {
43495c818c6277247468ccf69abda00f5bc220b59644Brian Paul      GLubyte *dstMap;
43505c818c6277247468ccf69abda00f5bc220b59644Brian Paul      GLint dstRowStride;
43515c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43525c818c6277247468ccf69abda00f5bc220b59644Brian Paul      ctx->Driver.MapTextureImage(ctx, texImage,
43535c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  slice + sliceOffset,
43545c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  xoffset, yoffset, width, height,
43555c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  mapMode, &dstMap, &dstRowStride);
43565c818c6277247468ccf69abda00f5bc220b59644Brian Paul      if (dstMap) {
43575c818c6277247468ccf69abda00f5bc220b59644Brian Paul         /* Note: we're only storing a 2D (or 1D) slice at a time but we need
43585c818c6277247468ccf69abda00f5bc220b59644Brian Paul          * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is
43595c818c6277247468ccf69abda00f5bc220b59644Brian Paul          * used for 3D images.
43605c818c6277247468ccf69abda00f5bc220b59644Brian Paul          */
43615c818c6277247468ccf69abda00f5bc220b59644Brian Paul         success = _mesa_texstore(ctx, dims, texImage->_BaseFormat,
43625c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  texImage->TexFormat,
43635c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  dstRowStride,
43645c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  &dstMap,
43655c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  width, height, 1,  /* w, h, d */
43665c818c6277247468ccf69abda00f5bc220b59644Brian Paul                                  format, type, src, packing);
43675c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43685c818c6277247468ccf69abda00f5bc220b59644Brian Paul         ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset);
43695c818c6277247468ccf69abda00f5bc220b59644Brian Paul      }
43705c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43715c818c6277247468ccf69abda00f5bc220b59644Brian Paul      src += srcImageStride;
43725c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43735c818c6277247468ccf69abda00f5bc220b59644Brian Paul      if (!success)
43745c818c6277247468ccf69abda00f5bc220b59644Brian Paul         break;
43755c818c6277247468ccf69abda00f5bc220b59644Brian Paul   }
43765c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43775c818c6277247468ccf69abda00f5bc220b59644Brian Paul   if (!success)
43785c818c6277247468ccf69abda00f5bc220b59644Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
43795c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43805c818c6277247468ccf69abda00f5bc220b59644Brian Paul   _mesa_unmap_teximage_pbo(ctx, packing);
43815c818c6277247468ccf69abda00f5bc220b59644Brian Paul}
43825c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43835c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43845c818c6277247468ccf69abda00f5bc220b59644Brian Paul
43855c818c6277247468ccf69abda00f5bc220b59644Brian Paul/**
43868f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * Fallback code for ctx->Driver.TexImage().
43878f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * Basically, allocate storage for the texture image, then copy the
43888f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * user's image into it.
43898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
43908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
43918f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul_mesa_store_teximage(struct gl_context *ctx,
43928f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                     GLuint dims,
43938f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                     struct gl_texture_image *texImage,
43948f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                     GLenum format, GLenum type, const GLvoid *pixels,
43958f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                     const struct gl_pixelstore_attrib *packing)
43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
43978f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul   assert(dims == 1 || dims == 2 || dims == 3);
4398b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
4399c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen   if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0)
4400b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt      return;
4401b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt
440278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
4403c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
44048f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
44057d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
44067d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
44078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44085c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
4409c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen                     0, 0, 0, texImage->Width, texImage->Height, texImage->Depth,
44108f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                     format, type, pixels, packing, "glTexImage");
44118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
44128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
4415e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul * Fallback for Driver.TexSubImage().
44168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
44178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4418e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul_mesa_store_texsubimage(struct gl_context *ctx, GLuint dims,
4419e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                        struct gl_texture_image *texImage,
4420e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                        GLint xoffset, GLint yoffset, GLint zoffset,
4421e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                        GLint width, GLint height, GLint depth,
4422e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                        GLenum format, GLenum type, const void *pixels,
4423e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                        const struct gl_pixelstore_attrib *packing)
44248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
44255c818c6277247468ccf69abda00f5bc220b59644Brian Paul   store_texsubimage(ctx, texImage,
44265c818c6277247468ccf69abda00f5bc220b59644Brian Paul                     xoffset, yoffset, zoffset, width, height, depth,
4427e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul                     format, type, pixels, packing, "glTexSubImage");
44288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
44298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
4431b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
4432e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul * Fallback for Driver.CompressedTexImage()
44338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
44348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
4435e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul_mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,
4436e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul                                struct gl_texture_image *texImage,
4437e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul                                GLsizei imageSize, const GLvoid *data)
44388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
4439e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul   /* only 2D compressed images are supported at this time */
4440e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul   if (dims != 2) {
4441e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul      _mesa_problem(ctx, "Unexpected glCompressedTexImage1D/3D call");
4442e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul      return;
4443e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul   }
4444e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul
4445bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt   /* This is pretty simple, because unlike the general texstore path we don't
4446bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * have to worry about the usual image unpacking or image transfer
4447bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt    * operations.
44488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
445089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
445289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
445478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul   /* allocate storage for texture data */
4455c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
445678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
445789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
445889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
445989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
4460ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul   _mesa_store_compressed_texsubimage(ctx, dims, texImage,
4461ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                      0, 0, 0,
44625606bd574e264c4beda8eb1d10b48d17e9b8b497Pauli Nieminen                                      texImage->Width, texImage->Height, texImage->Depth,
4463ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                      texImage->TexFormat,
4464ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                      imageSize, data);
44658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
44668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
44678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
446889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
4469ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul * Fallback for Driver.CompressedTexSubImage()
4470e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
4471e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
4472ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul_mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
4473ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                   struct gl_texture_image *texImage,
4474ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                   GLint xoffset, GLint yoffset, GLint zoffset,
4475ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                   GLsizei width, GLsizei height, GLsizei depth,
4476ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                   GLenum format,
4477ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul                                   GLsizei imageSize, const GLvoid *data)
447889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
447981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLint bytesPerRow, dstRowStride, srcRowStride;
448089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
448181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   GLubyte *dstMap;
448289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
44831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
4484d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
44855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4486ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul   if (dims != 2) {
4487ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul      _mesa_problem(ctx, "Unexpected 1D/3D compressed texsubimage call");
4488ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul      return;
4489ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul   }
4490ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul
4491d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
44925999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
4493b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4495e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
4496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
44977a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
44987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
44997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
45002594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
450289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
450306913497d6b17f454bf4c5b8601d391980eb8265Brian Paul   /* Map dest texture buffer */
450481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul   ctx->Driver.MapTextureImage(ctx, texImage, 0,
450581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               xoffset, yoffset, width, height,
450664fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul                               GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
450781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul                               &dstMap, &dstRowStride);
450889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
45091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   if (dstMap) {
45101ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      bytesPerRow = srcRowStride;  /* bytes per row of blocks */
45111e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt      rows = (height + bh - 1) / bh;  /* rows in blocks */
451289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
45131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      /* copy rows of blocks */
45141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      for (i = 0; i < rows; i++) {
45151ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         memcpy(dstMap, src, bytesPerRow);
45161ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         dstMap += dstRowStride;
45171ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul         src += srcRowStride;
45181ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      }
45198f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
45201ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
45211ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
45221ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   else {
45231ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
45241ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul   }
452581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul
452671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
452789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
4528