texstore.c revision f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2
18e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
28e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Mesa 3-D graphics library
3a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Version:  7.5
48e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
5501338d70e96e0388fd5198625d856c4ec07745fBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Copyright (c) 2008-2009  VMware, Inc.
78e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
88e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
98e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * copy of this software and associated documentation files (the "Software"),
108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * to deal in the Software without restriction, including without limitation
118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Software is furnished to do so, subject to the following conditions:
148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * The above copyright notice and this permission notice shall be included
168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * in all copies or substantial portions of the Software.
178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *
188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Authors:
288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *   Brian Paul
298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
31248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
3289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * The GL texture image functions in teximage.c basically just do
3389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * error checking and data structure allocation.  They in turn call
3489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * device driver functions which actually copy/convert/store the user's
3589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture image data.
3689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
3789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * However, most device drivers will be able to use the fallback functions
3889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * in this file.  That is, most drivers will have the following bit of
3989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * code:
4089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
4189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *   etc...
4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated.  We have to do:
4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    Format/type conversions
4789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    pixel unpacking
4889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *    pixel transfer (scale, bais, lookup, convolution!, etc)
4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul *
5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full
5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images.
5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
5489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
553c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h"
567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
57e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h"
588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "context.h"
598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "convolve.h"
608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h"
618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h"
6224edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h"
633c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
6489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h"
65da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h"
66da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h"
678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h"
688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
692e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h"
708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
71248200737398a7d6403a23930a6c9d93db06b942Brian Paul
72fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
73fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ZERO = 4,
74fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   ONE = 5
75fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
7671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
77248200737398a7d6403a23930a6c9d93db06b942Brian Paul
78248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
79e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function.
80e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */
81e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
82e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
83e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul
84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/**
85248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted
86248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling.
87248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
88248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean
89248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat)
9071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
9171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (logicalBaseFormat) {
9271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGBA:
9371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_RGB:
9471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE_ALPHA:
9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_INTENSITY:
9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_ALPHA:
9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case GL_LUMINANCE:
983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED:
993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN:
1003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE:
1013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR:
1023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA:
1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT:
10471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_TRUE;
10571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   default:
10671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      return GL_FALSE;
10771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
10871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
10971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
112fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum {
113fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE = 0,
114fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_ALPHA,
115fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_INTENSITY,
116fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_LUMINANCE_ALPHA,
117fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGB,
118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   IDX_RGBA,
1193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_RED,
1203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_GREEN,
1213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BLUE,
1223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGR,
1233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_BGRA,
1243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   IDX_ABGR,
125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   MAX_IDX
126fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
127fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
132fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
1342e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct {
1353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte format_idx;
1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte to_rgba[6];
1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte from_rgba[6];
1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] =
139fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE,
1423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,ONE),
1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0)
144fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
145fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ALPHA,
1483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, ZERO, 0),
1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(3)
150fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
151fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_INTENSITY,
1543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, 0, 0, 0),
1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
156fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
157fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_LUMINANCE_ALPHA,
1603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,0,0,1),
1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP2(0,3)
162fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
163fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGB,
1663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,ONE),
1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(0,1,2)
168fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   },
169fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   {
1713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RGBA,
1723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0,1,2,3),
1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_RED,
1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(0, ZERO, ZERO, ONE),
1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(0),
1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_GREEN,
1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, 0, ZERO, ONE),
1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(1),
1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BLUE,
1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(ZERO, ZERO, 0, ONE),
1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP1(2),
1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGR,
1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,ONE),
1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP3(2,1,0)
1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_BGRA,
2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3),
2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(2,1,0,3)
2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   {
2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      IDX_ABGR,
2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0),
2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      MAP4(3,2,1,0)
2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   },
212fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell};
213fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
214fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
215fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
216248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
217248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above).
218248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
219248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int
220248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value)
221fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{
222fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   switch (value) {
223fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE: return IDX_LUMINANCE;
224fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_ALPHA: return IDX_ALPHA;
225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_INTENSITY: return IDX_INTENSITY;
226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGB: return IDX_RGB;
228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   case GL_RGBA: return IDX_RGBA;
2293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_RED: return IDX_RED;
2303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_GREEN: return IDX_GREEN;
2313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BLUE: return IDX_BLUE;
2323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGR: return IDX_BGR;
2333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_BGRA: return IDX_BGRA;
2343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case GL_ABGR_EXT: return IDX_ABGR;
235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   default:
236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      _mesa_problem(NULL, "Unexpected inFormat");
237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell      return 0;
238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell   }
239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}
240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell
241f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the
244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components.
245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that.
246fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat  the incoming format of the texture
247fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat  the final texture format
248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6]  a full 6-component map
249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
2503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void
2513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat,
2523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell			  GLubyte *map)
253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
254248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int inFmt = get_map_idx(inFormat);
255248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const int outFmt = get_map_idx(outFormat);
256248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
257248200737398a7d6403a23930a6c9d93db06b942Brian Paul   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
2583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   int i;
2592e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
2603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   for (i = 0; i < 4; i++)
2613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      map[i] = in2rgba[rgba2out[i]];
2623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ZERO] = ZERO;
2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   map[ONE] = ONE;
2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell/*
2673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   _mesa_printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
2683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		inFormat, _mesa_lookup_enum_by_nr(inFormat),
2693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		outFormat, _mesa_lookup_enum_by_nr(outFormat),
2703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[0],
2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[1],
2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[2],
2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[3],
2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[4],
2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell		map[5]);
2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell*/
277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components.
282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * but the graphics hardware doesn't support luminance textures.  So, might
286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat.
302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic GLfloat *
304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulmake_temp_float_image(GLcontext *ctx, GLuint dims,
305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum logicalBaseFormat,
306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum textureBaseFormat,
307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLint srcWidth, GLint srcHeight, GLint srcDepth,
308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      GLenum srcFormat, GLenum srcType,
309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      const GLvoid *srcAddr,
310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                      const struct gl_pixelstore_attrib *srcPacking)
311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLfloat *tempImage;
314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
318f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY ||
323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_COLOR_INDEX ||
324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_DEPTH_COMPONENT);
325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY ||
332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_COLOR_INDEX ||
333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_DEPTH_COMPONENT);
334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* conventional color image */
336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if ((dims == 1 && ctx->Pixel.Convolution1DEnabled) ||
338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (dims >= 2 && ctx->Pixel.Convolution2DEnabled) ||
339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (dims >= 2 && ctx->Pixel.Separable2DEnabled)) {
340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* need image convolution */
341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLuint preConvTransferOps
342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         = (transferOps & IMAGE_PRE_CONVOLUTION_BITS) | IMAGE_CLAMP_BIT;
343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLuint postConvTransferOps
344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         = (transferOps & IMAGE_POST_CONVOLUTION_BITS) | IMAGE_CLAMP_BIT;
345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
3469927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu      GLint convWidth = srcWidth, convHeight = srcHeight;
347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *convImage;
348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* pre-convolution image buffer (3D) */
350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth
351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                           * 4 * sizeof(GLfloat));
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* post-convolution image buffer (2D) */
356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      convImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight
357f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                           * 4 * sizeof(GLfloat));
358f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!convImage) {
359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_free(tempImage);
360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* loop over 3D image slices */
364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLfloat *dst = tempImage + img * (srcWidth * srcHeight * 4);
366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         /* unpack and do transfer ops up to convolution */
368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
36960909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                              srcAddr, srcWidth, srcHeight,
371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                              srcFormat, srcType, img, row, 0);
372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            _mesa_unpack_color_span_float(ctx, srcWidth, GL_RGBA, dst,
373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          srcFormat, srcType, src,
374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          srcPacking,
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          preConvTransferOps);
376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dst += srcWidth * 4;
377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3796f1abb9c215583d11980294f7469da41ec14b7daBrian Paul         /* size after optional convolution */
3806f1abb9c215583d11980294f7469da41ec14b7daBrian Paul         convWidth = srcWidth;
3816f1abb9c215583d11980294f7469da41ec14b7daBrian Paul         convHeight = srcHeight;
3826f1abb9c215583d11980294f7469da41ec14b7daBrian Paul
38340d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#if FEATURE_convolve
384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         /* do convolution */
385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         {
386f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLfloat *src = tempImage + img * (srcWidth * srcHeight * 4);
387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (dims == 1) {
388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               ASSERT(ctx->Pixel.Convolution1DEnabled);
389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               _mesa_convolve_1d_image(ctx, &convWidth, src, convImage);
390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else {
392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               if (ctx->Pixel.Convolution2DEnabled) {
393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  _mesa_convolve_2d_image(ctx, &convWidth, &convHeight,
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          src, convImage);
395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               else {
397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  ASSERT(ctx->Pixel.Separable2DEnabled);
398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  _mesa_convolve_sep_image(ctx, &convWidth, &convHeight,
399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                           src, convImage);
400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
40340d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#endif
404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         /* do post-convolution transfer and pack into tempImage */
405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         {
4062b012578ee519561365640e23272b71898378c45Brian Paul            const GLint logComponents
4072b012578ee519561365640e23272b71898378c45Brian Paul               = _mesa_components_in_format(logicalBaseFormat);
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            const GLfloat *src = convImage;
409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLfloat *dst = tempImage + img * (convWidth * convHeight * 4);
410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (row = 0; row < convHeight; row++) {
411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               _mesa_pack_rgba_span_float(ctx, convWidth,
412176501dfff14b5bec78af2b3487207d42c26d37aBrian Paul                                          (GLfloat (*)[4]) src,
413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          logicalBaseFormat, GL_FLOAT,
414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          dst, &ctx->DefaultPacking,
415c7eb423c49ef3e0e071deaab04dad55254f2fa30Brian Paul                                          postConvTransferOps);
416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += convWidth * 4;
4172b012578ee519561365640e23272b71898378c45Brian Paul               dst += convWidth * logComponents;
418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      } /* loop over 3D image slices */
421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free(convImage);
423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* might need these below */
425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcWidth = convWidth;
426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcHeight = convHeight;
427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* no convolution */
430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLint components = _mesa_components_in_format(logicalBaseFormat);
4318c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
4328c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *dst;
434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth
437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                           * components * sizeof(GLfloat));
438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      dst = tempImage;
442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
443f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *src
44460909388ab136d849d99eab49e782a53772a618fBrian Paul            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                    srcWidth, srcHeight,
446f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                    srcFormat, srcType,
447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                    img, 0, 0);
448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          dst, srcFormat, srcType, src,
451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          srcPacking, transferOps);
452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dst += srcWidth * components;
453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcStride;
454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* more work */
460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
462f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *newImage;
463f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
4643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
46613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
46713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
46813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      newImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth
476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                          * texComponents * sizeof(GLfloat));
477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_free(tempImage);
479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
4823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
483f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
487f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
488f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
489f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0.0F;
491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 1.0F;
493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free(tempImage);
499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLchan components.
508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations.
509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format
511f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * but the graphics hardware doesn't support luminance textures.  So, might
512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead.
513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *
515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx  the rendering context
516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims  image dimensions: 1, 2 or 3
517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat  basic texture derived from the user's
518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *    internal texture format value
519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat  the actual basic format of the texture
520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth  source image width
521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight  source image height
522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth  source image depth
523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat  source image format
524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType  source image type
525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr  source image address
526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking  source image pixel packing
527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLchan.
528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
5298f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian PaulGLchan *
5308f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul_mesa_make_temp_chan_image(GLcontext *ctx, GLuint dims,
5318f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum logicalBaseFormat,
5328f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum textureBaseFormat,
5338f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLint srcWidth, GLint srcHeight, GLint srcDepth,
5348f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           GLenum srcFormat, GLenum srcType,
5358f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           const GLvoid *srcAddr,
5368f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul                           const struct gl_pixelstore_attrib *srcPacking)
537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLuint transferOps = ctx->_ImageTransferState;
539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint components = _mesa_components_in_format(logicalBaseFormat);
540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLboolean freeSrcImage = GL_FALSE;
541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLint img, row;
542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLchan *tempImage, *dst;
543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(dims >= 1 && dims <= 3);
545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(logicalBaseFormat == GL_RGBA ||
547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_RGB ||
548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_LUMINANCE ||
550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_ALPHA ||
551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          logicalBaseFormat == GL_INTENSITY);
552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(textureBaseFormat == GL_RGBA ||
554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_RGB ||
555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE_ALPHA ||
556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_LUMINANCE ||
557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_ALPHA ||
558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          textureBaseFormat == GL_INTENSITY);
559f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
56040d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#if FEATURE_convolve
561f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if ((dims == 1 && ctx->Pixel.Convolution1DEnabled) ||
562f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (dims >= 2 && ctx->Pixel.Convolution2DEnabled) ||
563f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (dims >= 2 && ctx->Pixel.Separable2DEnabled)) {
564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* get convolved image */
565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLfloat *convImage = make_temp_float_image(ctx, dims,
566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 logicalBaseFormat,
567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 logicalBaseFormat,
568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType,
570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcAddr, srcPacking);
571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!convImage)
572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* the convolved image is our new source image */
574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcAddr = convImage;
575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcFormat = logicalBaseFormat;
576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcType = GL_FLOAT;
577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      srcPacking = &ctx->DefaultPacking;
578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      transferOps = 0;
580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      freeSrcImage = GL_TRUE;
581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
58240d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#endif
583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* unpack and transfer the source image */
585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   tempImage = (GLchan *) _mesa_malloc(srcWidth * srcHeight * srcDepth
586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                       * components * sizeof(GLchan));
58796128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   if (!tempImage) {
58896128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee      if (freeSrcImage) {
58996128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee         _mesa_free((void *) srcAddr);
59096128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee      }
591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return NULL;
59296128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee   }
593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   dst = tempImage;
595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   for (img = 0; img < srcDepth; img++) {
5968c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride =
5978c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
5988c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLubyte *src =
5998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
6008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcWidth, srcHeight,
6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               srcFormat, srcType,
6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                               img, 0, 0);
603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (row = 0; row < srcHeight; row++) {
6049c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul         _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst,
6059c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul                                      srcFormat, srcType, src, srcPacking,
6069c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul                                      transferOps);
607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dst += srcWidth * components;
608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         src += srcStride;
609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* If we made a temporary image for convolution, free it here */
613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (freeSrcImage) {
614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) srcAddr);
615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (logicalBaseFormat != textureBaseFormat) {
618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one more conversion step */
619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLchan *newImage;
622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint i, n;
6233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte map[6];
624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul             textureBaseFormat == GL_LUMINANCE_ALPHA);
628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* The actual texture format should have at least as many components
630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       * as the logical texture format.
631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       */
632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      ASSERT(texComponents >= logComponents);
633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      newImage = (GLchan *) _mesa_malloc(srcWidth * srcHeight * srcDepth
6352dbffb30f05fcf67658c64b8101e9efaf07ca388Brian Paul                                         * texComponents * sizeof(GLchan));
636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!newImage) {
637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_free(tempImage);
638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return NULL;
639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
6413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      n = srcWidth * srcHeight * srcDepth;
644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (i = 0; i < n; i++) {
645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLint k;
646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (k = 0; k < texComponents; k++) {
647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint j = map[k];
648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (j == ZERO)
649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = 0;
650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else if (j == ONE)
651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = CHAN_MAX;
652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else
653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free(tempImage);
658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      tempImage = newImage;
659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return tempImage;
662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
665c039af165d5919008c6df599795951f85dea164dBrian Paul/**
666c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling.
667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst  destination pixels
668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents  number of color components in destination pixels
669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src  source pixels
670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents  number of color components in source pixels
671248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map  the swizzle mapping.  map[X] says where to find the X component
672248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             in the source image's pixels.  For example, if the source image
673248200737398a7d6403a23930a6c9d93db06b942Brian Paul *             is GL_BGRA and X = red, map[0] yields 2.
674c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count  number of pixels to copy/swizzle.
675c039af165d5919008c6df599795951f85dea164dBrian Paul */
676c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void
677c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
678c039af165d5919008c6df599795951f85dea164dBrian Paul             GLuint srcComponents, const GLubyte *map, GLuint count)
67971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   do {                                              \
682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      GLuint i;                                      \
683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      for (i = 0; i < count; i++) {                  \
684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         GLuint j;                                   \
685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         if (srcComps == 4) {                        \
686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            COPY_4UBV(tmp, src);                     \
687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         else {                                      \
689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            for (j = 0; j < srcComps; j++) {         \
690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul               tmp[j] = src[j];                      \
691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            }                                        \
692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         src += srcComps;                            \
694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         for (j = 0; j < dstComps; j++) {            \
695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul            dst[j] = tmp[map[j]];                    \
696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         }                                           \
697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         dst += dstComps;                            \
698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      }                                              \
699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   } while (0)
700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
701248200737398a7d6403a23930a6c9d93db06b942Brian Paul   GLubyte tmp[6];
70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ZERO] = 0x0;
70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   tmp[ONE] = 0xff;
70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(srcComponents <= 4);
707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   ASSERT(dstComponents <= 4);
708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
70971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   switch (dstComponents) {
71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 4:
711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 4);
714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 3);
717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 2);
720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 4, 1);
723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 3:
729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 4);
732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 3);
735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 2);
738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 3, 1);
741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   case 2:
747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 4);
750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 3);
753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 2);
756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 2, 1);
759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
76271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      break;
7643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   case 1:
765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      switch (srcComponents) {
766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 4:
767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 4);
768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 3:
770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 3);
771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 2:
773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 2);
774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      case 1:
776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         SWZ_CPY(dst, src, count, 1, 1);
777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         break;
778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      default:
779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul         ;
7803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      break;
782501338d70e96e0388fd5198625d856c4ec07745fBrian Paul   default:
783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul      ;
78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
785501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY
78671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell}
78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
78846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
789501338d70e96e0388fd5198625d856c4ec07745fBrian Paul
790bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
79246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
793bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell/* Deal with the _REV input types:
794bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */
79546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
796bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType )
79746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
799c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
80046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
802bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
803df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_3210 : map_identity;
804bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
805df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer      return _mesa_little_endian() ? map_identity : map_3210;
80646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
80746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
80846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
811bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell/* Mapping required if input type is
81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */
81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte *
814bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes,
815bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell		  GLenum srcType )
81646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{
817bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   if (!swapBytes)
818bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      return map_identity;
819bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell
82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   switch (srcType) {
821c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   case GL_BYTE:
82246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_BYTE:
82346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_identity;
82446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8:
82546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   case GL_UNSIGNED_INT_8_8_8_8_REV:
82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return map_3210;
82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   default:
82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      return NULL;
82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell   }
83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell}
83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
834c039af165d5919008c6df599795951f85dea164dBrian Paul/**
835c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling.
836c039af165d5919008c6df599795951f85dea164dBrian Paul */
83771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void
83871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_swizzle_ubyte_image(GLcontext *ctx,
83971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLuint dimensions,
84071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLenum srcFormat,
84146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  GLenum srcType,
84246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
8430c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLenum baseInternalFormat,
8440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell
84546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell			  const GLubyte *rgba2dst,
8460c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell			  GLuint dstComponents,
84771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
84871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLvoid *dstAddr,
84971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
850b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul			  GLint dstRowStride,
851b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                          const GLuint *dstImageOffsets,
85271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const GLvoid *srcAddr,
85571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			  const struct gl_pixelstore_attrib *srcPacking )
85671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{
85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint srcComponents = _mesa_components_in_format(srcFormat);
858bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   const GLubyte *srctype2ubyte, *swap;
8593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   GLubyte map[4], src2base[6], base2rgba[6];
86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   GLint i;
861c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcRowStride =
862c039af165d5919008c6df599795951f85dea164dBrian Paul      _mesa_image_row_stride(srcPacking, srcWidth,
863c039af165d5919008c6df599795951f85dea164dBrian Paul                             srcFormat, GL_UNSIGNED_BYTE);
864c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLint srcImageStride
865c039af165d5919008c6df599795951f85dea164dBrian Paul      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
866c039af165d5919008c6df599795951f85dea164dBrian Paul                                 GL_UNSIGNED_BYTE);
867c039af165d5919008c6df599795951f85dea164dBrian Paul   const GLubyte *srcImage
868c039af165d5919008c6df599795951f85dea164dBrian Paul      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
869c039af165d5919008c6df599795951f85dea164dBrian Paul                                              srcWidth, srcHeight, srcFormat,
870c039af165d5919008c6df599795951f85dea164dBrian Paul                                              GL_UNSIGNED_BYTE, 0, 0, 0);
87171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
872edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul   (void) ctx;
873edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul
8740c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
8750c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * correctly deal with RGBA->RGB->RGBA conversions where the final
8760c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    * A value must be 0xff regardless of the incoming alpha values.
8770c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell    */
8783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
8793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
880bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
881bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell   srctype2ubyte = type_mapping(srcType);
88246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
88371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
88471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   for (i = 0; i < 4; i++)
885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
88671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
8872e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell/*    _mesa_printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
8882e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell
889b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul   if (srcComponents == dstComponents &&
890b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul       srcRowStride == dstRowStride &&
8919c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer       srcRowStride == srcWidth * srcComponents &&
892b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul       dimensions < 3) {
893b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      /* 1 and 2D images only */
894b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstImage = (GLubyte *) dstAddr
895b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
896b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstXoffset * dstComponents;
89771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul		   srcWidth * srcHeight);
89971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
90071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else {
90171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLint img, row;
90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         const GLubyte *srcRow = srcImage;
904b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
905b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img] * dstComponents
906b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
907b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset * dstComponents;
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
92517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwellmemcpy_texture(GLcontext *ctx,
92617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell	       GLuint dimensions,
9271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul               gl_format dstFormat,
928f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLvoid *dstAddr,
929f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
930b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               GLint dstRowStride,
931b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               const GLuint *dstImageOffsets,
932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLint srcWidth, GLint srcHeight, GLint srcDepth,
933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               GLenum srcFormat, GLenum srcType,
934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const GLvoid *srcAddr,
935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               const struct gl_pixelstore_attrib *srcPacking)
936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                     srcFormat, srcType);
939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                      srcWidth, srcHeight, srcFormat, srcType);
94160909388ab136d849d99eab49e782a53772a618fBrian Paul   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
94260909388ab136d849d99eab49e782a53772a618fBrian Paul        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
9431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
94422108bb571808542b89677752d62d3901698265fBrian Paul   const GLint bytesPerRow = srcWidth * texelBytes;
945b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
946b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0
947b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* XXX update/re-enable for dstImageOffsets array */
948f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerImage = srcHeight * bytesPerRow;
949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   const GLint bytesPerTexture = srcDepth * bytesPerImage;
950f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLubyte *dstImage = (GLubyte *) dstAddr
951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstZoffset * dstImageStride
952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     + dstYoffset * dstRowStride
95322108bb571808542b89677752d62d3901698265fBrian Paul                     + dstXoffset * texelBytes;
954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (dstRowStride == srcRowStride &&
956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       dstRowStride == bytesPerRow &&
957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((dstImageStride == srcImageStride &&
958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImageStride == bytesPerImage) ||
959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul        (srcDepth == 1))) {
960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* one big memcpy */
96117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture);
962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
963b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   else
964b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   {
965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         const GLubyte *srcRow = srcImage;
968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLubyte *dstRow = dstImage;
969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
97017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         srcImage += srcImageStride;
975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         dstImage += dstImageStride;
976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
978b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif
979b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul
980b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   GLint img, row;
981b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   for (img = 0; img < srcDepth; img++) {
982b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLubyte *srcRow = srcImage;
983b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLubyte *dstRow = (GLubyte *) dstAddr
98422108bb571808542b89677752d62d3901698265fBrian Paul         + dstImageOffsets[dstZoffset + img] * texelBytes
985b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         + dstYoffset * dstRowStride
98622108bb571808542b89677752d62d3901698265fBrian Paul         + dstXoffset * texelBytes;
987b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      for (row = 0; row < srcHeight; row++) {
988b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
989b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         dstRow += dstRowStride;
990b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         srcRow += srcRowStride;
991b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      }
992b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      srcImage += srcImageStride;
993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   }
994f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
999a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul * Store a 32-bit integer depth component texture image.
1000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
100149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1002b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS)
1003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
100425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffffffff;
10051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1006a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
10071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z32);
100822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLuint));
1009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1010966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1011966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1013a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1014a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1015a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul       srcType == GL_UNSIGNED_INT) {
1016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
101717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
101860909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1020b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1028b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
102922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1030b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
103122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
103360909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10351ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1036a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1037a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1042f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1043f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1047e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image.
1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
1049e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean
1050e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1052e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint depthScale = 0xffffff;
1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   const GLuint texelBytes = 4;
1054e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1055a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
1056e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   {
1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1062b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
1063e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1064b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
1065e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul            + dstXoffset * texelBytes;
1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
106760909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
10691ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1070a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1071a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    depthScale, srcType, src, srcPacking);
1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1076f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1077f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1079e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul
1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1081c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image.
1082c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */
1083c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean
1084c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1085c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{
1086c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint depthScale = 0xffffff;
1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   const GLuint texelBytes = 4;
1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   (void) dims;
1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   {
1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      /* general path */
1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      GLint img, row;
1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      for (img = 0; img < srcDepth; img++) {
1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         GLubyte *dstRow = (GLubyte *) dstAddr
1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstImageOffsets[dstZoffset + img] * texelBytes
1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstYoffset * dstRowStride
1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            + dstXoffset * texelBytes;
1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         for (row = 0; row < srcHeight; row++) {
1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLuint *dst = (GLuint *) dstRow;
1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            GLint i;
1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            _mesa_unpack_depth_span(ctx, srcWidth,
1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    GL_UNSIGNED_INT, dst,
1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca                                    depthScale, srcType, src, srcPacking);
1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            for (i = 0; i < srcWidth; i++)
1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca               dst[i] <<= 8;
1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca            dstRow += dstRowStride;
1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca         }
1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca      }
1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   }
1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   return GL_TRUE;
1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca}
1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca
1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/**
1119a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image.
1120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
112149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1122b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS)
1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
112425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian   const GLuint depthScale = 0xffff;
11251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1126a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims;
11271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z16);
112822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == sizeof(GLushort));
1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1130966e199e409a1b52eef88e48997442250997f45eBrian Paul   if (ctx->Pixel.DepthScale == 1.0f &&
1131966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
1132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_DEPTH_COMPONENT &&
1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_DEPTH_COMPONENT &&
1135a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT) {
1136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
113717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
113860909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1139b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1140b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1141f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
11461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      GLint img, row;
1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1148b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
114922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1150b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
115122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
115360909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1155a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dst16 = (GLushort *) dstRow;
11561ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
1157a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking);
1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
1168defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image.
1169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
117049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1171b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
11731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
11741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
117522108bb571808542b89677752d62d3901698265fBrian Paul
11761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
11771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB565_REV);
117822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
11821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGB565 &&
1183a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1184a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1185a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_SHORT_5_6_5) {
1186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
118717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
118860909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1189b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1194a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1196a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            baseInternalFormat == GL_RGB &&
1197a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGB &&
1198a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE &&
1199a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dims == 2) {
1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* do optimized tex store */
12018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcRowStride =
12028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1203a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLubyte *src = (const GLubyte *)
120460909388ab136d849d99eab49e782a53772a618fBrian Paul         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1205a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                             srcFormat, srcType, 0, 0, 0);
1206a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLubyte *dst = (GLubyte *) dstAddr
1207a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                   + dstYoffset * dstRowStride
120822108bb571808542b89677752d62d3901698265fBrian Paul                   + dstXoffset * texelBytes;
1209a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint row, col;
1210a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (row = 0; row < srcHeight; row++) {
1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         const GLubyte *srcUB = (const GLubyte *) src;
1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         GLushort *dstUS = (GLushort *) dst;
1213defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         /* check for byteswapped format */
12141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul         if (dstFormat == MESA_FORMAT_RGB565) {
1215f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1216f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1217f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1218f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1219f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         }
1220f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul         else {
1221f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            for (col = 0; col < srcWidth; col++) {
1222f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1223f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               srcUB += 3;
1224f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1225defb035b6cf03c555318d9dd48864242ed036f39Brian Paul         }
1226a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         dst += dstRowStride;
1227a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         src += srcRowStride;
1228a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1229a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
1232a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1233a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
123422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1235a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1236a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1237a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1238a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *src = tempImage;
1239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1240a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1241a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1242a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1244b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
124522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1246b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
124722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1249a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLushort *dstUS = (GLushort *) dstRow;
1250defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            /* check for byteswapped format */
12511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGB565) {
1252f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1253f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
1254f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                               CHAN_TO_UBYTE(src[GCOMP]),
1255f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                               CHAN_TO_UBYTE(src[BCOMP]) );
1256f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1257f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1258f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            }
1259f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1260f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1261f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]),
1262f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                   CHAN_TO_UBYTE(src[GCOMP]),
1263f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                   CHAN_TO_UBYTE(src[BCOMP]) );
1264f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 3;
1265f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
1271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1272f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1276248200737398a7d6403a23930a6c9d93db06b942Brian Paul/**
1277248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1278248200737398a7d6403a23930a6c9d93db06b942Brian Paul */
127949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1280b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1282184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
12831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
12841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
128571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
12861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
12871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGBA8888_REV);
128822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
12921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888 &&
1293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1294defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
12952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
12962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
12972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
12982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       /* simple memcpy path */
12992e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      memcpy_texture(ctx, dims,
13002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
13012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstRowStride,
13022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     dstImageOffsets,
13032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
13042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger                     srcAddr, srcPacking);
13052e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   }
13062e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger   else if (!ctx->_ImageTransferState &&
13072e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       !srcPacking->SwapBytes &&
13081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA8888_REV &&
13092e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       baseInternalFormat == GL_RGBA &&
13102e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
13112e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
13122e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
13132e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
1314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
131517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
131660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1317b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1318b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
132271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
132346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
132446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
132546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1326528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger	    can_swizzle(baseInternalFormat) &&
132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
132971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
133071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
1331528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
13331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
13341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
133546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 0;
133646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
133746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 2;
133846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
133946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
134046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
134146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;
134246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 2;
134346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;
134446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 0;
134546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
134946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
1350528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				baseInternalFormat,
135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1353528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger				dstRowStride, dstImageOffsets,
135471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
135571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
135671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1357f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1358f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
13598f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
136122108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
1366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1371b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
137222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1373b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
137422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint *dstUI = (GLuint *) dstRow;
13771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_RGBA8888) {
1378f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1379f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
1380f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1381f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]),
1382f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[ACOMP]) );
1383f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1384f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1386f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1387f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]),
1389f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1390f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]),
1391f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[ACOMP]) );
1392f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1393f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1394a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1395a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1396a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1397a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1398a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
1399a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1400a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1401a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1402a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1403a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
140449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1405b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1407184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
14081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
1409f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul   const GLenum baseFormat = GL_RGBA;
1410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
14111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
141274d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_ARGB8888_REV ||
141374d61d03b54d72217d463c248468cdcd09320efcBrian Paul          dstFormat == MESA_FORMAT_XRGB8888);
141422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
1415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
141874d61d03b54d72217d463c248468cdcd09320efcBrian Paul       (dstFormat == MESA_FORMAT_ARGB8888 ||
141974d61d03b54d72217d463c248468cdcd09320efcBrian Paul        dstFormat == MESA_FORMAT_XRGB8888) &&
1420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
1423defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
1424defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (little endian) */
142517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
142660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1427b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1428b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1432defb035b6cf03c555318d9dd48864242ed036f39Brian Paul   else if (!ctx->_ImageTransferState &&
1433a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
14341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB8888_REV &&
1435a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGBA &&
1436a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_BGRA &&
1437a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
1438defb035b6cf03c555318d9dd48864242ed036f39Brian Paul        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
1439defb035b6cf03c555318d9dd48864242ed036f39Brian Paul      /* simple memcpy path (big endian) */
144017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
144160909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1442b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1444a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1445a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1446a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
144771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
144871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
144974d61d03b54d72217d463c248468cdcd09320efcBrian Paul	    (dstFormat == MESA_FORMAT_ARGB8888 ||
145074d61d03b54d72217d463c248468cdcd09320efcBrian Paul             dstFormat == MESA_FORMAT_XRGB8888) &&
145171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGB &&
14520c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    (baseInternalFormat == GL_RGBA ||
14530c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	     baseInternalFormat == GL_RGB) &&
145471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcType == GL_UNSIGNED_BYTE) {
145571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      int img, row, col;
145671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      for (img = 0; img < srcDepth; img++) {
14578c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14588c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
145971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1461b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
146222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
146422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         for (row = 0; row < srcHeight; row++) {
1466259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
146771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            for (col = 0; col < srcWidth; col++) {
146824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(0xff,
146924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + RCOMP],
147024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + GCOMP],
147124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 3 + BCOMP]);
147271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
147371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
147471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
147571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
147671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
147771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
147871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
147971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            !srcPacking->SwapBytes &&
14801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	    dstFormat == MESA_FORMAT_ARGB8888 &&
148171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcFormat == GL_RGBA &&
14820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    baseInternalFormat == GL_RGBA &&
148324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1484259eacfa94a1086e4c99db83516989cc27832ef4Brian      /* same as above case, but src data has alpha too */
1485b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1486ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      /* For some reason, streaming copies to write-combined regions
1487ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * are extremely sensitive to the characteristics of how the
1488ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * source data is retrieved.  By reordering the source reads to
1489ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * be in-order, the speed of this operation increases by half.
1490ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       * Strangely the same isn't required for the RGB path, above.
1491ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul       */
1492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      for (img = 0; img < srcDepth; img++) {
14938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
14948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1497b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
149822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1499b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
150022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul         for (row = 0; row < srcHeight; row++) {
1502259eacfa94a1086e4c99db83516989cc27832ef4Brian            GLuint *d4 = (GLuint *) dstRow;
1503ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul            for (col = 0; col < srcWidth; col++) {
150424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
150524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + RCOMP],
150624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + GCOMP],
150724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul                                         srcRow[col * 4 + BCOMP]);
150871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            }
150971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            dstRow += dstRowStride;
151071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell            srcRow += srcRowStride;
151171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell         }
151271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      }
151371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
151471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   else if (!ctx->_ImageTransferState &&
151546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	    (srcType == GL_UNSIGNED_BYTE ||
151646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
151746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
15180c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell	    can_swizzle(baseInternalFormat) &&
151971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell	    can_swizzle(srcFormat)) {
152071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
152171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      GLubyte dstmap[4];
152271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
15230c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
152471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell       */
15251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
152674d61d03b54d72217d463c248468cdcd09320efcBrian Paul          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
15271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV)) {
152846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 3;		/* alpha */
152946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 0;		/* red */
153046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 1;		/* green */
153146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 2;		/* blue */
153246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
153346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      else {
15341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
153574d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
153674d61d03b54d72217d463c248468cdcd09320efcBrian Paul		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
153746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[3] = 2;
153846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[2] = 1;
153946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[1] = 0;
154046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell	 dstmap[0] = 3;
154146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell      }
154271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell
154371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
154471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcFormat,
154546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell				srcType,
154646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell
15470c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell				baseInternalFormat,
154871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstmap, 4,
154971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
1550b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul				dstRowStride,
1551b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                                dstImageOffsets,
155271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
155371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell				srcPacking);
155471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   }
1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1557a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1558a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
155922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1560a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1561a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1562a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *src = tempImage;
1564a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1569b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
157022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1571b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
157222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1574a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            GLuint *dstUI = (GLuint *) dstRow;
15751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB8888) {
1576f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1577f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
1578f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
1579f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1580f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
1581f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1583a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
158474d61d03b54d72217d463c248468cdcd09320efcBrian Paul            else if (dstFormat == MESA_FORMAT_XRGB8888) {
158574d61d03b54d72217d463c248468cdcd09320efcBrian Paul               for (col = 0; col < srcWidth; col++) {
158674d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  dstUI[col] = PACK_COLOR_8888( 0xff,
158774d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
158874d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
158974d61d03b54d72217d463c248468cdcd09320efcBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
159074d61d03b54d72217d463c248468cdcd09320efcBrian Paul                  src += 4;
159174d61d03b54d72217d463c248468cdcd09320efcBrian Paul               }
159274d61d03b54d72217d463c248468cdcd09320efcBrian Paul            }
1593f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1594f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1595f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]),
1596f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
1597f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1598f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
1599f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1600f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1601defb035b6cf03c555318d9dd48864242ed036f39Brian Paul            }
1602a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1603a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1607a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1608a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1609a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
161149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1612b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
1614184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
16151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
16161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
16181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB888);
161922108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGR &&
1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
162817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
162960909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1630b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1631b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else if (!ctx->_ImageTransferState &&
1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            !srcPacking->SwapBytes &&
1637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcFormat == GL_RGBA &&
1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcType == GL_UNSIGNED_BYTE) {
1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract RGB from RGBA */
1640b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      GLint img, row, col;
1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
16428c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
16438c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
164460909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
164560909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1646b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
164722108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
164922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            srcRow += srcRowStride;
1658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
16613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
16623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
16633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
16643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
16653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
16673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
16693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1670167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 2;
16713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1672167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 0;
16733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
16743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
16753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
16763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
16773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
16783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1685f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1686f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
16878f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
168922108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
16937c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul      const GLchan *src = (const GLchan *) tempImage;
1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1695f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1699b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
170022108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1701b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
170222108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0
1705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (littleEndian) {
1706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1707f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
1710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1712f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            else {
1714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               for (col = 0; col < srcWidth; col++) {
1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 0] = srcUB[BCOMP];
1716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 1] = srcUB[GCOMP];
1717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  dstRow[col * 3 + 2] = srcUB[RCOMP];
1718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcUB += 3;
1719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               }
1720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else
1722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
1723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]);
1724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]);
1726f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
1727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1728f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif
1729f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
1730f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
1731f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
1732f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
1733f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1734f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
1735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
1736f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1737f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
173849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1739b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1740a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{
1741184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
17421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
17431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1744a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
17451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_BGR888);
174622108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 3);
1747a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1748a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   if (!ctx->_ImageTransferState &&
1749a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       !srcPacking->SwapBytes &&
1750a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       baseInternalFormat == GL_RGB &&
1751a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcFormat == GL_RGB &&
1752a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       srcType == GL_UNSIGNED_BYTE &&
1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul       littleEndian) {
1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* simple memcpy path */
175517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
175660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1757b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1758b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1760a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                     srcAddr, srcPacking);
1761a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1762a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else if (!ctx->_ImageTransferState &&
1763a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            !srcPacking->SwapBytes &&
1764a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcFormat == GL_RGBA &&
1765a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcType == GL_UNSIGNED_BYTE) {
1766a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* extract BGR from RGBA */
1767a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      int img, row, col;
1768a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
17698c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul         const GLint srcRowStride =
17708c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
177160909388ab136d849d99eab49e782a53772a618fBrian Paul         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
177260909388ab136d849d99eab49e782a53772a618fBrian Paul                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1773b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
177422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
177622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1777a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1778a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1779a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1780a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1781a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1782a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1783a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1784a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            srcRow += srcRowStride;
1785a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1786a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1787a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
17883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
17893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
17903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
17913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
17923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
17943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
17953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
17963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
1797167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[0] = 0;
17983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = 1;
1799167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell      dstmap[2] = 2;
18003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
18013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
18023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
18033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
18043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
18053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
18063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 3,
18073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
18093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
1812a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   else {
1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      /* general path */
1814a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1815a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 baseInternalFormat,
181622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcWidth, srcHeight, srcDepth,
1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcFormat, srcType, srcAddr,
1819a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul                                                 srcPacking);
18207c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul      const GLchan *src = (const GLchan *) tempImage;
1821a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      GLint img, row, col;
1822a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      if (!tempImage)
1823a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         return GL_FALSE;
1824a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1825a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      for (img = 0; img < srcDepth; img++) {
1826b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
182722108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1828b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
182922108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1830a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         for (row = 0; row < srcHeight; row++) {
1831a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            for (col = 0; col < srcWidth; col++) {
1832a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
1833a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
1834a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
1835a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul               src += 3;
1836a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1837a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1838a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1839a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1840a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
1841a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1842a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1843a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1844a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1845a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
184649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1847b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
18491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
18501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
185122108bb571808542b89677752d62d3901698265fBrian Paul
18521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
18531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB4444_REV);
185422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
18581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB4444 &&
1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1861defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
1862f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
186317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
186460909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1865b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1866b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1867f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1868f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1870f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
18728f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
187422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
1876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
1879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
1881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
1882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
1884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
188522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1886b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
188722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
18901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB4444) {
1891f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1892f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
1893f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
1894f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
1895f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
1896f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1897f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
1901f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]),
1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
1904f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
1905f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
1906f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
1907a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
1908a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
1909a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
1913a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
1914a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
191649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1917dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1918dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{
19191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
192122108bb571808542b89677752d62d3901698265fBrian Paul
19221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
192322108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1924a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
1925dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   if (!ctx->_ImageTransferState &&
1926dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       !srcPacking->SwapBytes &&
19271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_RGBA5551 &&
1928dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       baseInternalFormat == GL_RGBA &&
1929dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcFormat == GL_RGBA &&
1930dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
1931dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* simple memcpy path */
1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      memcpy_texture(ctx, dims,
1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstRowStride,
1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     dstImageOffsets,
1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1937dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                     srcAddr, srcPacking);
1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   else {
1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      /* general path */
1941dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
1942dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 baseInternalFormat,
194322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
1944dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcWidth, srcHeight, srcDepth,
1945dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcFormat, srcType, srcAddr,
1946dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom                                                 srcPacking);
1947dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      const GLchan *src =tempImage;
1948dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      GLint img, row, col;
1949dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      if (!tempImage)
1950dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         return GL_FALSE;
1951dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
1952dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      for (img = 0; img < srcDepth; img++) {
1953dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         GLubyte *dstRow = (GLubyte *) dstAddr
195422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
1955dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            + dstYoffset * dstRowStride
195622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
1957dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         for (row = 0; row < srcHeight; row++) {
1958dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            GLushort *dstUS = (GLushort *) dstRow;
1959dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    for (col = 0; col < srcWidth; col++) {
1960dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	       dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
1961dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[GCOMP]),
1962dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[BCOMP]),
1963dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom					     CHAN_TO_UBYTE(src[ACOMP]) );
1964dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	      src += 4;
1965dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom	    }
1966dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom            dstRow += dstRowStride;
1967dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom         }
1968dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      }
1969dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom      _mesa_free((void *) tempImage);
1970dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   }
1971dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom   return GL_TRUE;
1972dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom}
1973defb035b6cf03c555318d9dd48864242ed036f39Brian Paul
197449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
1975b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
19771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
19781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
197922108bb571808542b89677752d62d3901698265fBrian Paul
19801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
19811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ARGB1555_REV);
198222108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
1983f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
1984f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
1985f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
19861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_ARGB1555 &&
1987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGBA &&
1988f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_BGRA &&
1989defb035b6cf03c555318d9dd48864242ed036f39Brian Paul       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
1990f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
199117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
199260909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
1993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
1994b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
1995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
1997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
1998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
1999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
20008f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
200222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src =tempImage;
2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2008f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2012b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
201322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2014b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
201522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
20181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_ARGB1555) {
2019f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2020f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
2021f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[RCOMP]),
2022f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[GCOMP]),
2023f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                CHAN_TO_UBYTE(src[BCOMP]) );
2024f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
2025f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2027f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]),
2030f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[RCOMP]),
2031f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[GCOMP]),
2032f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                    CHAN_TO_UBYTE(src[BCOMP]) );
2033f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  src += 4;
2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2035a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2036a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2037a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2038a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
2039a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
2040a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
204549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2046b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_al88(TEXSTORE_PARAMS)
2047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2048184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
20491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
20501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
20521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
20531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_AL88_REV);
205422108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
20581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_AL88 &&
2059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_LUMINANCE_ALPHA &&
2060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_LUMINANCE_ALPHA &&
2061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE &&
2062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       littleEndian) {
2063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
206417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
206560909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2066b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2067b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
20713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
2072bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell	    littleEndian &&
20733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
20743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
20753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
20763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
20773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
20783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
20793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
20803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
20811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
20821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
20833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
20843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[1] = 3;
20853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
20863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
20873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
20883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[1] = 0;
20893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
20903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
20913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
20923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
20933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
20943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
20953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
20963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
20973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 2,
20983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
20993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
21003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
21013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
21023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2103f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2104f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
21058f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2106f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
210722108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2108f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2109f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2111f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2112f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2113f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2114f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2115f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2116f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2117b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
211822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2119b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
212022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLushort *dstUS = (GLushort *) dstRow;
21231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_AL88) {
2124f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2125f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2126f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
2127f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                             CHAN_TO_UBYTE(src[0]) );
2128f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2129f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2131f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul            else {
2132f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               for (col = 0; col < srcWidth; col++) {
2133f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                  /* src[0] is luminance, src[1] is alpha */
2134f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]),
2135f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                                                 CHAN_TO_UBYTE(src[0]) );
2136f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul                 src += 2;
2137f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul               }
2138a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            }
2139a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul            dstRow += dstRowStride;
2140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul         }
2141a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      }
2142a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul      _mesa_free((void *) tempImage);
2143a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   }
2144a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   return GL_TRUE;
2145a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul}
2146a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
2147a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul
214849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2149b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
21511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
21521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
215322108bb571808542b89677752d62d3901698265fBrian Paul
21541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGB332);
215522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == GL_RGB &&
2160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
2161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
216217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
216360909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2164b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2165b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
21718f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
217322108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2176f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2183b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
218422108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2185b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
218622108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]),
2190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                             CHAN_TO_UBYTE(src[GCOMP]),
2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                             CHAN_TO_UBYTE(src[BCOMP]) );
2192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               src += 3;
2193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
2198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
220649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2207b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_a8(TEXSTORE_PARAMS)
2208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
22091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
22101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
221122108bb571808542b89677752d62d3901698265fBrian Paul
22121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_A8 ||
22131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_L8 ||
22141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_I8);
221522108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
222217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
222360909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2224b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2225b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
22293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   else if (!ctx->_ImageTransferState &&
22303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    srcType == GL_UNSIGNED_BYTE &&
22313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(baseInternalFormat) &&
22323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	    can_swizzle(srcFormat)) {
22333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      GLubyte dstmap[4];
22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      /* dstmap - how to swizzle from RGBA to dst format:
22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell       */
22381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if (dstFormat == MESA_FORMAT_A8) {
22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 3;
22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      else {
22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell	 dstmap[0] = 0;
22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      }
22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[1] = ZERO;		/* ? */
22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[2] = ZERO;		/* ? */
22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      dstmap[3] = ONE;		/* ? */
22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell
22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell      _mesa_swizzle_ubyte_image(ctx, dims,
22493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcFormat,
22503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcType,
22513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				baseInternalFormat,
22523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstmap, 1,
22533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstAddr, dstXoffset, dstYoffset, dstZoffset,
22543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				dstRowStride, dstImageOffsets,
22553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcWidth, srcHeight, srcDepth, srcAddr,
22563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell				srcPacking);
22573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell   }
2258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
22608f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
226222108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLchan *src = tempImage;
2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row, col;
2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2272b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
227322108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2274b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
227522108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (col = 0; col < srcWidth; col++) {
2278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstRow[col] = CHAN_TO_UBYTE(src[col]);
2279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth;
2282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
229149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2292b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ci8(TEXSTORE_PARAMS)
2293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
22941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
229522108bb571808542b89677752d62d3901698265fBrian Paul
2296a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) dims; (void) baseInternalFormat;
22971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_CI8);
229822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 1);
2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_COLOR_INDEX);
2300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcFormat == GL_COLOR_INDEX &&
2304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_UNSIGNED_BYTE) {
2305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
230617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
230760909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2308b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2309b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2317b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
231822108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2319b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
232022108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
232260909388ab136d849d99eab49e782a53772a618fBrian Paul            const GLvoid *src = _mesa_image_address(dims, srcPacking,
2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
2324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow,
2325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    srcType, src, srcPacking,
2326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                    ctx->_ImageTransferState);
2327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
23361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
233849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2339b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
2341184b5d89380e18008d64adfe1756dca9736426f2Brian Paul   const GLboolean littleEndian = _mesa_little_endian();
23421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
234322108bb571808542b89677752d62d3901698265fBrian Paul
2344a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx; (void) dims; (void) baseInternalFormat;
2345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
23461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
23471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          (dstFormat == MESA_FORMAT_YCBCR_REV));
234822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(srcFormat == GL_YCBCR_MESA);
2351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* always just memcpy since no pixel transfer ops apply */
235617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell   memcpy_texture(ctx, dims,
235760909388ab136d849d99eab49e782a53772a618fBrian Paul                  dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstRowStride,
2359b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                  dstImageOffsets,
2360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  srcAddr, srcPacking);
2362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* Check if we need byte swapping */
2364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   /* XXX the logic here _might_ be wrong */
2365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (srcPacking->SwapBytes ^
2366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
23671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !littleEndian) {
2369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2371b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
237222108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2373b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
237422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2376b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_swap2((GLushort *) dstRow, srcWidth);
2377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
238449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{
2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
23881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
23901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
239122108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 2);
2392114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2394114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	  (srcFormat == GL_DUDV_ATI));
2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2396114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       littleEndian) {
2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* simple memcpy path */
2400114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      memcpy_texture(ctx, dims,
2401114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2402114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstRowStride,
2403114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     dstImageOffsets,
2404114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2405114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                     srcAddr, srcPacking);
2406114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2407114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else if (srcType == GL_BYTE) {
2408114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2409114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLubyte dstmap[4];
2410114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2411114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2412114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger       */
2413114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (littleEndian) {
2414114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 0;
2415114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 3;
2416114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2417114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      else {
2418114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[0] = 3;
2419114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger	 dstmap[1] = 0;
2420114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2421114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[2] = ZERO;		/* ? */
2422114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dstmap[3] = ONE;		/* ? */
2423114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2424114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2425114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2426114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_UNSIGNED_BYTE, /* hack */
2427114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				GL_LUMINANCE_ALPHA, /* hack */
2428114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstmap, 2,
2429114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstAddr, dstXoffset, dstYoffset, dstZoffset,
2430114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				dstRowStride, dstImageOffsets,
2431114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2432114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger				srcPacking);
2433114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2434114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   else {
2435114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      /* general path - note this is defined for 2d textures only */
2436114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      const GLint components = _mesa_components_in_format(baseInternalFormat);
24378c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
24388c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul                                                     srcFormat, srcType);
2439114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLbyte *tempImage, *dst, *src;
2440114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      GLint row;
2441114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2442114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      tempImage = (GLbyte *) _mesa_malloc(srcWidth * srcHeight * srcDepth
2443114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                          * components * sizeof(GLbyte));
2444114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      if (!tempImage)
2445114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         return GL_FALSE;
2446114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2447114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2448114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcWidth, srcHeight,
2449114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           srcFormat, srcType,
2450114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                           0, 0, 0);
2451114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2452114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = tempImage;
2453114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
2454114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2455114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     dst, srcFormat, srcType, src,
2456114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger                                     srcPacking, 0);
2457114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += srcWidth * components;
2458114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         src += srcStride;
2459114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2460114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2461114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      src = tempImage;
2462114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      dst = (GLbyte *) dstAddr
2463114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            + dstYoffset * dstRowStride
246422108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2465114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      for (row = 0; row < srcHeight; row++) {
246622108bb571808542b89677752d62d3901698265fBrian Paul         memcpy(dst, src, srcWidth * texelBytes);
2467114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         dst += dstRowStride;
246822108bb571808542b89677752d62d3901698265fBrian Paul         src += srcWidth * texelBytes;
2469114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      }
2470114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      _mesa_free((void *) tempImage);
2471114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   }
2472114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   return GL_TRUE;
2473114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger}
2474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2475c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/**
2476bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or MESA_FORMAT_SIGNED_RGBA8888_REV
2477c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */
247849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2479c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
2480c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{
2481c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   const GLboolean littleEndian = _mesa_little_endian();
24821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
24831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2484c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
24851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
24861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
248722108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == 4);
2488c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2489c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   if (!ctx->_ImageTransferState &&
2490c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       !srcPacking->SwapBytes &&
24911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
2492c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       baseInternalFormat == GL_RGBA &&
2493c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
2494c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
2495c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       /* simple memcpy path */
2496c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      memcpy_texture(ctx, dims,
2497c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2498c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstRowStride,
2499c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     dstImageOffsets,
2500c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2501c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                     srcAddr, srcPacking);
2502c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2503c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else if (!ctx->_ImageTransferState &&
2504bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       !srcPacking->SwapBytes &&
25051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
2506bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       baseInternalFormat == GL_RGBA &&
2507bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
2508bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
2509bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      /* simple memcpy path */
2510bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger      memcpy_texture(ctx, dims,
2511bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2512bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstRowStride,
2513bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     dstImageOffsets,
2514bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2515bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                     srcAddr, srcPacking);
2516bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   }
2517bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger   else if (!ctx->_ImageTransferState &&
2518c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    (srcType == GL_BYTE) &&
2519c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    can_swizzle(baseInternalFormat) &&
2520c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	    can_swizzle(srcFormat)) {
2521c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2522c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLubyte dstmap[4];
2523c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2524c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* dstmap - how to swizzle from RGBA to dst format:
2525c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger       */
25261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul      if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) ||
25271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul	  (!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) {
2528c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[3] = 0;
2529c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[2] = 1;
2530c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[1] = 2;
2531c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[0] = 3;
2532c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
2533c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      else {
2534c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[3] = 3;
2535c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[2] = 2;
2536c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[1] = 1;
2537c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger	 dstmap[0] = 0;
2538c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
2539c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger
2540c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      _mesa_swizzle_ubyte_image(ctx, dims,
2541c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcFormat,
2542c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcType,
2543c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				baseInternalFormat,
2544c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstmap, 4,
2545c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstAddr, dstXoffset, dstYoffset, dstZoffset,
2546c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				dstRowStride, dstImageOffsets,
2547c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcWidth, srcHeight, srcDepth, srcAddr,
2548c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger				srcPacking);
2549c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2550c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   else {
2551c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      /* general path */
2552c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
2553c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 baseInternalFormat,
255422108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2555c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcWidth, srcHeight, srcDepth,
2556c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcFormat, srcType, srcAddr,
2557c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                 srcPacking);
2558c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      const GLfloat *srcRow = tempImage;
2559c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      GLint img, row, col;
2560c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      if (!tempImage)
2561c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         return GL_FALSE;
2562c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2563c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      for (img = 0; img < srcDepth; img++) {
2564c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         GLubyte *dstRow = (GLubyte *) dstAddr
256522108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2566c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            + dstYoffset * dstRowStride
256722108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2568c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         for (row = 0; row < srcHeight; row++) {
2569c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            GLuint *dstUI = (GLuint *) dstRow;
25701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
2571c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2572c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
2573c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
2574c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
2575c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                                                FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
2576c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger                  srcRow += 4;
2577c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger               }
2578c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            }
2579bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            else {
2580bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               for (col = 0; col < srcWidth; col++) {
2581bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
2582bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
2583bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
2584bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                                                    FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
2585bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger                  srcRow += 4;
2586bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger               }
2587bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger            }
2588c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger            dstRow += dstRowStride;
2589c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger         }
2590c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      }
2591c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger      _mesa_free((void *) tempImage);
2592c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   }
2593c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger   return GL_TRUE;
2594c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger}
2595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2596184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/**
2597184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image.
2598184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */
259949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
2601184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{
260230640695400b9b27656893753ae6b62f2082ce9bBrian Paul   const GLfloat depthScale = (GLfloat) 0xffffff;
2603c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   const GLint srcRowStride
2604c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
2605c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      / sizeof(GLuint);
2606c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   GLint img, row;
260725cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian
26081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
2609c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
2610c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2611184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2612c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   /* In case we only upload depth we need to preserve the stencil */
2613c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   if (srcFormat == GL_DEPTH_COMPONENT) {
2614c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      for (img = 0; img < srcDepth; img++) {
2615c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz         GLuint *dstRow = (GLuint *) dstAddr
2616c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            + dstImageOffsets[dstZoffset + img]
2617c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            + dstYoffset * dstRowStride / sizeof(GLuint)
2618c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            + dstXoffset;
2619c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz         const GLuint *src
2620c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
2621c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                  srcWidth, srcHeight,
2622c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                  srcFormat, srcType,
2623c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                  img, 0, 0);
2624c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz         for (row = 0; row < srcHeight; row++) {
2625c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            GLuint depth[MAX_WIDTH];
2626c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            GLint i;
2627c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            _mesa_unpack_depth_span(ctx, srcWidth,
2628c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                                    GL_UNSIGNED_INT, /* dst type */
2629c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                                    depth, /* dst addr */
2630c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                                    depthScale,
2631c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz                                    srcType, src, srcPacking);
2632c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz
2633c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            for (i = 0; i < srcWidth; i++)
2634c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz               dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
2635c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz
2636c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            src += srcRowStride;
2637c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz            dstRow += dstRowStride / sizeof(GLuint);
2638c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz         }
2639c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz      }
2640c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   }
2641c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz   else if (ctx->Pixel.DepthScale == 1.0f &&
2642966e199e409a1b52eef88e48997442250997f45eBrian Paul       ctx->Pixel.DepthBias == 0.0f &&
2643184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul       !srcPacking->SwapBytes) {
2644ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* simple path */
2645184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul      memcpy_texture(ctx, dims,
2646184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2647b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2649184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2650184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul                     srcAddr, srcPacking);
2651184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
2652184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   else {
2653ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      /* general path */
2654ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      const GLint srcRowStride
2655ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
2656ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         / sizeof(GLuint);
2657ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      GLint img, row;
2658ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
2659ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      for (img = 0; img < srcDepth; img++) {
2660b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLuint *dstRow = (GLuint *) dstAddr
2661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstImageOffsets[dstZoffset + img]
2662b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride / sizeof(GLuint)
2663b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstXoffset;
2664ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         const GLuint *src
2665ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
2666ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                                   srcWidth, srcHeight,
2667ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                                   srcFormat, srcType,
2668ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                                   img, 0, 0);
2669ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         for (row = 0; row < srcHeight; row++) {
2670ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLubyte stencil[MAX_WIDTH];
2671ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            GLint i;
2672ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            /* the 24 depth bits will be in the high position: */
2673ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            _mesa_unpack_depth_span(ctx, srcWidth,
267430640695400b9b27656893753ae6b62f2082ce9bBrian Paul                                    GL_UNSIGNED_INT_24_8_EXT, /* dst type */
2675b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                                    dstRow, /* dst addr */
2676090e212c0c5e54156c3c33f7eecdfe01398a7222Michal Krol                                    (GLuint) depthScale,
2677ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                    srcType, src, srcPacking);
2678ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            /* get the 8-bit stencil values */
2679ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            _mesa_unpack_stencil_span(ctx, srcWidth,
2680ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                      GL_UNSIGNED_BYTE, /* dst type */
2681ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                      stencil, /* dst addr */
2682ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                      srcType, src, srcPacking,
2683ef8653a83800bc4b8e116e03ad52604097224378Brian Paul                                      ctx->_ImageTransferState);
2684ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            /* merge stencil values into depth values */
2685ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            for (i = 0; i < srcWidth; i++)
2686b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul               dstRow[i] |= stencil[i];
2687ef8653a83800bc4b8e116e03ad52604097224378Brian Paul
2688ef8653a83800bc4b8e116e03ad52604097224378Brian Paul            src += srcRowStride;
2689b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride / sizeof(GLuint);
2690ef8653a83800bc4b8e116e03ad52604097224378Brian Paul         }
2691ef8653a83800bc4b8e116e03ad52604097224378Brian Paul      }
2692184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   }
2693184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul   return GL_TRUE;
2694184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul}
2695184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2696184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul
2697a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/**
2698a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image.
2699a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */
270049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2701a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
2702a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{
2703a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLuint depthScale = 0xffffff;
2704a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   const GLint srcRowStride
2705a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
2706a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      / sizeof(GLuint);
2707a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   GLint img, row;
2708a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
27091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
2710c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
2711c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2712c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca
2713966e199e409a1b52eef88e48997442250997f45eBrian Paul   /* In case we only upload depth we need to preserve the stencil */
2714666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz   if (srcFormat == GL_DEPTH_COMPONENT) {
2715666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz      for (img = 0; img < srcDepth; img++) {
2716666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         GLuint *dstRow = (GLuint *) dstAddr
2717666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstImageOffsets[dstZoffset + img]
2718666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstYoffset * dstRowStride / sizeof(GLuint)
2719666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstXoffset;
2720666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         const GLuint *src
2721666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
2722666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  srcWidth, srcHeight,
2723666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  srcFormat, srcType,
2724666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  img, 0, 0);
2725666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         for (row = 0; row < srcHeight; row++) {
2726666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            GLuint depth[MAX_WIDTH];
2727666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            GLint i;
2728666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            _mesa_unpack_depth_span(ctx, srcWidth,
2729666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    GL_UNSIGNED_INT, /* dst type */
2730666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    depth, /* dst addr */
2731666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    depthScale,
2732666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    srcType, src, srcPacking);
2733a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz
2734666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            for (i = 0; i < srcWidth; i++)
2735666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz               dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
2736666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2737666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            src += srcRowStride;
2738666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            dstRow += dstRowStride / sizeof(GLuint);
2739666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         }
2740666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz      }
27418122ab2dfd0e158a4982e1bfeb1f7a6f185b69eeBrian Paul   }
27428122ab2dfd0e158a4982e1bfeb1f7a6f185b69eeBrian Paul   else {
2743666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz      for (img = 0; img < srcDepth; img++) {
2744666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         GLuint *dstRow = (GLuint *) dstAddr
2745666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstImageOffsets[dstZoffset + img]
2746666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstYoffset * dstRowStride / sizeof(GLuint)
2747666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            + dstXoffset;
2748666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         const GLuint *src
2749666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
2750666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  srcWidth, srcHeight,
2751666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  srcFormat, srcType,
2752666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                  img, 0, 0);
2753666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         for (row = 0; row < srcHeight; row++) {
2754666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            GLubyte stencil[MAX_WIDTH];
2755666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            GLint i;
2756218df7f9c53db90abf3a6590f77c8e9e49aeedf5Xiang, Haihao            /* the 24 depth bits will be in the low position: */
2757666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            _mesa_unpack_depth_span(ctx, srcWidth,
2758666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    GL_UNSIGNED_INT, /* dst type */
2759666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    dstRow, /* dst addr */
2760666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    depthScale,
2761666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                    srcType, src, srcPacking);
2762666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            /* get the 8-bit stencil values */
2763666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            _mesa_unpack_stencil_span(ctx, srcWidth,
2764666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                      GL_UNSIGNED_BYTE, /* dst type */
2765666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                      stencil, /* dst addr */
2766666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                      srcType, src, srcPacking,
2767666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz                                      ctx->_ImageTransferState);
2768666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            /* merge stencil values into depth values */
2769666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            for (i = 0; i < srcWidth; i++)
2770218df7f9c53db90abf3a6590f77c8e9e49aeedf5Xiang, Haihao               dstRow[i] |= stencil[i] << 24;
2771666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz
2772666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            src += srcRowStride;
2773666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz            dstRow += dstRowStride / sizeof(GLuint);
2774666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz         }
2775a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz      }
2776a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   }
2777a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz   return GL_TRUE;
2778a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz}
2779f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2780f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2781f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats:
2782f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgba_float32
2783f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_rgb_float32
2784f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_alpha_float32
2785f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_float32
2786f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_luminance_alpha_float32
2787f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul *   _mesa_texformat_intensity_float32
2788f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
278949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2790b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
2791f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
27921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
27931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
279422108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
2795f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
27961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
27971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
27981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
27991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
28001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
28011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32);
2802f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
2803f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
2804f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
2805f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
2806f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
2807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_INTENSITY);
280822108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLfloat));
2809f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2810f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2812f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2813f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_FLOAT) {
2814f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
281517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
281660909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2817b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2818b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2819f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2821f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2822f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2823f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2824f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
2825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
282622108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2828f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2830b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLfloat *srcRow = tempImage;
28319c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      GLint bytesPerRow;
2832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2834f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2835f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
28369c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul      bytesPerRow = srcWidth * components * sizeof(GLfloat);
2837f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2838b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
283922108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2840b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
284122108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2843b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            _mesa_memcpy(dstRow, srcRow, bytesPerRow);
2844b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            dstRow += dstRowStride;
2845b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            srcRow += srcWidth * components;
2846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2847f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
2850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2853f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
2856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats.
2857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
285849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
2859b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
2860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{
28611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
28621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
286322108bb571808542b89677752d62d3901698265fBrian Paul   const GLint components = _mesa_components_in_format(baseFormat);
2864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
28651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
28661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
28671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
28681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
28691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
28701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16);
2871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   ASSERT(baseInternalFormat == GL_RGBA ||
2872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_RGB ||
2873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_ALPHA ||
2874f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE ||
2875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_LUMINANCE_ALPHA ||
2876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          baseInternalFormat == GL_INTENSITY);
287722108bb571808542b89677752d62d3901698265fBrian Paul   ASSERT(texelBytes == components * sizeof(GLhalfARB));
2878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!ctx->_ImageTransferState &&
2880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       !srcPacking->SwapBytes &&
2881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       baseInternalFormat == srcFormat &&
2882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       srcType == GL_HALF_FLOAT_ARB) {
2883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* simple memcpy path */
288417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell      memcpy_texture(ctx, dims,
288560909388ab136d849d99eab49e782a53772a618fBrian Paul                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
2886b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstRowStride,
2887b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul                     dstImageOffsets,
2888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                     srcAddr, srcPacking);
2890f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   else {
2892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      /* general path */
2893f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *tempImage = make_temp_float_image(ctx, dims,
2894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 baseInternalFormat,
289522108bb571808542b89677752d62d3901698265fBrian Paul                                                 baseFormat,
2896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcWidth, srcHeight, srcDepth,
2897f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcFormat, srcType, srcAddr,
2898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                                                 srcPacking);
2899f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      const GLfloat *src = tempImage;
2900f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      GLint img, row;
2901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!tempImage)
2902f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return GL_FALSE;
2903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
2904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      for (img = 0; img < srcDepth; img++) {
2905b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul         GLubyte *dstRow = (GLubyte *) dstAddr
290622108bb571808542b89677752d62d3901698265fBrian Paul            + dstImageOffsets[dstZoffset + img] * texelBytes
2907b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul            + dstYoffset * dstRowStride
290822108bb571808542b89677752d62d3901698265fBrian Paul            + dstXoffset * texelBytes;
2909f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         for (row = 0; row < srcHeight; row++) {
2910f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
2911f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLint i;
2912f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < srcWidth * components; i++) {
2913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dstTexel[i] = _mesa_float_to_half(src[i]);
2914f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
2915f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            dstRow += dstRowStride;
2916f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            src += srcWidth * components;
2917f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
2918f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
2919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2920f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_free((void *) tempImage);
2921f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
2922f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   return GL_TRUE;
2923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul}
2924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
2925f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
29268d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB
292749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
29288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS)
29298d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
29301f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
293146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
293246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
29331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
293446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
293546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgb texstore code */
29361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGB888;
293746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
29380f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
293946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             newDstFormat, dstAddr,
294046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             dstXoffset, dstYoffset, dstZoffset,
294146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             dstRowStride, dstImageOffsets,
294246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             srcWidth, srcHeight, srcDepth,
294346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             srcFormat, srcType,
294446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul             srcAddr, srcPacking);
294546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
29468d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
29478d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
294854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
294949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
29508d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS)
29518d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
29521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
295346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
295446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
29551f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
295646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
295746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal rgba texstore code */
29581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_RGBA8888;
295946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
296046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               newDstFormat, dstAddr,
296146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstXoffset, dstYoffset, dstZoffset,
296246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               dstRowStride, dstImageOffsets,
296346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcWidth, srcHeight, srcDepth,
296446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcFormat, srcType,
296546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                               srcAddr, srcPacking);
296646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
29678d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
29688d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
296954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
297049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
29715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS)
29725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{
29731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
29745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   GLboolean k;
29755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
29761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
29775bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
29785bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   /* reuse normal rgba texstore code */
29791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_ARGB8888;
29805bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
29815bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
29825bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               newDstFormat, dstAddr,
29835bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstXoffset, dstYoffset, dstZoffset,
29845bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               dstRowStride, dstImageOffsets,
29855bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcWidth, srcHeight, srcDepth,
29865bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcFormat, srcType,
29875bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger                               srcAddr, srcPacking);
29885bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger   return k;
29895bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger}
29905bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
29915bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger
299249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
29938d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS)
29948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
29951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
299646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
299746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
29981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SL8);
299946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
30001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_L8;
300146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
300254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   /* _mesa_textore_a8 handles luminance8 too */
300354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul   k = _mesa_texstore_a8(ctx, dims, baseInternalFormat,
300454e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         newDstFormat, dstAddr,
300554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstXoffset, dstYoffset, dstZoffset,
300654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         dstRowStride, dstImageOffsets,
300754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcWidth, srcHeight, srcDepth,
300854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcFormat, srcType,
300954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul                         srcAddr, srcPacking);
301046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
30118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
30128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
301354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul
301449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean
30158d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS)
30168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{
30171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   gl_format newDstFormat;
301846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   GLboolean k;
301946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
30201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   ASSERT(dstFormat == MESA_FORMAT_SLA8);
302146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
302246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   /* reuse normal luminance/alpha texstore code */
30231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   newDstFormat = MESA_FORMAT_AL88;
302446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul
302546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   k = _mesa_texstore_al88(ctx, dims, baseInternalFormat,
302646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           newDstFormat, dstAddr,
302746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           dstXoffset, dstYoffset, dstZoffset,
302846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           dstRowStride, dstImageOffsets,
302946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           srcWidth, srcHeight, srcDepth,
303046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           srcFormat, srcType,
303146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul                           srcAddr, srcPacking);
303246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul   return k;
30338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul}
30348d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
30359927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else
30369927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
30379927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */
30389927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL
30399927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL
30409927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL
30419927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL
30429927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL
30439927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu
30448d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
30458d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul
3046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3047485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3048485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3049485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
3050485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Table mapping MESA_FORMAT_8 to _mesa_texstore_*()
3051485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary.
3052485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
3053c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecaconst static struct {
3054485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   gl_format Name;
3055485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   StoreTexImageFunc Store;
3056485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
3057485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] =
3058485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
3059bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_NONE, NULL },
3060485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 },
3061485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 },
3062485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 },
3063485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 },
306474d61d03b54d72217d463c248468cdcd09320efcBrian Paul   { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 },
3065485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 },
3066485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 },
3067485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 },
3068485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 },
3069485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 },
3070485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 },
3071485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 },
3072485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 },
3073485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 },
3074485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_AL88, _mesa_texstore_al88 },
3075485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_AL88_REV, _mesa_texstore_al88 },
3076485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 },
3077485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_A8, _mesa_texstore_a8 },
3078485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_L8, _mesa_texstore_a8 },
3079485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_I8, _mesa_texstore_a8 },
3080485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_CI8, _mesa_texstore_ci8 },
3081485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr },
3082485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr },
3083485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 },
3084485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 },
3085485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z16, _mesa_texstore_z16 },
3086e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul   { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 },
3087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca   { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 },
3088485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_Z32, _mesa_texstore_z32 },
3089485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   { MESA_FORMAT_S8, NULL/*_mesa_texstore_s8*/ },
3090bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 },
3091bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 },
3092bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 },
3093bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SL8, _mesa_texstore_sl8 },
3094bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SLA8, _mesa_texstore_sla8 },
3095bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 },
3096bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 },
3097bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 },
3098bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 },
3099bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 },
3100bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 },
3101bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 },
3102bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 },
3103bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 },
3104bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 },
3105bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 },
3106bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 },
3107bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 },
3108bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 },
3109bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
3110bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
3111bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 },
3112bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 },
3113bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
3114bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
3115bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
3116bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
3117bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
3118bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
3119bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
3120c13b9a141d77845517bf7cab20cff6115c31e67dBrian Paul   { MESA_FORMAT_SIGNED_RGBA_16, NULL },
3121485105ed182e2e997b084f047e72d5a2c3460057Brian Paul};
3122485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3123485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3124920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean
3125920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS)
3126920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{
3127920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) ctx; (void) dims;
3128920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) baseInternalFormat;
3129920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstFormat;
3130920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstAddr;
3131920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
3132920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) dstRowStride; (void) dstImageOffsets;
3133920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcWidth; (void) srcHeight; (void) srcDepth;
3134920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcFormat; (void) srcType;
3135920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcAddr;
3136920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   (void) srcPacking;
3137920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3138920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   /* should never happen */
3139920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   _mesa_problem(NULL, "_mesa_texstore_null() is called");
3140920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   return GL_FALSE;
3141920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu}
3142920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3143920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3144485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/**
3145485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format.
3146485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */
3147e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc
3148485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format)
3149485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{
3150bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG
31511f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul   GLuint i;
3152485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
3153bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul      ASSERT(texstore_funcs[i].Name == i);
3154485105ed182e2e997b084f047e72d5a2c3460057Brian Paul   }
3155bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif
3156bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul   ASSERT(texstore_funcs[format].Name == format);
3157920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu
3158920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   if (texstore_funcs[format].Store)
3159920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return texstore_funcs[format].Store;
3160920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu   else
3161920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu      return _mesa_texstore_null;
3162485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}
3163485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3164485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
3165660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/**
3166660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory.
3167660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D()
3168660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */
3169660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean
3170660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS)
3171660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{
3172660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   StoreTexImageFunc storeImage;
3173660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   GLboolean success;
3174660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
31751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   storeImage = _mesa_get_texstore_func(dstFormat);
3176660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
3177660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   success = storeImage(ctx, dims, baseInternalFormat,
3178660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
3179660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        dstRowStride, dstImageOffsets,
3180660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcWidth, srcHeight, srcDepth,
3181660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul                        srcFormat, srcType, srcAddr, srcPacking);
3182660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul   return success;
3183660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul}
3184660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul
3185485105ed182e2e997b084f047e72d5a2c3460057Brian Paul
31867a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
3187c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a texture image.
3188c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory.
3189c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded.
319071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too!
31917a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */
319271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid *
319371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_validate_pbo_teximage(GLcontext *ctx, GLuint dimensions,
319471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    GLsizei width, GLsizei height, GLsizei depth,
319571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    GLenum format, GLenum type, const GLvoid *pixels,
319671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    const struct gl_pixelstore_attrib *unpack,
319771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell			    const char *funcName)
31987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{
3199c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   GLubyte *buf;
3200c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3201434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (!_mesa_is_bufferobj(unpack->BufferObj)) {
32027a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      /* no PBO */
32037a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return pixels;
32047a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
320560909388ab136d849d99eab49e782a53772a618fBrian Paul   if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth,
320660909388ab136d849d99eab49e782a53772a618fBrian Paul                                  format, type, pixels)) {
3207c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access");
3208c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
32097a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
3210c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3211a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
3212a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul                                          GL_READ_ONLY_ARB, unpack->BufferObj);
3213c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if (!buf) {
3214c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped");
3215c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
3216c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
3217c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3218c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   return ADD_POINTERS(buf, pixels);
32197a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul}
32207a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
32217a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
32227a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
3223c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a compressed texture
3224c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * image.
3225c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory.
3226c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded.
322771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too!
32287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */
322971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid *
323071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_validate_pbo_compressed_teximage(GLcontext *ctx,
3231c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 GLsizei imageSize, const GLvoid *pixels,
3232c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 const struct gl_pixelstore_attrib *packing,
3233c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                                 const char *funcName)
32347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{
3235c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   GLubyte *buf;
3236c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3237434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (!_mesa_is_bufferobj(packing->BufferObj)) {
32387a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      /* not using a PBO - return pointer unchanged */
32397a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return pixels;
32407a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
3241c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if ((const GLubyte *) pixels + imageSize >
3242f285f0d8f60adafdfba5c1f0563b81c68bd398d3Brian Paul       ((const GLubyte *) 0) + packing->BufferObj->Size) {
3243c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      /* out of bounds read! */
3244c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access");
3245c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
3246c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
3247c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3248a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
3249a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul                                         GL_READ_ONLY_ARB, packing->BufferObj);
3250c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   if (!buf) {
3251c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped");
3252c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      return NULL;
32537a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   }
3254c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
3255c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   return ADD_POINTERS(buf, pixels);
32567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul}
32577a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
32587a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
3259c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul/**
3260c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * This function must be called after either of the validate_pbo_*_teximage()
3261c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * functions.  It unmaps the PBO buffer if it was mapped earlier.
3262c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul */
326371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellvoid
3264c039af165d5919008c6df599795951f85dea164dBrian Paul_mesa_unmap_teximage_pbo(GLcontext *ctx,
3265c039af165d5919008c6df599795951f85dea164dBrian Paul                         const struct gl_pixelstore_attrib *unpack)
3266c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul{
3267434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul   if (_mesa_is_bufferobj(unpack->BufferObj)) {
3268c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
3269c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul                              unpack->BufferObj);
3270c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul   }
3271c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul}
3272c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul
327389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3274b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return texture size in bytes */
3275b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint
3276b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_size(const struct gl_texture_image *texImage)
3277da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul{
327832aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width,
327932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul                                       texImage->Height, texImage->Depth);
3280b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   return sz;
3281da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul}
3282da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul
3283da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul
3284b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return row stride in bytes */
3285b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint
3286b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_row_stride(const struct gl_texture_image *texImage)
32875999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{
328882bcc1c5d27b825db7f002c3c183bd1dc7833438Brian Paul   GLuint stride = _mesa_format_row_stride(texImage->TexFormat,
3289b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                           texImage->Width);
3290b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   return stride;
32915999c5b620236fb6a996cf56759aec31f01c126bBrian Paul}
32925999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
32935999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
32945999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
3295ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/**
329689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage1D()
3297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * and Driver.CopyTexImage1D().
32986b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
3299ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * Note that the width may not be the actual texture width since it may
3300ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * be changed by convolution w/ GL_REDUCE.  The texImage->Width field will
3301ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * have the actual texture size.
33028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
33038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
33048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
33058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
33068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint border,
33078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const GLvoid *pixels,
33088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
33098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
33108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
33118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
331232aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
3313a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
33148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
33158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
3316b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
33174cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
33187d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
33197d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
33207d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
33217d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
33228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
3323e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
3324e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage1D");
33256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
33266b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
33276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
33286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
332989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
33306b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
33316b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
3332b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLint dstRowStride = 0;
3333b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
3334b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3335b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3336b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
3337b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3338b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3339b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, 1, 1,
3340b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
3343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3345f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
334671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
33478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
33488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
33498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
33506b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
335189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage2D()
335289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage2D().
33536b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul *
3354b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather
3355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM.  Device driver's can easily plug in their own replacement.
3356b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul *
3357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * Note: width and height may be pre-convolved dimensions, but
3358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * texImage->Width and texImage->Height will be post-convolved dimensions.
33598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
33608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
33618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
33628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
33638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint border,
33648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
33658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
33668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
33678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
33688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
336932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
3370a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
33718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
33728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
3373b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
33744cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
33757d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
33767d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
33777d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
33787d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
33798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
338071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
3381e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexImage2D");
33826b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
33836b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
33846b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
33856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
338689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
33876b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
33886b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
3389b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
3390b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
3391b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3392b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3393b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
3394b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3395b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3396b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, 1,
3397b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
3400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3402f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
340371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
34048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
34058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34086b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/**
340989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage3D()
341089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage3D().
34116b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d()
34128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
34138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
34148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
34158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint internalFormat,
34168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLint width, GLint height, GLint depth, GLint border,
34178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       GLenum format, GLenum type, const void *pixels,
34188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       const struct gl_pixelstore_attrib *packing,
34198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_object *texObj,
34208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                       struct gl_texture_image *texImage)
34218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
342232aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul   GLuint sizeInBytes;
3423a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
34248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   /* allocate memory */
3426b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul   sizeInBytes = texture_size(texImage);
34274cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
34287d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   if (!texImage->Data) {
34297d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
34307d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul      return;
34317d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   }
34328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
3433e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
3434e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing, "glTexImage3D");
34356b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   if (!pixels) {
34366b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul      /* Note: we check for a NULL image pointer here, _after_ we allocated
34376b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       * memory for the texture.  That's what the GL spec calls for.
34386b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul       */
343989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
34406b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   }
34416b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul   else {
3442b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
3443b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
3444b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3445b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3446b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         0, 0, 0,  /* dstX/Y/Zoffset */
3447b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3448b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3449b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, depth,
3450b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
3453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
3455f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul
345671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
34578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
34588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
346389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D()
346489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D().
34658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
34668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
34678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,
34688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint width,
34698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
34708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
34718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
34728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
34738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
3474b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
3475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
3476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage1D");
34777a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
34787a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
34797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
3481b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul      const GLint dstRowStride = 0;
3482b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
3483b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3484b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3485b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, 0, 0,  /* offsets */
3486b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3487b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3488b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, 1, 1,
3489b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
3492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
34943893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
349571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
34968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
34978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
34988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
349989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
350189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D()
350289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D().
35038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
35048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
35058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,
35068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset,
35078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height,
35088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
35098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
35108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
35118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
35128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
3513b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
351471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
3515e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        pixels, packing, "glTexSubImage2D");
35167a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!pixels)
35177a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
35187a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
3520b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
3521b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
3522b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3523b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3524b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, yoffset, 0,
3525b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3526b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3527b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, 1,
3528b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
3531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
35333893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
353471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
35358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
35368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
35398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D().
354089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D().
35418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
35428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
35438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,
35448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint xoffset, GLint yoffset, GLint zoffset,
35458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLint width, GLint height, GLint depth,
35468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          GLenum format, GLenum type, const void *pixels,
35478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          const struct gl_pixelstore_attrib *packing,
35488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_object *texObj,
35498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                          struct gl_texture_image *texImage)
35508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
3551b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
3552e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
3553e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        type, pixels, packing,
3554e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        "glTexSubImage3D");
3555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!pixels)
3556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      return;
3557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
3558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   {
3559b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLint dstRowStride = texture_row_stride(texImage);
3560b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
3561b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->TexFormat,
3562b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->Data,
3563b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         xoffset, yoffset, zoffset,
3564b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         dstRowStride,
3565b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         texImage->ImageOffsets,
3566b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         width, height, depth,
3567b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul                                         format, type, pixels, packing);
3568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      if (!success) {
3569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
3570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      }
3571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   }
35728f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
357371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, packing);
35748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
35758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35772aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/*
35788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D()
35798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
35808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
35818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage1d(GLcontext *ctx, GLenum target, GLint level,
35828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
35838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint border,
35848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
35858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
35868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
35878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
358889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
3589a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
3590a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
3591a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
3592a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) border;
3593a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
3594a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
3595a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
35968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
35978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
35998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
3600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/**
36018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D()
36028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
36038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
36048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,
36058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
36068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint border,
36078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
36088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
36098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
36108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
3611a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) border;
3612a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul
361389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* This is pretty simple, basically just do a memcpy without worrying
361489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul    * about the usual image unpacking or image transfer operations.
36158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul    */
361689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texObj);
361789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage);
361889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Width > 0);
361989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Height > 0);
362089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Depth == 1);
362189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
362289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
362389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* allocate storage */
36244cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul   texImage->Data = _mesa_alloc_texmemory(imageSize);
362589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   if (!texImage->Data) {
362689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
362789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      return;
362889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
362989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3630e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
3631e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
3632e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexImage2D");
36337a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
36347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
36357a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
363689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* copy the data */
363789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   MEMCPY(texImage->Data, data, imageSize);
36388f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
363971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
36408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
36418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
36428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
36438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
36448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/*
36458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D()
36468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */
36478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid
36488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage3d(GLcontext *ctx, GLenum target, GLint level,
36498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint internalFormat,
36508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint width, GLint height, GLint depth,
36518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLint border,
36528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  GLsizei imageSize, const GLvoid *data,
36538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_object *texObj,
36548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul                                  struct gl_texture_image *texImage)
36558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{
365689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* this space intentionally left blank */
3657a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
3658a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
3659a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) internalFormat;
3660a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
3661a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) border;
3662a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
3663a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
3664a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
36658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul}
36668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
36678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
36688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
366989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
367089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D()
3671e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */
3672e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid
367389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage1d(GLcontext *ctx, GLenum target,
367489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
367589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLsizei width,
367689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
367789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
367889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
367989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
3680e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{
36815999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 1D texture formats yet */
3682a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
3683a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
3684a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) width;
3685a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
3686a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
3687a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
3688a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
3689e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul}
3690e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
3691e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul
369289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
369389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D()
369489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
369589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
369689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage2d(GLcontext *ctx, GLenum target,
369789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint level,
369889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLint xoffset, GLint yoffset,
369989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei width, GLsizei height,
370089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLenum format,
370189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     GLsizei imageSize, const GLvoid *data,
370289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_object *texObj,
370389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                     struct gl_texture_image *texImage)
370489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
370589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint bytesPerRow, destRowStride, srcRowStride;
370689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLint i, rows;
370789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLubyte *dest;
370889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   const GLubyte *src;
37091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul   const gl_format texFormat = texImage->TexFormat;
3710bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   const GLint destWidth = texImage->Width;
3711d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   GLuint bw, bh;
37125999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
3713d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   _mesa_get_format_block_size(texFormat, &bw, &bh);
37145999c5b620236fb6a996cf56759aec31f01c126bBrian Paul
3715d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   (void) level;
3716a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
371789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
371889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   /* these should have been caught sooner */
3719d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((width % bw) == 0 || width == 2 || width == 1);
3720d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((height % bh) == 0 || height == 2 || height == 1);
3721d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((xoffset % bw) == 0);
3722d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   ASSERT((yoffset % bh) == 0);
372389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3724b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul   /* get pointer to src pixels (may be in a pbo which we'll map here) */
3725e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
3726e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 &ctx->Unpack,
3727e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                 "glCompressedTexSubImage2D");
37287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   if (!data)
37297a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul      return;
37307a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul
37312594168e9f3cdc4ac53c925486491167837cda30Brian Paul   srcRowStride = _mesa_format_row_stride(texFormat, width);
373289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   src = (const GLubyte *) data;
373389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
37342594168e9f3cdc4ac53c925486491167837cda30Brian Paul   destRowStride = _mesa_format_row_stride(texFormat, destWidth);
373589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
3736bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul                                         texFormat, destWidth,
3737a5467697336f201abee19cba1521be80e5c87d3bBrian Paul                                         (GLubyte *) texImage->Data);
373889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3739bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   bytesPerRow = srcRowStride;  /* bytes per row of blocks */
3740d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul   rows = height / bh;  /* rows in blocks */
374189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
3742bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul   /* copy rows of blocks */
374389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   for (i = 0; i < rows; i++) {
374489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      MEMCPY(dest, src, bytesPerRow);
374589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      dest += destRowStride;
374689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul      src += srcRowStride;
374789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   }
37488f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul
374971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
375089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
375189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
375289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul
375389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**
375489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D()
375589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */
375689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid
375789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage3d(GLcontext *ctx, GLenum target,
375889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint level,
375989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLint xoffset, GLint yoffset, GLint zoffset,
376089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei width, GLsizei height, GLsizei depth,
376189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLenum format,
376289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                GLsizei imageSize, const GLvoid *data,
376389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_object *texObj,
376489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul                                struct gl_texture_image *texImage)
376589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{
37665999c5b620236fb6a996cf56759aec31f01c126bBrian Paul   /* there are no compressed 3D texture formats yet */
3767a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) ctx;
3768a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) target; (void) level;
3769a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) xoffset; (void) yoffset; (void) zoffset;
3770a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) width; (void) height; (void) depth;
3771a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) format;
3772a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) imageSize; (void) data;
3773a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texObj;
3774a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul   (void) texImage;
377589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul}
3776