1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (c) 2008-2009  VMware, Inc.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Brian Paul
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The GL texture image functions in teximage.c basically just do
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * error checking and data structure allocation.  They in turn call
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * device driver functions which actually copy/convert/store the user's
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture image data.
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * However, most device drivers will be able to use the fallback functions
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in this file.  That is, most drivers will have the following bit of
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * code:
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   ctx->Driver.TexImage = _mesa_store_teximage;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   ctx->Driver.TexSubImage = _mesa_store_texsubimage;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   etc...
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image processing is actually kind of complicated.  We have to do:
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Format/type conversions
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    pixel unpacking
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    pixel transfer (scale, bais, lookup, etc)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These functions can handle most everything, including processing full
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * images and sub-images.
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h"
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "format_pack.h"
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h"
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h"
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mipmap.h"
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h"
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack.h"
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pbo.h"
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h"
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_fxt1.h"
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_rgtc.h"
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_s3tc.h"
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_etc.h"
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "teximage.h"
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texstore.h"
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h"
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h"
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum {
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ZERO = 4,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ONE = 5
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image storage function.
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return GL_TRUE if the given image format is one that be converted
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to another format by swizzling.
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcan_swizzle(GLenum logicalBaseFormat)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (logicalBaseFormat) {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA:
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED:
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR:
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA:
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ABGR_EXT:
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG:
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_LUMINANCE = 0,
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_ALPHA,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_INTENSITY,
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_LUMINANCE_ALPHA,
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_RGB,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_RGBA,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_RED,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_GREEN,
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_BLUE,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_BGR,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_BGRA,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_ABGR,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IDX_RG,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MAX_IDX
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte format_idx;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte to_rgba[6];
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte from_rgba[6];
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} mappings[MAX_IDX] =
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_LUMINANCE,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0,0,0,ONE),
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(0)
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_ALPHA,
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(ZERO, ZERO, ZERO, 0),
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(3)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_INTENSITY,
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0, 0, 0, 0),
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(0),
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_LUMINANCE_ALPHA,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0,0,0,1),
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP2(0,3)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_RGB,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0,1,2,ONE),
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP3(0,1,2)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_RGBA,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0,1,2,3),
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0,1,2,3),
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_RED,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0, ZERO, ZERO, ONE),
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(0),
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_GREEN,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(ZERO, 0, ZERO, ONE),
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(1),
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_BLUE,
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(ZERO, ZERO, 0, ONE),
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP1(2),
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_BGR,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(2,1,0,ONE),
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP3(2,1,0)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_BGRA,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(2,1,0,3),
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(2,1,0,3)
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_ABGR,
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(3,2,1,0),
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(3,2,1,0)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IDX_RG,
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP4(0, 1, ZERO, ONE),
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MAP2(0, 1)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a GL image format enum to an IDX_* value (see above).
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_map_idx(GLenum value)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (value) {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE: return IDX_LUMINANCE;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA: return IDX_ALPHA;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY: return IDX_INTENSITY;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB: return IDX_RGB;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA: return IDX_RGBA;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED: return IDX_RED;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN: return IDX_GREEN;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE: return IDX_BLUE;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR: return IDX_BGR;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA: return IDX_BGRA;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ABGR_EXT: return IDX_ABGR;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG: return IDX_RG;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "Unexpected inFormat");
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When promoting texture formats (see below) we need to compute the
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping of dest components back to source components.
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function does that.
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param inFormat  the incoming format of the texture
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param outFormat  the final texture format
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return map[6]  a full 6-component map
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_component_mapping(GLenum inFormat, GLenum outFormat,
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLubyte *map)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int inFmt = get_map_idx(inFormat);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int outFmt = get_map_idx(outFormat);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map[i] = in2rgba[rgba2out[i]];
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map[ZERO] = ZERO;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map[ONE] = ONE;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[0],
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[1],
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[2],
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[3],
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[4],
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map[5]);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make a temporary (color) texture image with GLfloat components.
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply all needed pixel unpacking and pixel transfer operations.
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Suppose the user specifies GL_LUMINANCE as the internal texture format
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but the graphics hardware doesn't support luminance textures.  So, we might
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use an RGB hardware format instead.
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx  the rendering context
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dims  image dimensions: 1, 2 or 3
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param logicalBaseFormat  basic texture derived from the user's
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    internal texture format value
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param textureBaseFormat  the actual basic format of the texture
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcWidth  source image width
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcHeight  source image height
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcDepth  source image depth
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcFormat  source image format
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcType  source image type
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcAddr  source image address
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcPacking  source image pixel packing
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return resulting image with format = textureBaseFormat and type = GLfloat.
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLfloat *
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLenum logicalBaseFormat,
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLenum textureBaseFormat,
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLenum srcFormat, GLenum srcType,
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const GLvoid *srcAddr,
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const struct gl_pixelstore_attrib *srcPacking,
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLbitfield transferOps)
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *tempImage;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(logicalBaseFormat);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcStride =
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat *dst;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img, row;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dims >= 1 && dims <= 3);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(logicalBaseFormat == GL_RGBA ||
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RGB ||
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RG ||
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RED ||
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE ||
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_ALPHA ||
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_INTENSITY ||
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_DEPTH_COMPONENT);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(textureBaseFormat == GL_RGBA ||
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RGB ||
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RG ||
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RED ||
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE_ALPHA ||
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE ||
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_ALPHA ||
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_INTENSITY ||
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_DEPTH_COMPONENT);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  * components * sizeof(GLfloat));
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = tempImage;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (img = 0; img < srcDepth; img++) {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 srcWidth, srcHeight,
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 srcFormat, srcType,
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 img, 0, 0);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       dst, srcFormat, srcType, src,
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       srcPacking, transferOps);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dst += srcWidth * components;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 src += srcStride;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (logicalBaseFormat != textureBaseFormat) {
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* more work */
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat *newImage;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i, n;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte map[6];
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             textureBaseFormat == GL_LUMINANCE_ALPHA);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The actual texture format should have at least as many components
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * as the logical texture format.
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(texComponents >= logComponents);
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          * texComponents * sizeof(GLfloat));
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!newImage) {
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(tempImage);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      n = srcWidth * srcHeight * srcDepth;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint k;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < texComponents; k++) {
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = map[k];
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (j == ZERO)
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 0.0F;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (j == ONE)
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 1.0F;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(tempImage);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tempImage = newImage;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return tempImage;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make temporary image with uint pixel values.  Used for unsigned
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * integer-valued textures.
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint *
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmake_temp_uint_image(struct gl_context *ctx, GLuint dims,
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum logicalBaseFormat,
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum textureBaseFormat,
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum srcFormat, GLenum srcType,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const GLvoid *srcAddr,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct gl_pixelstore_attrib *srcPacking)
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *tempImage;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(logicalBaseFormat);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcStride =
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *dst;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img, row;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dims >= 1 && dims <= 3);
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(logicalBaseFormat == GL_RGBA ||
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RGB ||
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RG ||
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RED ||
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE ||
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_INTENSITY ||
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_ALPHA);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(textureBaseFormat == GL_RGBA ||
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RGB ||
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RG ||
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RED ||
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE_ALPHA ||
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE ||
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_INTENSITY ||
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_ALPHA);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 * components * sizeof(GLuint));
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = tempImage;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (img = 0; img < srcDepth; img++) {
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 srcWidth, srcHeight,
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 srcFormat, srcType,
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 img, 0, 0);
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      dst, srcFormat, srcType, src,
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      srcPacking);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dst += srcWidth * components;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 src += srcStride;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (logicalBaseFormat != textureBaseFormat) {
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* more work */
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *newImage;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i, n;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte map[6];
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             textureBaseFormat == GL_LUMINANCE_ALPHA);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The actual texture format should have at least as many components
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * as the logical texture format.
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(texComponents >= logComponents);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   * texComponents * sizeof(GLuint));
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!newImage) {
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(tempImage);
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      n = srcWidth * srcHeight * srcDepth;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint k;
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < texComponents; k++) {
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = map[k];
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (j == ZERO)
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 0;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (j == ONE)
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 1;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(tempImage);
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tempImage = newImage;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return tempImage;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make a temporary (color) texture image with GLubyte components.
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply all needed pixel unpacking and pixel transfer operations.
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Suppose the user specifies GL_LUMINANCE as the internal texture format
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but the graphics hardware doesn't support luminance textures.  So, we might
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use an RGB hardware format instead.
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx  the rendering context
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dims  image dimensions: 1, 2 or 3
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param logicalBaseFormat  basic texture derived from the user's
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    internal texture format value
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param textureBaseFormat  the actual basic format of the texture
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcWidth  source image width
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcHeight  source image height
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcDepth  source image depth
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcFormat  source image format
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcType  source image type
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcAddr  source image address
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcPacking  source image pixel packing
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return resulting image with format = textureBaseFormat and type = GLubyte.
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLubyte *
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLenum logicalBaseFormat,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLenum textureBaseFormat,
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLint srcWidth, GLint srcHeight, GLint srcDepth,
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLenum srcFormat, GLenum srcType,
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const GLvoid *srcAddr,
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const struct gl_pixelstore_attrib *srcPacking)
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint transferOps = ctx->_ImageTransferState;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(logicalBaseFormat);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img, row;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *tempImage, *dst;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dims >= 1 && dims <= 3);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(logicalBaseFormat == GL_RGBA ||
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RGB ||
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RG ||
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_RED ||
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_LUMINANCE ||
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_ALPHA ||
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          logicalBaseFormat == GL_INTENSITY);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(textureBaseFormat == GL_RGBA ||
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RGB ||
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RG ||
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_RED ||
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE_ALPHA ||
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_LUMINANCE ||
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_ALPHA ||
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          textureBaseFormat == GL_INTENSITY);
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* unpack and transfer the source image */
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       * components * sizeof(GLubyte));
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage) {
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst = tempImage;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (img = 0; img < srcDepth; img++) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcStride =
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src =
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               srcWidth, srcHeight,
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               srcFormat, srcType,
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               img, 0, 0);
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       srcFormat, srcType, src, srcPacking,
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       transferOps);
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += srcWidth * components;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcStride;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (logicalBaseFormat != textureBaseFormat) {
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* one more conversion step */
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *newImage;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i, n;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte map[6];
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             textureBaseFormat == GL_LUMINANCE_ALPHA);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The actual texture format should have at least as many components
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * as the logical texture format.
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(texComponents >= logComponents);
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         * texComponents * sizeof(GLubyte));
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!newImage) {
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(tempImage);
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      n = srcWidth * srcHeight * srcDepth;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint k;
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < texComponents; k++) {
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = map[k];
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (j == ZERO)
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 0;
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (j == ONE)
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = 255;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(tempImage);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tempImage = newImage;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return tempImage;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy GLubyte pixels from <src> to <dst> with swizzling.
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dst  destination pixels
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dstComponents  number of color components in destination pixels
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param src  source pixels
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcComponents  number of color components in source pixels
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param map  the swizzle mapping.  map[X] says where to find the X component
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *             in the source image's pixels.  For example, if the source image
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *             is GL_BGRA and X = red, map[0] yields 2.
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param count  number of pixels to copy/swizzle.
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src,
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLuint srcComponents, const GLubyte *map, GLuint count)
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                              \
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;                                      \
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < count; i++) {                  \
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLuint j;                                   \
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (srcComps == 4) {                        \
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4UBV(tmp, src);                     \
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }                                           \
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {                                      \
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (j = 0; j < srcComps; j++) {         \
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               tmp[j] = src[j];                      \
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }                                        \
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }                                           \
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcComps;                            \
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (j = 0; j < dstComps; j++) {            \
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst[j] = tmp[map[j]];                    \
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }                                           \
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += dstComps;                            \
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }                                              \
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (0)
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte tmp[6];
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tmp[ZERO] = 0x0;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tmp[ONE] = 0xff;
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcComponents <= 4);
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstComponents <= 4);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dstComponents) {
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 4:
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (srcComponents) {
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 4, 4);
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 4, 3);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 4, 2);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 4, 1);
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ;
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 3:
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (srcComponents) {
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 3, 4);
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 3, 3);
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 3, 2);
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 3, 1);
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ;
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (srcComponents) {
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 2, 4);
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 2, 3);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 2, 2);
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 2, 1);
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (srcComponents) {
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 1, 4);
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 1, 3);
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 1, 2);
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SWZ_CPY(dst, src, count, 1, 1);
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ;
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ;
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SWZ_CPY
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping array depending on endianness.
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte *
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtype_mapping( GLenum srcType )
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (srcType) {
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return map_identity;
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_little_endian() ? map_3210 : map_identity;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_little_endian() ? map_identity : map_3210;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping array depending on pixelstore byte swapping state.
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte *
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbyteswap_mapping( GLboolean swapBytes,
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  GLenum srcType )
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!swapBytes)
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return map_identity;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (srcType) {
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return map_identity;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return map_3210;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Transfer a GLubyte texture image with component swizzling.
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_swizzle_ubyte_image(struct gl_context *ctx,
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLuint dimensions,
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum srcFormat,
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum srcType,
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum baseInternalFormat,
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  const GLubyte *rgba2dst,
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLuint dstComponents,
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLint dstRowStride,
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLubyte **dstSlices,
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  const GLvoid *srcAddr,
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  const struct gl_pixelstore_attrib *srcPacking )
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint srcComponents = _mesa_components_in_format(srcFormat);
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *srctype2ubyte, *swap;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte map[4], src2base[6], base2rgba[6];
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcRowStride =
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_image_row_stride(srcPacking, srcWidth,
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcFormat, GL_UNSIGNED_BYTE);
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcImageStride
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GL_UNSIGNED_BYTE);
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *srcImage
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              srcWidth, srcHeight, srcFormat,
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              GL_UNSIGNED_BYTE, 0, 0, 0);
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * correctly deal with RGBA->RGB->RGBA conversions where the final
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * A value must be 0xff regardless of the incoming alpha values.
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srctype2ubyte = type_mapping(srcType);
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++)
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcComponents == dstComponents &&
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcRowStride == dstRowStride &&
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcRowStride == srcWidth * srcComponents &&
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dimensions < 3) {
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 1 and 2D images only */
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *dstImage = dstSlices[0];
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map,
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   srcWidth * srcHeight);
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *srcRow = srcImage;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcImage += srcImageStride;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Teximage storage routine for when a simple memcpy will do.
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No pixel transfer operations or special texel encodings allowed.
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1D, 2D and 3D images supported.
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmemcpy_texture(struct gl_context *ctx,
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLuint dimensions,
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               gl_format dstFormat,
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint dstRowStride,
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLubyte **dstSlices,
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint srcWidth, GLint srcHeight, GLint srcDepth,
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLenum srcFormat, GLenum srcType,
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const GLvoid *srcAddr,
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const struct gl_pixelstore_attrib *srcPacking)
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcFormat, srcType);
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      srcWidth, srcHeight, srcFormat, srcType);
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint bytesPerRow = srcWidth * texelBytes;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dstRowStride == srcRowStride &&
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dstRowStride == bytesPerRow) {
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* memcpy image by image */
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstImage = dstSlices[img];
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(dstImage, srcImage, bytesPerRow * srcHeight);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcImage += srcImageStride;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* memcpy row by row */
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *srcRow = srcImage;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            memcpy(dstRow, srcRow, bytesPerRow);
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcImage += srcImageStride;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * General-case function for storing a color texture images with
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components that can be represented with ubytes.  Example destination
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565.
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstore_ubyte_texture(TEXSTORE_PARAMS)
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte);
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *tempImage, *src;
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img;
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           baseInternalFormat,
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           GL_RGBA,
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcWidth, srcHeight, srcDepth,
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcFormat, srcType, srcAddr,
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcPacking);
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tempImage)
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src = tempImage;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (img = 0; img < srcDepth; img++) {
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight,
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 src, srcRowStride,
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstSlices[img], dstRowStride);
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src += srcHeight * srcRowStride;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(tempImage);
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 32-bit integer or float depth component texture image.
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z32(TEXSTORE_PARAMS)
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffffffff;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum dstType;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dims;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_Z32 ||
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_Z32_FLOAT);
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLuint));
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dstFormat == MESA_FORMAT_Z32)
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstType = GL_UNSIGNED_INT;
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstType = GL_FLOAT;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Pixel.DepthScale == 1.0f &&
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Pixel.DepthBias == 0.0f &&
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_DEPTH_COMPONENT &&
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcFormat == GL_DEPTH_COMPONENT &&
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == dstType) {
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_unpack_depth_span(ctx, srcWidth,
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    dstType, dstRow,
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    depthScale, srcType, src, srcPacking);
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 24-bit integer depth component texture image.
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffffff;
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dims;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_unpack_depth_span(ctx, srcWidth,
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    depthScale, srcType, src, srcPacking);
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 24-bit integer depth component texture image.
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffffff;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dims;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dst = (GLuint *) dstRow;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_unpack_depth_span(ctx, srcWidth,
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    GL_UNSIGNED_INT, dst,
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    depthScale, srcType, src, srcPacking);
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < srcWidth; i++)
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[i] <<= 8;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 16-bit integer depth component texture image.
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z16(TEXSTORE_PARAMS)
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffff;
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dims;
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_Z16);
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLushort));
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Pixel.DepthScale == 1.0f &&
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Pixel.DepthBias == 0.0f &&
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_DEPTH_COMPONENT &&
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcFormat == GL_DEPTH_COMPONENT &&
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_SHORT) {
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const GLvoid *src = _mesa_image_address(dims, srcPacking,
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLushort *dst16 = (GLushort *) dstRow;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_unpack_depth_span(ctx, srcWidth,
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    GL_UNSIGNED_SHORT, dst16, depthScale,
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    srcType, src, srcPacking);
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store an rgb565 or rgb565_rev texture image.
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb565(TEXSTORE_PARAMS)
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB565_REV);
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGB &&
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            baseInternalFormat == GL_RGB &&
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_RGB &&
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE &&
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dims == 2) {
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* do optimized tex store */
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcRowStride =
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src = (const GLubyte *)
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcFormat, srcType, 0, 0, 0);
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *dst = dstSlices[0];
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint row, col;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *srcUB = (const GLubyte *) src;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLushort *dstUS = (GLushort *) dst;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* check for byteswapped format */
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dstFormat == MESA_FORMAT_RGB565) {
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               srcUB += 3;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               srcUB += 3;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += dstRowStride;
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcRowStride;
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA8888_REV ||
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBX8888 ||
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBX8888_REV);
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (srcType == GL_UNSIGNED_BYTE ||
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 ||
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            dstFormat == MESA_FORMAT_RGBX8888)) ||
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV ||
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                     dstFormat == MESA_FORMAT_RGBX8888_REV))) {
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[3] = 0;
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[2] = 1;
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 2;
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 3;
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[3] = 3;
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[2] = 2;
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 1;
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 0;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 4,
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb8888(TEXSTORE_PARAMS)
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ARGB8888_REV ||
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_XRGB8888 ||
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_XRGB8888_REV );
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path (big endian) */
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (dstFormat == MESA_FORMAT_ARGB8888 ||
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             dstFormat == MESA_FORMAT_XRGB8888) &&
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_RGB &&
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (baseInternalFormat == GL_RGBA ||
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     baseInternalFormat == GL_RGB) &&
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE) {
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int img, row, col;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLint srcRowStride =
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *d4 = (GLuint *) dstRow;
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               d4[col] = PACK_COLOR_8888(0xff,
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 3 + RCOMP],
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 3 + GCOMP],
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 3 + BCOMP]);
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstFormat == MESA_FORMAT_ARGB8888 &&
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_LUMINANCE_ALPHA &&
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            baseInternalFormat == GL_RGBA &&
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE) {
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* special case of storing LA -> ARGB8888 */
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int img, row, col;
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcRowStride =
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *srcRow = (const GLubyte *)
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_image_address(dims, srcPacking, srcAddr, srcWidth,
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                srcHeight, srcFormat, srcType, img, 0, 0);
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *d4 = (GLuint *) dstRow;
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLubyte l = srcRow[col * 2 + 0], a = srcRow[col * 2 + 1];
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               d4[col] = PACK_COLOR_8888(a, l, l, l);
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstFormat == MESA_FORMAT_ARGB8888 &&
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_RGBA &&
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    baseInternalFormat == GL_RGBA &&
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE) {
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* same as above case, but src data has alpha too */
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* For some reason, streaming copies to write-combined regions
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * are extremely sensitive to the characteristics of how the
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * source data is retrieved.  By reordering the source reads to
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * be in-order, the speed of this operation increases by half.
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Strangely the same isn't required for the RGB path, above.
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLint srcRowStride =
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *d4 = (GLuint *) dstRow;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 4 + RCOMP],
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 4 + GCOMP],
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcRow[col * 4 + BCOMP]);
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (srcType == GL_UNSIGNED_BYTE ||
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[3] = 3;		/* alpha */
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[2] = 0;		/* red */
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 1;		/* green */
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 2;		/* blue */
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[3] = 2;
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[2] = 1;
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 0;
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 3;
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 4,
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride,
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                dstSlices,
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb888(TEXSTORE_PARAMS)
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGB888);
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGB &&
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_RGBA &&
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE) {
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* extract RGB from RGBA */
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLint srcRowStride =
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    srcType == GL_UNSIGNED_BYTE &&
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[0] = 2;
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[1] = 1;
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[2] = 0;
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[3] = ONE;		/* ? */
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 3,
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_bgr888(TEXSTORE_PARAMS)
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_BGR888);
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 3);
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGB &&
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            !srcPacking->SwapBytes &&
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_RGBA &&
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcType == GL_UNSIGNED_BYTE) {
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* extract BGR from RGBA */
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int img, row, col;
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLint srcRowStride =
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcRowStride;
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    srcType == GL_UNSIGNED_BYTE &&
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[0] = 0;
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[1] = 1;
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[2] = 2;
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[3] = ONE;		/* ? */
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 3,
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb4444(TEXSTORE_PARAMS)
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ARGB4444_REV);
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb1555(TEXSTORE_PARAMS)
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ARGB1555_REV);
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (baseInternalFormat == GL_RGBA) {
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (row = 0; row < srcHeight; row++) {
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLuint *dstUI = (GLuint *) dstRow;
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort a,r,g,b;
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow += dstRowStride;
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else if (baseInternalFormat == GL_RGB) {
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (row = 0; row < srcHeight; row++) {
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLuint *dstUI = (GLuint *) dstRow;
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort r,g,b;
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow += dstRowStride;
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else {
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(0);
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm44(TEXSTORE_PARAMS)
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_AL44);
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking);
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src = tempImage;
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLubyte *dstUS = (GLubyte *) dstRow;
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* src[0] is luminance, src[1] is alpha */
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col] = PACK_COLOR_44( src[1],
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           src[0] );
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 2;
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm88(TEXSTORE_PARAMS)
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_AL88_REV ||
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_GR88 ||
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG88);
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((dstFormat == MESA_FORMAT_AL88 &&
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcFormat == GL_LUMINANCE_ALPHA) ||
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (dstFormat == MESA_FORMAT_GR88 &&
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         baseInternalFormat == srcFormat)) &&
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_BYTE &&
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    littleEndian &&
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    srcType == GL_UNSIGNED_BYTE &&
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[0] = 0;
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[1] = 3;
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[0] = 3;
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[1] = 0;
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ((littleEndian && dstFormat == MESA_FORMAT_GR88) ||
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     (!littleEndian && dstFormat == MESA_FORMAT_RG88)) {
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[0] = 0;
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[1] = 1;
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[0] = 1;
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dstmap[1] = 0;
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[2] = ZERO;		/* ? */
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[3] = ONE;		/* ? */
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 2,
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking);
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src = tempImage;
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLushort *dstUS = (GLushort *) dstRow;
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (dstFormat == MESA_FORMAT_AL88 ||
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dstFormat == MESA_FORMAT_GR88) {
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 dstUS[col] = PACK_COLOR_88( src[1],
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             src[0] );
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 src += 2;
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  /* src[0] is luminance (or R), src[1] is alpha (or G) */
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 dstUS[col] = PACK_COLOR_88_REV( src[1],
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 src[0] );
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 src += 2;
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_AL1616_REV ||
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  dstFormat == MESA_FORMAT_RG1616 ||
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG1616_REV);
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((dstFormat == MESA_FORMAT_AL1616 &&
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         baseInternalFormat == GL_LUMINANCE_ALPHA &&
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcFormat == GL_LUMINANCE_ALPHA) ||
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (dstFormat == MESA_FORMAT_RG1616 &&
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         baseInternalFormat == srcFormat)) &&
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_SHORT &&
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstUI = (GLuint *) dstRow;
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (dstFormat == MESA_FORMAT_AL1616 ||
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dstFormat == MESA_FORMAT_RG1616) {
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  GLushort l, a;
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  dstUI[col] = PACK_COLOR_1616(a, l);
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  src += 2;
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  GLushort l, a;
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  src += 2;
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Texstore for R16, A16, L16, I16. */
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm16(TEXSTORE_PARAMS)
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R16 ||
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_A16 ||
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_L16 ||
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_I16);
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_SHORT &&
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLushort *dstUS = (GLushort *) dstRow;
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (col = 0; col < srcWidth; col++) {
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLushort r;
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       dstUS[col] = r;
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       src += 1;
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 8);
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcFormat == GL_RGBA &&
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_SHORT) {
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLushort *dstUS = (GLushort *) dstRow;
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLushort r, g, b, a;
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col*4+0] = r;
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col*4+1] = g;
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col*4+2] = b;
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUS[col*4+3] = a;
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 4;
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcFormat == GL_RGBA &&
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_SHORT) {
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * 3 or 4 components/pixel here.
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLshort *dstRowS = (GLshort *) dstRow;
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLuint c;
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  for (c = 0; c < comps; c++) {
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLshort p;
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowS[col * comps + c] = p;
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow += dstRowStride;
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 4 * srcWidth;
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLuint c;
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  for (c = 0; c < comps; c++) {
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLshort p;
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowS[col * comps + c] = p;
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow += dstRowStride;
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 3 * srcWidth;
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb332(TEXSTORE_PARAMS)
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGB332);
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGB &&
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return store_ubyte_texture(ctx, dims, baseInternalFormat,
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 dstFormat, dstRowStride, dstSlices,
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcWidth, srcHeight, srcDepth,
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 srcFormat, srcType, srcAddr, srcPacking);
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm8(TEXSTORE_PARAMS)
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_A8 ||
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_L8 ||
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_I8 ||
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_R8);
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_BYTE) {
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx->_ImageTransferState &&
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    srcType == GL_UNSIGNED_BYTE &&
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(baseInternalFormat) &&
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    can_swizzle(srcFormat)) {
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dstFormat == MESA_FORMAT_A8) {
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 3;
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 0;
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[1] = ZERO;		/* ? */
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[2] = ZERO;		/* ? */
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[3] = ONE;		/* ? */
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcFormat,
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcType,
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				baseInternalFormat,
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 1,
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking);
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src = tempImage;
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col] = src[col];
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth;
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx; (void) dims; (void) baseInternalFormat;
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (dstFormat == MESA_FORMAT_YCBCR_REV));
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat == GL_YCBCR_MESA);
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* always just memcpy since no pixel transfer ops apply */
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy_texture(ctx, dims,
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstFormat,
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstRowStride, dstSlices,
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcAddr, srcPacking);
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check if we need byte swapping */
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX the logic here _might_ be wrong */
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcPacking->SwapBytes ^
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !littleEndian) {
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_swap2((GLushort *) dstRow, srcWidth);
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_dudv8(TEXSTORE_PARAMS)
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texelBytes == 2);
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (srcFormat == GL_DUDV_ATI));
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_DUDV_ATI);
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (srcType == GL_BYTE) {
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte dstmap[4];
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dstmap - how to swizzle from RGBA to dst format:
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (littleEndian) {
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 0;
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 3;
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[0] = 3;
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstmap[1] = 0;
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[2] = ZERO;		/* ? */
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstmap[3] = ONE;		/* ? */
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_swizzle_ubyte_image(ctx, dims,
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GL_LUMINANCE_ALPHA, /* hack */
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GL_UNSIGNED_BYTE, /* hack */
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GL_LUMINANCE_ALPHA, /* hack */
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstmap, 2,
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstRowStride, dstSlices,
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcWidth, srcHeight, srcDepth, srcAddr,
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				srcPacking);
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path - note this is defined for 2d textures only */
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint components = _mesa_components_in_format(baseInternalFormat);
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcFormat, srcType);
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLbyte *tempImage, *dst, *src;
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint row;
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          * components * sizeof(GLbyte));
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcWidth, srcHeight,
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           srcFormat, srcType,
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           0, 0, 0);
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst = tempImage;
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     dst, srcFormat, srcType, src,
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     srcPacking, 0);
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += srcWidth * components;
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcStride;
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src = tempImage;
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst = (GLbyte *) dstSlices[0];
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(dst, src, srcWidth * texelBytes);
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += dstRowStride;
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcWidth * texelBytes;
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in a signed normalized 8-bit format.
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm8(TEXSTORE_PARAMS)
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_L8 ||
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_I8 ||
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_R8);
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_BYTE) {
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth;
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in a signed normalized two-channel 16-bit format.
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm88(TEXSTORE_PARAMS)
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_BYTE &&
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLbyte *dst = dstRow;
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 2;
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst += 2;
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Texstore for signed R16, A16, L16, I16. */
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm16(TEXSTORE_PARAMS)
2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_A16 ||
2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_L16 ||
2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_I16);
2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_SHORT &&
2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLshort *dstUS = (GLshort *) dstRow;
2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (col = 0; col < srcWidth; col++) {
2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLushort r;
2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       dstUS[col] = r;
2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       src += 1;
2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean littleEndian = _mesa_little_endian();
2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_GR1616);
2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_SHORT &&
2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       littleEndian) {
2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLshort *dst = (GLshort *) dstRow;
2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLushort l, a;
2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[0] = l;
2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[1] = a;
2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src += 2;
2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst += 2;
2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *srcRow = tempImage;
2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLbyte *dst = dstRow;
2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst[0] = 127;
2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               srcRow += 3;
2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst += 4;
2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MESA_FORMAT_SIGNED_RGBA8888_REV
2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == GL_RGBA &&
2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       /* simple memcpy path */
2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *srcRow = tempImage;
2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLbyte *dstRow = (GLbyte *) dstSlices[img];
2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLbyte *dst = dstRow;
2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcRow += 4;
2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst += 4;
2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcRow += 4;
2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dst += 4;
2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a combined depth/stencil texture image.
2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffffff;
2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcRowStride
2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img, row;
2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_DEPTH_COMPONENT ||
2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_STENCIL_INDEX);
2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f &&
2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Pixel.DepthBias == 0.0f &&
2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes) {
2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple path */
2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (srcFormat == GL_DEPTH_COMPONENT ||
2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_STENCIL_INDEX) {
2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *depth = (GLuint *) malloc(srcWidth * sizeof(GLuint));
2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!depth || !stencil) {
2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(depth);
2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(stencil);
2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* In case we only upload depth we need to preserve the stencil */
2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint *dstRow = (GLuint *) dstSlices[img];
2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *src
2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcWidth, srcHeight,
2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcFormat, srcType,
2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  img, 0, 0);
2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       keepstencil = GL_TRUE;
2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       keepdepth = GL_TRUE;
2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (keepdepth == GL_FALSE)
2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       /* the 24 depth bits will be in the low position: */
2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       _mesa_unpack_depth_span(ctx, srcWidth,
2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GL_UNSIGNED_INT, /* dst type */
2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       keepstencil ? depth : dstRow, /* dst addr */
2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       depthScale,
2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       srcType, src, srcPacking);
2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (keepstencil == GL_FALSE)
2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       /* get the 8-bit stencil values */
2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       _mesa_unpack_stencil_span(ctx, srcWidth,
2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GL_UNSIGNED_BYTE, /* dst type */
2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 stencil, /* dst addr */
2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 srcType, src, srcPacking,
2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 ctx->_ImageTransferState);
2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (i = 0; i < srcWidth; i++) {
2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       if (keepstencil)
2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       else
2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcRowStride;
2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride / sizeof(GLuint);
2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(depth);
2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(stencil);
2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a combined depth/stencil texture image.
2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint depthScale = 0xffffff;
2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint srcRowStride
2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint img, row;
2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *depth;
2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *stencil;
2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_DEPTH_COMPONENT ||
2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_STENCIL_INDEX);
2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcType == GL_UNSIGNED_INT_24_8_EXT);
2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depth = (GLuint *) malloc(srcWidth * sizeof(GLuint));
2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!depth || !stencil) {
2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(depth);
2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(stencil);
2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (img = 0; img < srcDepth; img++) {
2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *dstRow = (GLuint *) dstSlices[img];
2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src
2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						srcWidth, srcHeight,
2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						srcFormat, srcType,
2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						img, 0, 0);
2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (row = 0; row < srcHeight; row++) {
2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLint i;
2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    keepstencil = GL_TRUE;
2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    keepdepth = GL_TRUE;
2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (keepdepth == GL_FALSE)
2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* the 24 depth bits will be in the low position: */
2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_unpack_depth_span(ctx, srcWidth,
2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GL_UNSIGNED_INT, /* dst type */
2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    keepstencil ? depth : dstRow, /* dst addr */
2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    depthScale,
2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    srcType, src, srcPacking);
2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (keepstencil == GL_FALSE)
2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* get the 8-bit stencil values */
2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_unpack_stencil_span(ctx, srcWidth,
2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GL_UNSIGNED_BYTE, /* dst type */
2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      stencil, /* dst addr */
2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      srcType, src, srcPacking,
2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      ctx->_ImageTransferState);
2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* merge stencil values into depth values */
2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (i = 0; i < srcWidth; i++) {
2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (keepstencil)
2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    else
2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 src += srcRowStride;
2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstRow += dstRowStride / sizeof(GLuint);
2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(depth);
2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(stencil);
2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store simple 8-bit/value stencil texture data.
2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_s8(TEXSTORE_PARAMS)
2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_S8);
2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat == GL_STENCIL_INDEX);
2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_BYTE) {
2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcRowStride
2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte));
2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!stencil)
2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte *src
2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   srcWidth, srcHeight,
2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   srcFormat, srcType,
2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   img, 0, 0);
2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* get the 8-bit stencil values */
2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_unpack_stencil_span(ctx, srcWidth,
2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      GL_UNSIGNED_BYTE, /* dst type */
2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      stencil, /* dst addr */
2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      srcType, src, srcPacking,
2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      ctx->_ImageTransferState);
2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* merge stencil values into depth values */
2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < srcWidth; i++)
2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstRow[i] = stencil[i];
2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcRowStride;
2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride / sizeof(GLubyte);
2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(stencil);
3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store an image in any of the formats:
3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_rgba_float32
3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_rgb_float32
3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_alpha_float32
3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_luminance_float32
3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_luminance_alpha_float32
3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   _mesa_texformat_intensity_float32
3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_R_FLOAT32 ||
3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_FLOAT32);
3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY ||
3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG);
3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat));
3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == baseFormat &&
3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_FLOAT) {
3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *srcRow = tempImage;
3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint bytesPerRow;
3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bytesPerRow = srcWidth * components * sizeof(GLfloat);
3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            memcpy(dstRow, srcRow, bytesPerRow);
3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcWidth * components;
3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As above, but store 16-bit floats.
3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_R_FLOAT16 ||
3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_FLOAT16);
3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY ||
3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG);
3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB));
3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes &&
3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == baseFormat &&
3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_HALF_FLOAT_ARB) {
3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *src = tempImage;
3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < srcWidth * components; i++) {
3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstTexel[i] = _mesa_float_to_half(src[i]);
3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int8 */
3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_INT8 ||
3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_INT8 ||
3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_INT8 ||
3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_INT8 ||
3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_INT8 ||
3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_INT8 ||
3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_INT8 ||
3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8);
3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte));
3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_BYTE) {
3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseInternalFormat,
3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseFormat,
3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcWidth, srcHeight, srcDepth,
3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcFormat, srcType,
3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcAddr,
3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcPacking);
3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLbyte *dstTexel = (GLbyte *) dstRow;
3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLbyte) MIN2(src[i], 0x7f);
3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLbyte) CLAMP((GLint) src[i], -0x80, 0x7f);
3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int16 */
3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_INT16 ||
3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_INT16 ||
3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_INT16 ||
3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_INT16 ||
3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_INT16 ||
3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_INT16 ||
3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_INT16 ||
3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16);
3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort));
3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_SHORT) {
3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseInternalFormat,
3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseFormat,
3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcWidth, srcHeight, srcDepth,
3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcFormat, srcType,
3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcAddr,
3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcPacking);
3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLshort *dstTexel = (GLshort *) dstRow;
3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLshort) MIN2(src[i], 0x7fff);
3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLshort)CLAMP((GLint) src[i], -0x8000, 0x7fff);
3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int32 */
3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_INT32 ||
3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_INT32 ||
3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_INT32 ||
3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_INT32 ||
3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_INT32 ||
3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_INT32 ||
3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_INT32 ||
3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32);
3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint));
3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_INT) {
3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseInternalFormat,
3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     baseFormat,
3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcWidth, srcHeight, srcDepth,
3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcFormat, srcType,
3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcAddr,
3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						     srcPacking);
3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint *dstTexel = (GLint *) dstRow;
3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLint) MIN2(src[i], 0x7fffffff);
3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLint) src[i];
3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int8 */
3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_UINT8 ||
3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_UINT8 ||
3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_UINT8 ||
3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_UINT8 ||
3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_UINT8 ||
3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_UINT8 ||
3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_UINT8 ||
3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte));
3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_BYTE) {
3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage =
3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcWidth, srcHeight, srcDepth,
3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcFormat, srcType, srcAddr, srcPacking);
3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLubyte *dstTexel = (GLubyte *) dstRow;
3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLubyte) MIN2(src[i], 0xff);
3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLubyte) CLAMP((GLint) src[i], 0, 0xff);
3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int16 */
3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_UINT16 ||
3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_UINT16 ||
3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_UINT16 ||
3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_UINT16 ||
3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_UINT16 ||
3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_UINT16 ||
3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_UINT16 ||
3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort));
3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_SHORT) {
3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage =
3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcWidth, srcHeight, srcDepth,
3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcFormat, srcType, srcAddr, srcPacking);
3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLushort *dstTexel = (GLushort *) dstRow;
3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLushort) MIN2(src[i], 0xffff);
3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              }
3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = (GLushort) CLAMP((GLint) src[i], 0, 0xffff);
3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int32 */
3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint components = _mesa_components_in_format(baseFormat);
3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R_UINT32 ||
3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RG_UINT32 ||
3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGB_UINT32 ||
3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_RGBA_UINT32 ||
3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_ALPHA_UINT32 ||
3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_INTENSITY_UINT32 ||
3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_UINT32 ||
3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGBA ||
3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RGB ||
3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RG ||
3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_RED ||
3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_ALPHA ||
3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE ||
3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_LUMINANCE_ALPHA ||
3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          baseInternalFormat == GL_INTENSITY);
3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint));
3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to integer formats.
3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!srcPacking->SwapBytes &&
3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       baseInternalFormat == srcFormat &&
3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       srcType == GL_UNSIGNED_INT) {
3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage =
3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcWidth, srcHeight, srcDepth,
3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              srcFormat, srcType, srcAddr, srcPacking);
3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstTexel = (GLuint *) dstRow;
3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint i;
3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = src[i];
3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (i = 0; i < srcWidth * components; i++) {
3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstTexel[i] = MAX2((GLint) src[i], 0);
3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcWidth * components;
3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB
3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_srgb8(TEXSTORE_PARAMS)
3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format newDstFormat;
3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean k;
3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reuse normal rgb texstore code */
3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newDstFormat = MESA_FORMAT_RGB888;
3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             newDstFormat,
3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             dstRowStride, dstSlices,
3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcWidth, srcHeight, srcDepth,
3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcFormat, srcType,
3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcAddr, srcPacking);
3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_srgba8(TEXSTORE_PARAMS)
3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format newDstFormat;
3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean k;
3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reuse normal rgba texstore code */
3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newDstFormat = MESA_FORMAT_RGBA8888;
3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               newDstFormat,
3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dstRowStride, dstSlices,
3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcWidth, srcHeight, srcDepth,
3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcFormat, srcType,
3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcAddr, srcPacking);
3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sargb8(TEXSTORE_PARAMS)
3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format newDstFormat;
3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean k;
3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reuse normal rgba texstore code */
3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newDstFormat = MESA_FORMAT_ARGB8888;
3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               newDstFormat,
3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dstRowStride, dstSlices,
3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcWidth, srcHeight, srcDepth,
3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcFormat, srcType,
3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               srcAddr, srcPacking);
3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sl8(TEXSTORE_PARAMS)
3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format newDstFormat;
3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean k;
3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SL8);
3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newDstFormat = MESA_FORMAT_L8;
3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _mesa_textore_a8 handles luminance8 too */
3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             newDstFormat,
3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             dstRowStride, dstSlices,
3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcWidth, srcHeight, srcDepth,
3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcFormat, srcType,
3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             srcAddr, srcPacking);
3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sla8(TEXSTORE_PARAMS)
3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format newDstFormat;
3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean k;
3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_SLA8);
3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reuse normal luminance/alpha texstore code */
3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newDstFormat = MESA_FORMAT_AL88;
3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      newDstFormat,
3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      dstRowStride, dstSlices,
3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      srcWidth, srcHeight, srcDepth,
3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      srcFormat, srcType,
3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      srcAddr, srcPacking);
3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* these are used only in texstore_funcs[] below */
3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_srgb8 NULL
3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_srgba8 NULL
3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sargb8 NULL
3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sl8 NULL
3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sla8 NULL
3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */
3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGB);
3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *srcRow = tempImage;
3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstUI = (GLuint*)dstRow;
3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]);
3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcWidth * 3;
3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(baseInternalFormat == GL_RGB);
3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->_ImageTransferState &&
3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseInternalFormat,
3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 baseFormat,
3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcWidth, srcHeight, srcDepth,
3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcFormat, srcType, srcAddr,
3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 srcPacking,
3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx->_ImageTransferState);
3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *srcRow = tempImage;
3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstUI = (GLuint*)dstRow;
3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (col = 0; col < srcWidth; col++) {
3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]);
3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcRow += srcWidth * 3;
3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat == GL_DEPTH_STENCIL ||
3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_DEPTH_COMPONENT ||
3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcFormat == GL_STENCIL_INDEX);
3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(srcFormat != GL_DEPTH_STENCIL ||
3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcFormat == GL_DEPTH_STENCIL &&
3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Pixel.DepthScale == 1.0f &&
3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Pixel.DepthBias == 0.0f &&
3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !srcPacking->SwapBytes) {
3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple path */
3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (srcFormat == GL_DEPTH_COMPONENT ||
3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            srcFormat == GL_STENCIL_INDEX) {
3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row;
3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint srcRowStride
3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         / sizeof(uint64_t);
3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* In case we only upload depth we need to preserve the stencil */
3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         uint64_t *dstRow = (uint64_t *) dstSlices[img];
3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const uint64_t *src
3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcWidth, srcHeight,
3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  srcFormat, srcType,
3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  img, 0, 0);
3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* The unpack functions with:
3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * only write their own dword, so the other dword (stencil
3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * or depth) is preserved. */
3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (srcFormat != GL_STENCIL_INDEX)
3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_unpack_depth_span(ctx, srcWidth,
3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       dstRow, /* dst addr */
3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       ~0U, srcType, src, srcPacking);
3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (srcFormat != GL_DEPTH_COMPONENT)
3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _mesa_unpack_stencil_span(ctx, srcWidth,
3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         dstRow, /* dst addr */
3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         srcType, src, srcPacking,
3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         ctx->_ImageTransferState);
3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src += srcRowStride;
3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride / sizeof(uint64_t);
3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT);
3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (baseInternalFormat == GL_RGBA &&
3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     baseInternalFormat,
3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     baseFormat,
3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcWidth, srcHeight,
3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcDepth, srcFormat,
3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcType, srcAddr,
3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcPacking);
3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstUI = (GLuint *) dstRow;
3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort a,r,g,b;
3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  r = MIN2(src[RCOMP], 0x3ff);
3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  g = MIN2(src[GCOMP], 0x3ff);
3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  b = MIN2(src[BCOMP], 0x3ff);
3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  a = MIN2(src[ACOMP], 0x003);
3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort a,r,g,b;
3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  a = CLAMP((GLint) src[ACOMP], 0, 0x003);
3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS)
3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(dstFormat == MESA_FORMAT_ABGR2101010_UINT);
3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (baseInternalFormat == GL_RGBA &&
3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            srcPacking->SwapBytes)) {
3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* simple memcpy path */
3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy_texture(ctx, dims,
3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstFormat,
3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     dstRowStride, dstSlices,
3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     srcAddr, srcPacking);
3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* general path */
3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *tempImage = make_temp_uint_image(ctx, dims,
3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     baseInternalFormat,
3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     baseFormat,
3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcWidth, srcHeight,
3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcDepth, srcFormat,
3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcType, srcAddr,
3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     srcPacking);
3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *src = tempImage;
3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint img, row, col;
3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!tempImage)
3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (img = 0; img < srcDepth; img++) {
3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte *dstRow = dstSlices[img];
3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (row = 0; row < srcHeight; row++) {
3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLuint *dstUI = (GLuint *) dstRow;
3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (is_unsigned) {
3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort a,r,g,b;
3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  r = MIN2(src[RCOMP], 0x3ff);
3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  g = MIN2(src[GCOMP], 0x3ff);
3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  b = MIN2(src[BCOMP], 0x3ff);
3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  a = MIN2(src[ACOMP], 0x003);
3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               for (col = 0; col < srcWidth; col++) {
3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLushort a,r,g,b;
3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  a = CLAMP((GLint) src[ACOMP], 0, 0x003);
4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  src += 4;
4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dstRow += dstRowStride;
4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free((void *) tempImage);
4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_null(TEXSTORE_PARAMS)
4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx; (void) dims;
4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) baseInternalFormat;
4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dstFormat;
4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dstRowStride; (void) dstSlices,
4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) srcWidth; (void) srcHeight; (void) srcDepth;
4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) srcFormat; (void) srcType;
4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) srcAddr;
4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) srcPacking;
4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* should never happen */
4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_problem(NULL, "_mesa_texstore_null() is called");
4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the StoreTexImageFunc pointer to store an image in the given format.
4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic StoreTexImageFunc
4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_texstore_func(gl_format format)
4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static StoreTexImageFunc table[MESA_FORMAT_COUNT];
4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static GLboolean initialized = GL_FALSE;
4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!initialized) {
4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_NONE] = _mesa_texstore_null;
4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888;
4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888;
4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888;
4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888;
4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888;
4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888;
4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888;
4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888;
4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888;
4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888;
4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565;
4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565;
4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444;
4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444;
4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551;
4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555;
4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555;
4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44;
4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88;
4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88;
4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616;
4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616;
4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332;
4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_A8] = _mesa_texstore_unorm8;
4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_A16] = _mesa_texstore_unorm16;
4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_L8] = _mesa_texstore_unorm8;
4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_L16] = _mesa_texstore_unorm16;
4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_I8] = _mesa_texstore_unorm8;
4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_I16] = _mesa_texstore_unorm16;
4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
4076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R8] = _mesa_texstore_unorm8;
4077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88;
4078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88;
4079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R16] = _mesa_texstore_unorm16;
4080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616;
4081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616;
4082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010;
4083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8;
4084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24;
4085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z16] = _mesa_texstore_z16;
4086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24;
4087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8;
4088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z32] = _mesa_texstore_z32;
4089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_S8] = _mesa_texstore_s8;
4090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8;
4091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8;
4092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8;
4093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SL8] = _mesa_texstore_sl8;
4094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8;
4095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1;
4096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1;
4097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3;
4098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5;
4099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1;
4100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1;
4101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1;
4102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1;
4103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3;
4104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5;
4105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32;
4106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16;
4107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32;
4108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16;
4109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
4110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
4111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32;
4112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16;
4113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
4114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
4115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32;
4116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16;
4117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32;
4118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16;
4119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32;
4120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16;
4121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8;
4122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8;
4123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88;
4124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888;
4125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888;
4126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888;
4127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16;
4128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616;
4129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16;
4130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16;
4131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16;
4132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1;
4133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1;
4134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2;
4135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2;
4136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1;
4137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1;
4138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2;
4139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2;
4140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8;
4141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8;
4142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8;
4143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88;
4144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8;
4145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16;
4146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16;
4147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616;
4148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16;
4149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5;
4150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
4151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32;
4152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8;
4153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
4155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
4156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
4157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8;
4158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16;
4159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32;
4160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8;
4162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16;
4163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32;
4164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8;
4165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16;
4166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32;
4167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8;
4169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16;
4170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32;
4171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8;
4172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16;
4173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32;
4174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
4176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
4177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
4178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8;
4179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16;
4180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32;
4181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8;
4183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8;
4184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8;
4185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8;
4186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16;
4187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16;
4188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16;
4189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16;
4190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32;
4191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32;
4192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32;
4193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32;
4194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8;
4196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8;
4197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8;
4198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8;
4199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16;
4200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16;
4201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16;
4202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16;
4203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32;
4204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32;
4205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32;
4206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32;
4207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint;
4209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      table[MESA_FORMAT_ABGR2101010_UINT] = _mesa_texstore_abgr2101010_uint;
4210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      initialized = GL_TRUE;
4211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(table[format]);
4214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return table[format];
4215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store user data into texture memory.
4220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via glTex[Sub]Image1/2/3D()
4221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
4223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore(TEXSTORE_PARAMS)
4224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   StoreTexImageFunc storeImage;
4226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean success;
4227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   storeImage = _mesa_get_texstore_func(dstFormat);
4229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = storeImage(ctx, dims, baseInternalFormat,
4231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        dstFormat,
4232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        dstRowStride, dstSlices,
4233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        srcWidth, srcHeight, srcDepth,
4234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        srcFormat, srcType, srcAddr, srcPacking);
4235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
4236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Normally, we'll only _write_ texel data to a texture when we map it.
4241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * But if the user is providing depth or stencil values and the texture
4242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * image is a combined depth/stencil format, we'll actually read from
4243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the texture buffer too (in order to insert the depth or stencil values.
4244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param userFormat  the user-provided image format
4245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texFormat  the destination texture format
4246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLbitfield
4248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_read_write_mode(GLenum userFormat, gl_format texFormat)
4249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT)
4251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL)
4252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
4253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
4254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
4255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function for storing 1D, 2D, 3D whole and subimages into texture
4260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * memory.
4261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The source of the image data may be user memory or a PBO.  In the later
4262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * case, we'll map the PBO, copy from it, then unmap it.
4263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
4265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstore_texsubimage(struct gl_context *ctx,
4266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct gl_texture_image *texImage,
4267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLint xoffset, GLint yoffset, GLint zoffset,
4268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLint width, GLint height, GLint depth,
4269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLenum format, GLenum type, const GLvoid *pixels,
4270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const struct gl_pixelstore_attrib *packing,
4271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const char *caller)
4272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat);
4275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLenum target = texImage->TexObject->Target;
4276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean success = GL_FALSE;
4277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint dims, slice, numSlices = 1, sliceOffset = 0;
4278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint srcImageStride = 0;
4279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *src;
4280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(xoffset + width <= texImage->Width);
4282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(yoffset + height <= texImage->Height);
4283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(zoffset + depth <= texImage->Depth);
4284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
4286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
4287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dims = 1;
4288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
4290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
4291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dims = 3;
4292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
4294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dims = 2;
4295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src = (const GLubyte *)
4299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
4300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  format, type, pixels, packing, caller);
4301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!src)
4302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* compute slice info (and do some sanity checks) */
4305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
4306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
4307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE:
4308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
4309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* one image slice, nothing special needs to be done */
4310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
4312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(height == 1);
4313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(depth == 1);
4314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(yoffset == 0);
4315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(zoffset == 0);
4316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
4318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(depth == 1);
4319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(zoffset == 0);
4320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      numSlices = height;
4321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sliceOffset = yoffset;
4322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = 1;
4323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      yoffset = 0;
4324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcImageStride = _mesa_image_row_stride(packing, width, format, type);
4325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
4327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      numSlices = depth;
4328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sliceOffset = zoffset;
4329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = 1;
4330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoffset = 0;
4331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcImageStride = _mesa_image_image_stride(packing, width, height,
4332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                format, type);
4333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
4335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we'll store 3D images as a series of slices */
4336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      numSlices = depth;
4337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sliceOffset = zoffset;
4338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcImageStride = _mesa_image_image_stride(packing, width, height,
4339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                format, type);
4340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
4341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
4342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target);
4343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(numSlices == 1 || srcImageStride != 0);
4347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (slice = 0; slice < numSlices; slice++) {
4349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *dstMap;
4350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint dstRowStride;
4351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.MapTextureImage(ctx, texImage,
4353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  slice + sliceOffset,
4354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  xoffset, yoffset, width, height,
4355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  mapMode, &dstMap, &dstRowStride);
4356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dstMap) {
4357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Note: we're only storing a 2D (or 1D) slice at a time but we need
4358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is
4359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * used for 3D images.
4360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
4361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = _mesa_texstore(ctx, dims, texImage->_BaseFormat,
4362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  texImage->TexFormat,
4363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  dstRowStride,
4364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  &dstMap,
4365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  width, height, 1,  /* w, h, d */
4366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  format, type, src, packing);
4367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset);
4369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
4370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src += srcImageStride;
4372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!success)
4374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
4375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success)
4378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
4379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unmap_teximage_pbo(ctx, packing);
4381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback code for ctx->Driver.TexImage().
4387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Basically, allocate storage for the texture image, then copy the
4388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * user's image into it.
4389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
4391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_teximage(struct gl_context *ctx,
4392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLuint dims,
4393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct gl_texture_image *texImage,
4394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum format, GLenum type, const GLvoid *pixels,
4395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct gl_pixelstore_attrib *packing)
4396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dims == 1 || dims == 2 || dims == 3);
4398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0)
4400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* allocate storage for texture data */
4403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
4404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
4405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   store_texsubimage(ctx, texImage,
4409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     0, 0, 0, texImage->Width, texImage->Height, texImage->Depth,
4410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     format, type, pixels, packing, "glTexImage");
4411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
4415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.TexSubImage().
4416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
4418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_texsubimage(struct gl_context *ctx, GLuint dims,
4419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        struct gl_texture_image *texImage,
4420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLint xoffset, GLint yoffset, GLint zoffset,
4421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLint width, GLint height, GLint depth,
4422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLenum format, GLenum type, const void *pixels,
4423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct gl_pixelstore_attrib *packing)
4424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   store_texsubimage(ctx, texImage,
4426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     xoffset, yoffset, zoffset, width, height, depth,
4427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     format, type, pixels, packing, "glTexSubImage");
4428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.CompressedTexImage()
4433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
4435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,
4436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct gl_texture_image *texImage,
4437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                GLsizei imageSize, const GLvoid *data)
4438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* only 2D compressed images are supported at this time */
4440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dims != 2) {
4441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "Unexpected glCompressedTexImage1D/3D call");
4442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This is pretty simple, because unlike the general texstore path we don't
4446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * have to worry about the usual image unpacking or image transfer
4447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * operations.
4448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
4449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texImage);
4450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texImage->Width > 0);
4451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texImage->Height > 0);
4452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(texImage->Depth == 1);
4453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* allocate storage for texture data */
4455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
4456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
4457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_store_compressed_texsubimage(ctx, dims, texImage,
4461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      0, 0, 0,
4462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      texImage->Width, texImage->Height, texImage->Depth,
4463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      texImage->TexFormat,
4464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      imageSize, data);
4465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
4469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.CompressedTexSubImage()
4470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
4471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
4472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
4473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   struct gl_texture_image *texImage,
4474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLint xoffset, GLint yoffset, GLint zoffset,
4475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLsizei width, GLsizei height, GLsizei depth,
4476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLenum format,
4477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLsizei imageSize, const GLvoid *data)
4478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint bytesPerRow, dstRowStride, srcRowStride;
4480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, rows;
4481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *dstMap;
4482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte *src;
4483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const gl_format texFormat = texImage->TexFormat;
4484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint bw, bh;
4485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dims != 2) {
4487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "Unexpected 1D/3D compressed texsubimage call");
4488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_get_format_block_size(texFormat, &bw, &bh);
4492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* get pointer to src pixels (may be in a pbo which we'll map here) */
4494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
4495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 &ctx->Unpack,
4496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 "glCompressedTexSubImage2D");
4497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!data)
4498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
4499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srcRowStride = _mesa_format_row_stride(texFormat, width);
4501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src = (const GLubyte *) data;
4502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Map dest texture buffer */
4504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.MapTextureImage(ctx, texImage, 0,
4505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               xoffset, yoffset, width, height,
4506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
4507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               &dstMap, &dstRowStride);
4508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dstMap) {
4510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bytesPerRow = srcRowStride;  /* bytes per row of blocks */
4511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rows = (height + bh - 1) / bh;  /* rows in blocks */
4512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* copy rows of blocks */
4514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < rows; i++) {
4515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(dstMap, src, bytesPerRow);
4516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dstMap += dstRowStride;
4517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += srcRowStride;
4518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
4519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
4521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
4523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
4524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
4525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
4527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4528